【32章】从0到1,LangChain+RAG全链路实战AI知识库

59 阅读4分钟

LangChain+RAG 全链路实战:构建智能AI知识库,从基础检索到多轮对话优化(含核心代码逻辑)

在大模型时代,如何让AI“言之有据”是构建可信智能应用的关键。RAG(Retrieval-Augmented Generation) 技术通过将外部知识库与大语言模型结合,有效缓解了模型的“幻觉”问题。而 LangChain 作为领先的LLM应用开发框架,为构建RAG系统提供了强大的模块化支持。

本文将带您实战一个完整的AI知识库项目,涵盖文档加载、向量化存储、语义检索、答案生成多轮对话管理的全链路流程,并附上关键代码片段,助您快速搭建属于自己的智能问答系统。


一、项目架构概览

本系统主要由以下模块构成:

  1. 数据加载与预处理
  2. 文本向量化与向量数据库存储
  3. 检索器(Retriever)
  4. 生成链(Generation Chain)
  5. 对话记忆(Memory)管理
  6. 完整问答链(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]}...")

三、系统优化策略

  1. 查询重写(Query Rewriting)
    使用LLM将用户提问改写为更利于检索的形式,提升召回率。

  2. HyDE(假设性文档嵌入)
    让模型先生成一个假设性答案,再用该答案的向量去检索,常能发现更相关的内容。

  3. 混合检索(Hybrid Search)
    结合关键词检索(如BM25)与向量检索,兼顾精确匹配与语义理解。

  4. 结果重排序(Re-Ranking)
    对初步检索结果使用更精细的模型进行相关性打分,提升排序质量。


四、总结

通过以上代码,我们实现了一个具备知识检索、精准生成、多轮对话能力的AI知识库原型。LangChain的强大之处在于其模块化设计,开发者可以像搭积木一样组合不同组件,快速构建复杂应用。

该项目的完整源码(含前端界面、API封装、配置管理等)已在GitHub开源(示例地址:https://github.com/example/langchain-rag-knowledge-base),欢迎克隆、学习与贡献。

未来方向:可进一步集成Agent机制,让AI不仅能回答问题,还能主动调用工具、执行任务,迈向真正的智能体(Agent)应用。

掌握LangChain + RAG,您就掌握了构建下一代智能应用的核心钥匙。立即动手,开启您的AI知识库之旅吧!