从零搭建RAG问答机器人,我踩过的6个坑
一、为什么写这篇?
如果你正在学RAG,大概率会遇到和我一样的坑。
最近在学AI应用开发,第一个目标就是跑通一个RAG文档问答助手。本以为照着教程一步步来就行,结果从环境配置到代码运行,一路踩坑。这篇博客记录了我遇到的所有问题、排查过程和解决方案,希望能帮你少走弯路。
二、项目背景
RAG(检索增强生成)是目前AI应用开发的核心技术之一,简单来说就是“先检索相关文档,再让大模型基于检索结果生成答案”,能有效解决大模型的幻觉问题。
技术栈: - LangChain + FAISS + Ollama + Llama 3.2 - 开发环境:Windows + PyCharm Community
三、踩坑实录
坑一:ModuleNotFoundError: No module named 'langchain.text_splitter'
现象:按照教程导入,报错找不到模块
排查问题:查了GitHub Issues,发现LangChain 1.x版本把text_splitter拆分到了独立包
解决方案:
bash
pip install langchain-text-splitters
from langchain_text_splitters import RecursiveCharacterTextSplitter
总结:老教程的代码不一定适配新版,遇到模块报错先查官方文档的版本变更
坑2:ModuleNotFoundError: No module named 'langchain.chains'
现象:同样的问题,chains模块也找不到了
解决方案:
bash
pip install langchain-classic
from langchain_classic.chains import RetrievalQA
总结:LangChain 1.x为了轻量化,很多功能被拆分到了langchain-classic,建议统一使用新包
坑3:Ollama连接不上
现象:运行代码时提示Connection refused
排查过程:先用ollama serve检查服务是否启动,再用ollama list确认模型已下载
解决方案:确保Ollama在后台运行后再运行Python脚本
坑4:依赖包安装太慢/超时
现象:pip install一直卡住或报Read timed out
解决方案:换国内镜像源
bash
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名
坑5:知识库文件夹不存在
现象:No such file or directory: './knowledge'
解决方案:在项目根目录手动创建knowledge文件夹,并放入测试文档
四、最终能跑通的代码
# 1. 导入必要的库
from langchain_community.document_loaders import TextLoader
import os
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.llms import Ollama
from langchain_classic.chains import RetrievalQA
print("=" * 50)
print("RAG 问答机器人 - 启动中...")
print("=" * 50)
# 2. 加载文档(从knowledge文件夹)
print("\n[1/5] 正在加载文档...")
documents = []
knowledge_dir = "./knowledge"
if not os.path.exists(knowledge_dir):
os.makedirs(knowledge_dir)
print(f" 提示:{knowledge_dir}文件夹不存在,已自动创建,请放入.txt文件后重新运行")
exit()
for file in os.listdir(knowledge_dir):
if file.endswith(".txt"):
loader = TextLoader(os.path.join(knowledge_dir, file), encoding="utf-8")
documents.extend(loader.load())
print(f" 加载了 {len(documents)} 个文档")
if len(documents) == 0:
print(f" 错误:没有找到任何.txt文件,请在 knowledge 文件夹下放入至少一个 txt 文件")
exit()
# 3. 切分文档(把长文档切成小段)
print("\n[2/5] 正在切分文档...")
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每段500个字符
chunk_overlap=50 # 相邻段落重叠50字符,保持语义连贯
)
chunks = text_splitter.split_documents(documents)
print(f" 切分成 {len(chunks)} 个文本片段")
# 4. 向量化并存入FAISS(把文本转成向量)
print("\n[3/5] 正在向量化(首次运行会下载模型,约400MB)...")
embeddings = OllamaEmbeddings(model="llama3.2")
vectorstore = FAISS.from_documents(chunks, embeddings)
print(" 向量化完成!")
# 5. 连接本地大模型(用Ollama)
print("\n[4/5] 正在连接大模型...")
llm = Ollama(model="llama3.2")
print(" 模型连接成功!")
# 6. 创建问答链
print("\n[5/5] 正在初始化问答系统...")
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}) # 每次检索3个相关片段
)
print(" 初始化完成!")
print("\n" + "=" * 50)
print("✅ 机器人已就绪!输入问题开始对话,输入 'exit' 退出")
print("=" * 50 + "\n")
# 7. 对话循环
while True:
question = input("你: ")
if question.lower() == 'exit':
print("再见!")
break
if question.strip() == '':
continue
print("\n🤖 思考中...")
answer = qa_chain.invoke(question)
print(f"\n🤖: {answer['result']}\n")
五、给新手的建议
1.先让代码跑起来,再理解原理——别一开始就钻牛角尖
2.用PyCharm管理项目,虚拟环境自动配置,省心很多
3.遇到报错先复制到搜索引擎/问AI,大部分问题都被别人踩过了
4.跑通后一定要写博客记录,这是把知识内化的最好方式
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)