为什么企业需要RAG架构的大模型应用
大语言模型的训练数据存在时效性边界,企业内部知识也无法通过通用模型获取。RAG(Retrieval-Augmented Generation)通过外部知识检索增强生成能力,让模型回答有据可依,幻觉率显著降低。对于企业知识库问答、合同审核、技术文档检索等场景,RAG已成为AIGC应用的标配架构。
RAG系统的核心组件与数据流
一个完整的RAG系统由以下模块组成:
- 文档处理层:PDF/Word/Markdown等文档的解析与分块
- 向量化层:文本块通过Embedding模型转为向量
- 向量存储层:Milvus/Chroma/Qdrant等向量数据库
- 检索层:用户问题向量化后做相似度检索
- 生成层:检索结果拼入Prompt,由LLM生成回答
文档分块策略:Chunk大小直接影响检索精度
文档分块是RAG效果的关键变量。Chunk太小丢失上下文,太大引入噪声。实测经验值:
- 技术文档:512-1024 tokens,overlap 100 tokens
- FAQ类文档:256-512 tokens,overlap 50 tokens
- 长篇报告:1024-2048 tokens,overlap 200 tokens
使用LangChain的RecursiveCharacterTextSplitter做分块:
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=100,
separators=["\n\n", "\n", "\u3002", "\uff01", "\uff1f", ".", " ", ""]
)
chunks = splitter.split_text(document_text)
print(f"文档分块数: {len(chunks)}")
向量化与存储:选择合适的Embedding模型
中文场景推荐以下Embedding模型:
- bge-large-zh-v1.5:MTEB中文榜前列,维度1024,部署简单
- m3e-base:轻量级,维度768,适合资源有限场景
- text-embedding-3-large:OpenAI商业模型,维度3072,效果好但有成本
以Chroma向量库为例的存储代码:
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
embeddings = HuggingFaceEmbeddings(
model_name="BAAI/bge-large-zh-v1.5",
model_kwargs={"device": "cuda"},
encode_kwargs={"normalize_embeddings": True}
)
vectorstore = Chroma.from_texts(
texts=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
vectorstore.persist()
检索策略优化:混合检索提升召回率
纯向量检索对精确匹配(型号、编号)效果差,混合检索结合向量相似度和关键词BM25得分:
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever
bm25_retriever = BM25Retriever.from_texts(chunks, k=5)
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.3, 0.7]
)
docs = ensemble_retriever.invoke("如何配置Nginx反向代理")
for doc in docs:
print(doc.page_content[:100])
Prompt工程:让模型严格基于检索内容回答
RAG场景的System Prompt要约束模型只使用检索到的上下文,避免幻觉:
RAG_SYSTEM_PROMPT = (
"你是一个专业的知识库问答助手。请严格根据以下检索到的参考资料回答用户问题。\n"
"要求:1. 只使用参考资料中的信息作答,不要编造\n"
"2. 如果参考资料中没有相关信息,直接回答知识库中暂无相关信息\n"
"3. 回答时引用参考资料来源\n\n"
"参考资料:{context}\n\n"
"用户问题:{question}"
)
常见问题诊断与处理
Q: 检索结果不相关怎么办?
检查Embedding模型是否适配文档语言,中文文档不要用英文Embedding。增加chunk_overlap,或尝试混合检索。
Q: 模型回答还是会出现幻觉?
强化Prompt约束,在System Prompt中明确不得使用检索内容之外的知识。也可以在生成后增加校验步骤,用另一个LLM判断回答是否全部来自检索内容。
Q: 大量文档加载速度慢?
向量库持久化存储,避免每次重新计算Embedding。使用Milvus等分布式向量库支撑亿级向量检索。
生产环境部署建议
RAG系统上线需关注三个层面:Embedding服务独立部署(推荐FastAPI包装),向量数据库做持久化和定期备份,LLM推理服务根据QPS做弹性扩缩容。日志层面记录每次检索的query、返回的chunk、生成的answer,便于效果评估和问题回溯。监控检索召回率和回答准确率,定期用标注数据集做回归测试。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/aigc-ying-yong-shi-zhan-yong-rag-jian-suo-zeng-qiang-sheng/