随着大语言模型(LLM)的广泛应用,越来越多企业和个人希望利用它来实现“基于文档的智能问答”功能。例如:
**传统 LLM 模型并不能直接处理本地文档知识。**这时候就需要用到一种重要技术——RAG(Retrieval-Augmented Generation,检索增强生成)。
本项目就基于该原理,借助 LangChain 框架 + 向量数据库(Chroma)+ OpenAI/GPT 构建一个完整的文档问答助手。
组件 | 说明 |
---|---|
LangChain | 框架核心,负责构建 Prompt、LLM、Chain 等模块 |
OpenAI GPT | 用于生成回答的语言模型(也可替换为其他支持 Chat 接口的模型) |
Chroma | 本地向量数据库,用于文档内容向量化与查询 |
FAISS / SQLite(可选) | 替代 Chroma 的向量库(本文以 Chroma 为主) |
SentenceTransformers / OpenAI Embedding | 将文本转换为向量的模型 |
Gradio / Streamlit(可选) | 构建交互界面用于问答体验 |
Jupyter Notebook / Python 脚本 | 开发测试工具 |
下图展示了文档问答助手的核心执行流程:
用户输入问题
↓
LangChain 调用向量数据库
↓
根据 Embedding 查找相关内容
↓
构建带上下文的 Prompt
↓
传入 GPT 等 LLM 获取回答
↓
输出最终结果
这一过程涉及 3 个核心模块:
先安装所需依赖:
pip install langchain openai chromadb tiktoken
pip install unstructured # 用于文档加载(支持 PDF、txt、md)
若你使用 HuggingFace 本地模型:
pip install sentence-transformers
我们将以 example.txt
为例,构建一个本地文档问答助手。
import os
os.environ["OPENAI_API_KEY"] = "你的API密钥"
你也可以通过 .env
或配置文件管理。
from langchain.document_loaders import TextLoader
loader = TextLoader("example.txt", encoding="utf-8")
documents = loader.load()
print(f"文档数量:{len(documents)}")
若是 PDF 等文档,可使用:
from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader("example.pdf")
长文档必须分块,否则 Embedding 会失效。
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=500,
chunk_overlap=50
)
docs = text_splitter.split_documents(documents)
建议:
chunk_size
控制每块 token 数
chunk_overlap
保证上下文连续性
选择一个嵌入模型:
from langchain.embeddings import OpenAIEmbeddings
embedding = OpenAIEmbeddings()
from langchain.embeddings import HuggingFaceEmbeddings
embedding = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
from langchain.vectorstores import Chroma
db = Chroma.from_documents(docs, embedding, persist_directory="db")
db.persist() # 持久化保存
之后可通过 Chroma(persist_directory="db", embedding=embedding)
加载已存库。
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
retriever = db.as_retriever(search_kwargs={"k": 3})
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
chain_type
可选:
stuff
: 把所有检索结果直接拼接
map_reduce
: 分块处理后汇总(慢)
refine
: 逐步更新回答
query = "这个文档讲了什么?"
result = qa_chain(query)
print("答案:", result['result'])
for i, doc in enumerate(result['source_documents']):
print(f"\n来源片段{i+1}:\n{doc.page_content}")
以下是完整的 Python 脚本版本:
import os
from langchain.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 设置密钥
os.environ["OPENAI_API_KEY"] = "你的API密钥"
# 1. 加载文档
loader = TextLoader("example.txt", encoding="utf-8")
documents = loader.load()
# 2. 分割文档
text_splitter = CharacterTextSplitter(
separator="\n", chunk_size=500, chunk_overlap=50
)
docs = text_splitter.split_documents(documents)
# 3. 生成向量
embedding = OpenAIEmbeddings()
# 4. 存入向量数据库
db = Chroma.from_documents(docs, embedding, persist_directory="db")
db.persist()
# 5. 构建问答链
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
retriever = db.as_retriever(search_kwargs={"k": 3})
qa_chain = RetrievalQA.from_chain_type(
llm=llm, chain_type="stuff", retriever=retriever, return_source_documents=True
)
# 6. 提问
query = input("请输入你的问题:")
result = qa_chain(query)
print("回答:", result["result"])
import gradio as gr
def chat_fn(question):
result = qa_chain(question)
return result["result"]
iface = gr.Interface(fn=chat_fn, inputs="text", outputs="text")
iface.launch()
UnstructuredLoader
可自动识别多种文档格式
llama-cpp
, ollama
, Transformers
作为 LLM 接入 LangChain
HuggingFaceEmbeddings
使用 ConversationBufferMemory
保持上下文问答:
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory()
qa_chain.memory = memory
本文带你从零搭建了一个基于 LangChain 的“文档问答助手”,核心技术包括文档加载、文本分块、嵌入向量化、向量数据库检索、结合 LLM 的生成回答。
这套架构能广泛应用在以下场景:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有