别再死磕Prompt!RAG精度90%靠检索,阿里云ACP 6节课浓缩9条生产铁律
RAG 核心技术极简实战指南
从阿里云 ACP 大模型C2课程 6 节 RAG 课程中提炼的生产级干货,只保留工作中最常用、最有效的技术。
一、RAG 本质(一句话)
先检索相关知识片段,再让大模型基于片段生成答案。 解决大模型"不知道私域知识"和"上下文窗口有限"的矛盾。
用户提问 → 向量检索(top-k相关片段) → 拼接Prompt(问题+片段) → LLM生成答案
二、构建 RAG 的 5 个关键步骤
| 步骤 | 核心动作 | 生产要点 |
|---|---|---|
| 1. 文档解析 | PDF/Word → 文本 | 复杂文档用 DashScopeParse 转为 Markdown,保留表格结构 |
| 2. 文本切片 | 长文档切分 | Markdown切片 > 语义切片 > 句子切片 > Token切片 |
| 3. 向量化 | 文本 → 向量 | 用最新 Embedding 模型(如 text-embedding-v3),效果差距显著 |
| 4. 存储索引 | 向量入库 | 开发用内存,生产用 DashVector / Milvus |
| 5. 检索生成 | 召回+LLM回答 | 召回数量默认 2,复杂场景可扩至 5-10 |
LlamaIndex 一键搭建:
from llama_index.core import SimpleDirectoryReader, VectorStoreIndex
from llama_index.embeddings.dashscope import DashScopeEmbedding
documents = SimpleDirectoryReader('./docs').load_data()
index = VectorStoreIndex.from_documents(documents, embed_model=DashScopeEmbedding(...))
query_engine = index.as_query_engine(similarity_top_k=5)
三、检索侧优化(决定 RAG 上限)
3.1 问题改写(多轮/歧义场景必做)
用户问"他的主管是谁"→ 改写为"张三的主管是谁"。
from llama_index.core.chat_engine import CondenseQuestionChatEngine chat_engine = CondenseQuestionChatEngine.from_defaults( query_engine=query_engine, condense_question_prompt=custom_prompt # 让LLM根据历史改写问题 )
3.2 检索前增强
| 技术 | 解决什么问题 | 使用场景 |
|---|---|---|
| Query扩写 | 问题太简略 | "找张伟" → "公司所有叫张伟的员工及部门" |
| HyDE | 问题与文档表述差异大 | 让LLM先写"假答案",再用假答案去检索 |
| 标签过滤 | 需要精确过滤 | 提取"部门=教研部"标签,先过滤再向量检索 |
| 多步分解 | 复杂问题 | "张伟不在找谁" → 先查张伟职责,再查同职责人员 |
3.3 检索后精排
ReRank 是性价比最高的优化。 先召回 20 个,再用重排序模型(如 gte-rerank)选出最相关的 3-5 个。
node_postprocessors=[ DashScopeRerankPostprocessor(top_n=3), # 重排序 SimilarityPostprocessor(similarity_cutoff=0.2) # 过滤低相关 ]
3.4 上下文质量原则
-
知识浓度 > 数量:无关信息会淹没关键内容(Lost in the Middle)
-
结构化文档 > 纯文本:Markdown/表格格式召回准确率远高于 plain text
四、生成侧优化(Prompt 工程)
4.1 提示词六要素框架
写 Prompt 时检查是否包含:
| 要素 | 作用 | 示例 |
|---|---|---|
| 任务目标 | 明确做什么 | "根据参考信息回答用户问题" |
| 上下文 | 背景信息 | 召回的文档片段 |
| 角色 | 设定身份 | "你是公司客服小蜜" |
| 受众 | 输出风格 | "面向零编程基础的新员工" |
| 输出格式 | 结构化要求 | "只输出 JSON,不要代码块" |
| 样例 | 少样本学习 | 给 1-2 个输入输出示例 |
4.2 高阶技巧
-
分隔符:用
【】、---、XML 标签明确分隔不同部分 -
COT 思维链:复杂推理任务加"请一步步推导"
-
Meta Prompting:让 LLM 帮你优化 Prompt,迭代到满意
-
AI 裁判:训练一个"评分 Prompt",自动判断输出是否达标
4.3 推理模型 vs 通用模型
| 推理模型(Qwen3/DeepSeek-R1) | 通用模型(Qwen-Plus/Max) | |
|---|---|---|
| 优势 | 逻辑严谨,带思考过程 | 响应快,成本低 |
| 适用 | 复杂推理、代码、数学、Prompt优化 | 信息查询、文本生成、简单问答 |
| 提示 | 无需写"逐步思考",保持简洁 | 可显式引导 COT |
最佳实践:推理模型做规划/分析,通用模型做执行。
五、自动化评测(Ragas)
评测决定优化方向,评测先行,再针对性优化。
5.1 核心指标
| 指标 | 含义 | 低分优化方向 |
|---|---|---|
| Context Recall | 正确答案是否被召回 | 补充知识库 / 换 Embedding / Query 改写 |
| Context Precision | 召回内容的相关度排名 | 加 ReRank / 优化切片 |
| Answer Correctness | 最终答案准确度 | 优化 Prompt / 换 LLM / 调 temperature |
| Faithfulness | 答案是否基于检索内容(无幻觉) | 加提示词约束"不知道就说不知道" |
5.2 评测集构建原则
-
问题来源:真实用户提问,非技术人员编造
-
标准答案:必须由业务专家提供
-
持续迭代:随业务变化更新评测集
六、大模型参数速查
| 参数 | 作用 | 建议 |
|---|---|---|
temperature |
控制随机性,越低越确定 | 事实查询 0.1-0.3,创意任务 0.7-1.0 |
top_p |
控制候选词范围 | 一般不建议与 temperature 同时调 |
seed |
固定输出 | 需要可复现结果时设置 |
max_tokens |
输出长度限制 | 摘要设小,长文设大 |
presence_penalty |
减少重复 | 输出重复严重时调高 |
注意:temperature=0 也不能保证输出完全一致(分布式系统引入的微小随机性)。
七、生产工具链
| 环节 | 推荐工具 |
|---|---|
| RAG 框架 | LlamaIndex / LangChain |
| Embedding | text-embedding-v3(DashScope) |
| 向量数据库 | DashVector / Milvus / Qdrant |
| PDF 解析 | DashScopeParse(转 Markdown) |
| 评测框架 | Ragas / TruLens / DeepEval |
| ReRank | gte-rerank / qwen3-rerank |
| 可视化搭建 | 阿里云百炼应用构建(0代码) |
八、快速排查清单
遇到回答不准确时,按顺序检查:
-
检索问题? → 看
source_nodes,召回了什么内容 -
Context Recall 低? → 知识库缺内容 / Embedding 不够强 / Query 太简略
-
Context Precision 低? → 加 ReRank / 优化文档切片
-
答案幻觉? → Prompt 加"不知道就说不知道" / 降低 temperature
-
格式不对? → Prompt 明确输出格式 + 给少样本示例
九、一句话总结
RAG 的精度瓶颈不在 LLM,而在上下文的"知识浓度"。检索准了,答案就准了一半。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)