📖LangChain :基于文档的问答 (Q&A)
在处理大量私有数据或实时文档时,直接将全文放入 Prompt 是不现实的。LangChain 通过 RAG (Retrieval Augmented Generation) 技术解决了这一问题。
- 核心流程:五个关键步骤
• Loading (加载):从 PDF、Markdown 或数据库加载原始文档。
• Splitting (拆分):将大文档切分成小的语义块(Chunks),因为模型有上下文长度限制。
• Storage (存储):将文本块转换为向量(Embeddings)并存入向量数据库(Vector Store)。
• Retrieval (检索):根据用户问题,从数据库中找出最相关的文本块。
• Output (输出):将问题和检索到的文本块一起交给 LLM,生成最终回答。
- 关键组件说明
A. Embeddings (嵌入)
将文本转化为数字向量的技术。相似含义的文本在向量空间中的距离更近。
B. Vector Stores (向量存储)
专门用于存储和搜索向量的数据库(如 Chroma, Pinecone, FAISS)。它能执行"相似度搜索"。
C. RetrievalQA (检索问答链)
这是 LangChain 预封装好的链,它自动完成了"检索 → 构造 Prompt → 询问 LLM"的全过程。
- 链的四种处理模式 (Chain Types)
当检索出的文本块太多时,有四种策略处理:
• Stuff:最常用。将所有检索到的块直接"塞进"一个 Prompt。速度快,成本低,但受模型长度限制。
• Map Reduce:对每个块分别询问,最后汇总。克服了长度限制,但耗时较长且丢失跨块语境。
• Refine:循环迭代。先看第一个块得出初步答案,再结合第二个块改进答案。答案质量高,但极慢。
• Map Re-rank:对每个块评分,选出分数最高的那个作为答案。
- 代码实现示例 (Python)
以下展示了如何实现一个基础的"Stuff"模式检索问答:
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI
from langchain.document_loaders import CSVLoader
from langchain.vectorstores import DocArrayInMemorySearch
from langchain.indexes import VectorstoreIndexCreator
# 1. 加载数据
loader = CSVLoader(file_path="OutdoorClothingCatalog_1000.csv")
# 2. 创建索引 (内部自动完成拆分、嵌入和存储)
index = VectorstoreIndexCreator(
vectorstore_cls=DocArrayInMemorySearch ).from_loaders([loader])
# 3. 执行查询
llm = ChatOpenAI(temperature=0.0)
query = "请列出具有防晒功能的衬衫并总结其特点。"
# 方式 A:直接通过索引查询 (高层抽象)
response = index.query(query, llm=llm)
# 方式 B:使用 RetrievalQA 链 (更具控制力)
retriever = index.vectorstore.as_retriever()
qa_stuff = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
verbose=True)
response = qa_stuff.run(query)
print(response)
- 核心逻辑总结
术语
描述
Vector Database
存放知识库的"硬盘"。
Similarity Search
在硬盘里找"最相关参考书"的过程。
Chain Type: Stuff
把参考资料全部塞给模型的方法。
Index
结构化的知识表示,方便快速检索。
- 为什么需要 RAG?
• 克服幻觉:强迫模型基于提供的证据回答。
• 知识更新:无需重新训练模型,只需更新向量数据库即可获取最新信息。
• 隐私保护:私有文档不需要上传到模型训练集中,只在检索时作为上下文使用。
关键要点:理解 Q&A 流程是开发企业级 AI 知识库助手的核心。