一个完整的RAG系统主要包含两个阶段:索引构建(离线) 和检索生成(在线)。
图表
代码
下载
全屏
检索与生成
索引构建
提供知识库
加载文档
文本切分
向量化
存储索引
用户提问
问题向量化
相似度检索
Prompt增强
LLM生成回答
索引构建(让机器理解你的文档):
文档加载:读取PDF、Word、TXT等各种格式的文件-1-9。
文本切分:将长文档切成有意义的短块,比如按段落切分,确保每个小块语义完整,这是提升检索质量的关键-1-9。
向量化:用嵌入模型将每个文本块转换成数字向量,相当于给文本内容建立一个"语义坐标"-1。
存储:将向量存入专门的数据库,如开源的FAISS、Chroma或企业级的Milvus,以便后续快速查找-1-2-9。
检索与生成(回答用户问题):
问题向量化:把你提的问题也转换成向量-1。
相似检索:在向量数据库中快速找到与问题向量最相似的N个文本块-1。
增强提示:将检索到的文本块和你的原始问题,一起放入精心设计的提示词中-1-9。
生成答案:大模型根据提示词中的参考资料来生成最终答案,回答会更准确、更有依据-1。
下面用LangChain框架和Chroma向量数据库,演示一个极简的RAG实现-1。只需替换你的OpenAI API Key和文档路径即可运行。
python
复制
下载
# 1. 安装依赖库
# pip install langchain langchain-community langchain-openai chromadb
import os
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 设置你的OpenAI API Key
# os.environ["OPENAI_API_KEY"] = "sk-..."
# --- 阶段一:索引构建(离线)---
# 1. 加载文档
loader = TextLoader("./my_document.txt") # 请替换为你的文件路径
documents = loader.load()
# 2. 切分文档
text_splitter = CharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = text_splitter.split_documents(documents)
# 3. 向量化并存储到Chroma
embeddings = OpenAIEmbeddings()
vector_store = Chroma.from_documents(chunks, embeddings)
# --- 阶段二:检索生成(在线)---
# 4. 创建检索器
retriever = vector_store.as_retriever()
# 5. 创建大模型
llm = ChatOpenAI(model_name="gpt-3.5-turbo")
# 6. 创建RAG链,自动完成检索->增强->生成
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever
)
# 7. 提问!
query = "RAG的核心思想是什么?"
response = qa_chain.invoke(query)
print(response['result']) 基础的RAG能跑通,但想让它在实际业务中更精准、更稳定,可以从下面几个方面优化:
索引阶段:
优化切分策略:不要机械地按固定长度切分,可以按Markdown标题层级或语义边界(如段落)进行切分,保证语义完整性-1。
选对嵌入模型:针对中文或垂直领域(如金融、医疗),可以选择BGE-M3等专门优化的模型,能显著提升检索准确率-4。
检索阶段:
混合检索:将向量检索(理解语义)和关键词检索(如BM25算法,用于精准匹配)结合,可以大幅提升召回率,尤其适用于专业术语多的场景-2-4-9。
重排序:初次检索可以多召回一些结果(比如20个),然后用一个更强大的重排序模型(Reranker)对这20个结果进行精细排序,最后只把最相关的Top-K(比如5个)送给大模型,能有效提升最终答案质量-2。
生成阶段:
提示词工程:明确要求模型"仅根据以下内容回答",如果找不到答案就说"不知道",不要自己编造,这能有效减少幻觉-9。
RAG在各行各业都有落地方案,这里有几个典型案例供你参考:
行业应用场景核心痛点与方案效果政务政策咨询智能助手痛点:政策文件多、更新快,市民咨询量大。 方案:构建本地知识库,用RAGFlow等工具结合大模型API,实现精准问答-8-10。准确回答政策问题,减轻人工压力-8。金融智能投研分析痛点:研报、公告海量,分析师检索耗时。 方案:采用“关键词+向量”的混合检索架构,高效召回相关信息-2-4。资料检索时间从45分钟缩短至8分钟-4。医疗临床辅助诊断痛点:医学文献日新月异,关系复杂。 方案:采用“图谱增强RAG”,用知识图谱关联症状、药物、病史等信息,进行多跳推理-7。辅助基层医生,提升诊断符合率-7。IT代码风险识别痛点:人工审核代码效率低,难以覆盖所有风险。 方案:将历史资损代码向量化存入数据库,自动检索新提交代码的相似风险-2。自动化拦截风险代码,有效规避潜在损失-2。