LangChain+RAG 全链路实战:构建智能AI知识库,从基础检索到多轮对话优化(含核心代码逻辑)
在大模型时代,如何让AI“言之有据”是构建可信智能应用的关键。RAG(Retrieval-Augmented Generation) 技术通过将外部知识库与大语言模型结合,有效缓解了模型的“幻觉”问题。而 LangChain 作为领先的LLM应用开发框架,为构建RAG系统提供了强大的模块化支持。
本文将带您实战一个完整的AI知识库项目,涵盖文档加载、向量化存储、语义检索、答案生成到多轮对话管理的全链路流程,并附上关键代码片段,助您快速搭建属于自己的智能问答系统。
一、项目架构概览
本系统主要由以下模块构成:
- 数据加载与预处理
- 文本向量化与向量数据库存储
- 检索器(Retriever)
- 生成链(Generation Chain)
- 对话记忆(Memory)管理
- 完整问答链(QA Chain)
我们将使用以下技术栈:
- LangChain:核心开发框架
- OpenAI API(或本地部署模型如ChatGLM):大语言模型
- HuggingFace Embeddings:文本向量化
- Chroma:轻量级向量数据库
- Python:开发语言
二、核心代码实现
注意:以下为简化后的核心逻辑代码,实际项目需配置API密钥、处理异常等。
1. 环境准备与依赖安装
pip install langchain openai chromadb pypdf
2. 文档加载与分割
首先,加载本地PDF文档,并将其分割成适合检索的小块。
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# 加载PDF文档
loader = PyPDFLoader("knowledge_base.pdf")
pages = loader.load_and_split()
# 文本分割
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500, # 每块500字符
chunk_overlap=50, # 块间重叠50字符,保证语义连贯
)
docs = text_splitter.split_documents(pages)
print(f"共分割出 {len(docs)} 个文本块")
3. 文本向量化与向量数据库存储
使用嵌入模型将文本转换为向量,并存入Chroma数据库。
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
# 使用HuggingFace的Sentence Transformers模型进行嵌入
embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
# 创建向量数据库
vectorstore = Chroma.from_documents(
documents=docs,
embedding=embedding_model,
persist_directory="./chroma_db" # 持久化存储
)
# 持久化
vectorstore.persist()
print("向量数据库已创建并保存")
4. 构建检索器(Retriever)
从向量数据库中检索与用户问题最相关的文档片段。
# 加载已保存的向量数据库
vectorstore = Chroma(
persist_directory="./chroma_db",
embedding_function=embedding_model
)
# 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 3} # 返回最相关的3个结果
)
5. 构建生成链(结合检索与生成)
使用LangChain的RetrievalQA链,将检索到的上下文传递给大模型生成答案。
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI # 或使用本地模型
# 初始化大语言模型
llm = ChatOpenAI(
model_name="gpt-3.5-turbo",
temperature=0,
openai_api_key="your-api-key"
)
# 创建RAG问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # 将所有检索结果“塞入”提示词
retriever=retriever,
return_source_documents=True # 返回引用来源
)
6. 支持多轮对话的记忆管理
为了让AI记住对话历史,引入ConversationBufferMemory。
from langchain.chains import ConversationalRetrievalChain
# 创建对话记忆
memory = ConversationBufferMemory(
memory_key="chat_history",
return_messages=True
)
# 构建支持多轮对话的RAG链
conversational_qa_chain = ConversationalRetrievalChain.from_llm(
llm=llm,
retriever=retriever,
memory=memory,
return_source_documents=True
)
7. 执行问答(多轮对话示例)
# 第一轮对话
query1 = "LangChain是什么?"
result1 = conversational_qa_chain({"question": query1})
print("AI:", result1["answer"])
# 第二轮对话(AI能理解上下文)
query2 = "它能用来做什么?"
result2 = conversational_qa_chain({"question": query2})
print("AI:", result2["answer"])
# 查看引用来源
print("\n引用文档:")
for i, doc in enumerate(result2["source_documents"]):
print(f"[{i+1}] {doc.page_content[:150]}...")
三、系统优化策略
-
查询重写(Query Rewriting)
使用LLM将用户提问改写为更利于检索的形式,提升召回率。 -
HyDE(假设性文档嵌入)
让模型先生成一个假设性答案,再用该答案的向量去检索,常能发现更相关的内容。 -
混合检索(Hybrid Search)
结合关键词检索(如BM25)与向量检索,兼顾精确匹配与语义理解。 -
结果重排序(Re-Ranking)
对初步检索结果使用更精细的模型进行相关性打分,提升排序质量。
四、总结
通过以上代码,我们实现了一个具备知识检索、精准生成、多轮对话能力的AI知识库原型。LangChain的强大之处在于其模块化设计,开发者可以像搭积木一样组合不同组件,快速构建复杂应用。
该项目的完整源码(含前端界面、API封装、配置管理等)已在GitHub开源(示例地址:https://github.com/example/langchain-rag-knowledge-base),欢迎克隆、学习与贡献。
未来方向:可进一步集成Agent机制,让AI不仅能回答问题,还能主动调用工具、执行任务,迈向真正的智能体(Agent)应用。
掌握LangChain + RAG,您就掌握了构建下一代智能应用的核心钥匙。立即动手,开启您的AI知识库之旅吧!