一、为什么选择 RAG 架构
GPT-6 虽然拥有强大的通用能力,但企业私有知识库中的业务数据往往不在模型训练范围内。RAG(检索增强生成)通过「先检索、后生成」的方式,把企业文档、数据库中的内容实时注入提示词,让模型基于真实业务资料作答,既解决了知识时效性问题,也降低了幻觉风险。
相比直接微调,RAG 具备三个明显优势:一是知识更新成本低,替换索引即可生效;二是可追溯性强,每个回答都能定位到来源文档;三是部署门槛低,无需昂贵的训练算力。因此,RAG 成为企业落地大模型应用的首选架构。
二、整体架构设计
一个完整的企业级 RAG 系统包含四个核心环节:文档加载、向量化存储、检索召回、生成回答。下面用一张流程图展示整体链路。
flowchart TD
A[企业文档] –> B[文档加载与切分]
B –> C[向量化 Embedding]
C –> D[向量数据库存储]
E[用户提问] –> F[问题向量化]
F –> G[相似度检索]
D –> G
G –> H[拼接上下文与问题]
H –> I[GPT-6 生成回答]
I –> J[返回结果并附来源]
其中,文档切分质量、向量模型选择、检索策略和提示词设计,是决定系统效果的关键因素。下面逐一展开。
三、环境准备与依赖安装
本教程使用 Python 3.10 及以上版本,核心依赖包括 LangChain、OpenAI SDK、向量数据库和文档解析库。建议使用虚拟环境隔离项目依赖。
pip install langchain langchain-openai openai chromadb pypdf
接下来在项目中配置 GPT-6 的 API 密钥。推荐使用环境变量管理密钥,避免硬编码泄露。
import os
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
os.environ["OPENAI_API_KEY"] = "your-api-key"
初始化 GPT-6 对话模型
llm = ChatOpenAI(
model="gpt-6",
temperature=0.2,
max_tokens=2048
)
初始化向量化模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-large")
四、文档加载与智能切分
企业文档格式多样,常见的有 PDF、Word、Markdown 等。LangChain 提供了统一的加载器接口,这里以 PDF 为例演示加载流程。
from langchain_community.document_loaders import PyPDFLoader
loader = PyPDFLoader("enterprise_manual.pdf")
documents = loader.load()
print(f"共加载 {len(documents)} 页文档")
文档切分是影响检索质量的核心环节。切分过大,上下文噪声多、成本高;切分过小,语义不完整、召回不准。推荐按章节结构优先切分,再结合固定长度兜底。
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=120,
separators=["\\n\\n", "\\n", "。", "!", "?", ";", " ", ""]
)
chunks = text_splitter.split_documents(documents)
print(f"切分后共 {len(chunks)} 个文本块")
五、向量化存储与索引构建
切分完成后,需要把每个文本块向量化并写入向量数据库。这里使用 Chroma 作为本地向量库,便于快速验证;生产环境可替换为 Milvus 或 Elasticsearch。
from langchain_chroma import Chroma
vector_store = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
print("向量索引构建完成")
构建索引时需要注意两点:一是为每个文本块保留来源元数据,便于回答时追溯;二是定期重建索引,保证新增文档能及时被检索到。
六、检索策略与重排序优化
基础检索使用向量相似度召回 Top-K 文本块。但企业场景下,单纯依赖向量检索往往不够精准,建议引入重排序模型对召回结果二次打分。
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
base_retriever = vector_store.as_retriever(search_kwargs={"k": 8})
reranker = CrossEncoderReranker(
model=HuggingFaceCrossEncoder(model_name="BAAI/bge-reranker-v2-m3"),
top_n=4
)
compression_retriever = ContextualCompressionRetriever(
base_compressor=reranker,
base_retriever=base_retriever
)
经过重排序后,系统只保留与问题最相关的 4 个文本块送入生成环节,既提升了回答准确率,也控制了 Token 消耗。
七、提示词设计与问答链路
提示词是连接检索结果与模型生成的桥梁。好的提示词应明确要求模型只依据给定上下文作答,并在信息不足时如实说明。
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个企业知识库问答助手。请严格依据提供的上下文回答用户问题。"
"如果上下文中没有相关信息,请明确回答'知识库中未找到相关内容',不要编造答案。"
"回答末尾请标注信息来源。"),
("human", "上下文:\\n{context}\\n\\n问题:{question}")
])
最后,把检索器、提示词和 GPT-6 模型串联成完整的问答链路。
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
def format_docs(docs):
return "\\n\\n".join(f"【来源:{doc.metadata.get('source', '未知')}】\\n{doc.page_content}" for doc in docs)
rag_chain = (
{"context": compression_retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
测试问答
result = rag_chain.invoke("公司年假政策是什么?")
print(result)
八、效果评估与调优建议
系统上线前,建议准备一组覆盖常见业务问题的测试集,从召回准确率、回答正确率、来源可追溯性三个维度评估效果。常见问题与调优方向如下:
| 回答与问题无关 | 检索召回不准确 | 调整切分粒度、增加重排序、优化向量模型 |
| 回答内容过时 | 索引未及时更新 | 建立文档增量更新机制 |
| 回答缺乏依据 | 上下文拼接不完整 | 增大 Top-K 数量、优化提示词约束 |
| 响应延迟过高 | 检索链路过长 | 精简召回数量、引入缓存机制 |
此外,建议在系统中加入日志记录,沉淀用户真实问题,持续迭代检索策略和提示词模板。
九、总结
本文从架构设计、环境搭建、文档切分、向量存储、检索优化到提示词编排,完整演示了基于 GPT-6 与 LangChain 构建企业级 RAG 问答系统的全过程。核心要点可以概括为:切分质量决定召回上限,重排序决定精度,提示词决定生成质量。
读者可以在此基础上,结合自身业务文档替换数据源,并逐步引入权限控制、多轮对话和流式输出等企业级能力,打造真正可落地的智能问答系统。
网硕互联帮助中心




评论前必须登录!
注册