揭秘检索增强生成 (RAG)
发布: (2025年12月11日 GMT+8 15:47)
5 min read
原文: Dev.to
Source: Dev.to
什么是 RAG?
RAG 是一种通过将大型语言模型(LLM)连接到外部知识库来增强其能力的技术。模型不再仅依赖预训练数据,而是首先 检索 来自特定数据集(例如内部文档、数据库或网站)的相关信息,然后 生成 更准确、上下文感知的响应。
这就像是 LLM 的开卷考试:模型不必记住所有内容,只需要知道在回答前如何查找正确的信息。
为什么需要它?
RAG 的主要动机是克服独立 LLM 的固有局限:
- 知识截止点: LLM 对训练后出现的事件或数据毫不知情。RAG 提供了获取最新信息的直接渠道。
- 幻觉(Hallucinations): 当 LLM 不知道答案时,可能会生成听起来合理但实际上错误的回复。RAG 将模型根植于事实数据,大幅降低幻觉。
- 缺乏专业性: 通用 LLM 可能缺乏对细分领域(如内部政策或技术手册)的深入了解。RAG 让你注入领域专属的专业知识。
- 可验证性: 使用 RAG 时,你通常可以引用生成答案所依据的来源,为用户提供验证信息的途径。
RAG 是如何工作的?
RAG 过程可以分为两个主要阶段。
步骤 1:索引(设置阶段)
- 加载文档: 导入 PDF、Markdown 文件、数据库记录等。
- 切块(Chunking): 将每个文档拆分为更小、易于管理的文本块。
- 嵌入(Embedding): 使用嵌入模型将每个块转换为数值向量。
- 存储: 将块及其向量保存在 向量库 中,以实现快速相似度搜索。
此离线索引仅在源文档发生变化时执行。
步骤 2:检索与生成(实时阶段)
- 用户查询: 用户提交问题(例如 “我们的远程工作政策是什么?”)。
- 嵌入查询: 使用相同的嵌入模型将查询转换为向量。
- 搜索: 向量库返回最相似的文本块。
- 增强: 将原始查询与检索到的块合并为一个丰富的提示。
- 生成: 将增强后的提示发送给 LLM,生成最终答案。
概念性 Python 示例
# Pre‑configured components:
# - vector_store: database of indexed document chunks
# - embedding_model: model that converts text to vectors
# - llm: large language model for generation
def answer_question_with_rag(query: str) -> str:
"""
Answers a user's query using the RAG process.
"""
# 1. Embed the user's query
query_embedding = embedding_model.embed(query)
# 2. Retrieve relevant context from the vector store
relevant_chunks = vector_store.find_similar(query_embedding, top_k=3)
# 3. Augment the prompt
context = "\n".join(relevant_chunks)
augmented_prompt = f"""
Based on the following context, please answer the user's query.
If the context does not contain the answer, say so.
Context:
{context}
Query:
{query}
"""
# 4. Generate the final answer
final_answer = llm.generate(augmented_prompt)
return final_answer
# Example usage
user_query = "What is our policy on remote work?"
response = answer_question_with_rag(user_query)
print(response)
何时使用 RAG
- 客服聊天机器人: 使用产品手册、FAQ 和历史支持工单来回答问题。
- 内部知识库: 让员工查询公司政策、技术文档或项目历史。
- 个性化内容推荐: 根据用户查询和项目目录推荐文章或产品。
- 教育工具: 构建 “问书” 或 “问讲座” 应用,让学生查询课程材料。
何时 不 使用 RAG
- 高度创意或开放式任务: 诗歌、虚构故事或头脑风暴不需要特定文档。
- 通用知识问答: 像 “法国的首都是什么?” 这类查询可由 LLM 的内部知识高效回答。
- 极低延迟需求: 检索会增加响应时间;对于毫秒级响应,直接调用 LLM 可能更合适。
- 简单的指令控制: “打开灯光” 或 “播放音乐” 等任务更适合专用的 NLU 系统,而不是完整的 RAG 流程。
通过了解其优势与局限,你可以利用 RAG 构建更准确、可靠且有价值的 AI 驱动应用。