共计 2174 个字符,预计需要花费 6 分钟才能阅读完成。
技术背景:RAG 架构与提示词的核心作用
RAG(Retrieval-Augmented Generation)通过结合检索系统和生成模型,让 AI 在回答问题时可动态参考外部知识库。其工作流程分为三步:

- 检索阶段 :用户输入的问题被转换为 embedding 向量,从知识库中检索最相关的文档片段
- 增强阶段 :将检索到的文档与原始问题拼接,形成增强后的提示词(prompt)
- 生成阶段 :大模型基于增强后的提示词生成最终回复
提示词在此架构中如同 ” 交通指挥员 ”,既要准确传达用户意图,又要合理组织检索内容。好的提示词设计能显著提升:
- 检索结果利用率(避免 ” 答非所问 ”)
- 生成内容的连贯性(减少上下文断裂)
- 事实准确性(正确引用检索内容)
痛点分析:不良提示词设计的三大灾难现场
案例 1:模糊指令导致信息过载
# 反例:未限定回答范围的提示词
"请根据以下文档回答问题:{context}\n 问题:{question}"
后果 :模型可能返回包含无关细节的长篇大论,甚至直接复制整段检索内容
案例 2:缺少上下文分隔符
# 反例:未区分用户问题和检索内容
"文档说:苹果是一种水果。用户问:苹果公司总部在哪?"
后果 :模型混淆 ” 苹果 ” 的不同语义,可能给出 ” 水果公司 ” 等荒谬回答
案例 3:忽略多轮对话状态
# 反例:未继承历史对话的提示词
"当前问题:{current_question}\n 相关文档:{context}"
后果 :每次问答成为孤立事件,出现 ” 你刚才说的 XX 是什么意思?” 等断裂对话
解决方案:工业级提示词模板与代码实现
可复用的提示词模板结构
template = """ 基于以下已知信息,用中文简洁专业地回答用户问题。如果无法从信息中得到答案,请说 "根据已知信息无法回答",不要编造。===== 参考内容 =====
{context}
===== 问题 =====
{question}
回答:"""
设计要点 :
- 明确指令格式(要求简洁、禁止编造)
- 使用视觉分隔符区分不同内容块
- 包含 fallback 机制(避免幻觉回答)
Python 完整实现(LangChain 示例)
from langchain.prompts import PromptTemplate
from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
# 1. 构建检索系统
embeddings = HuggingFaceEmbeddings(model_name="paraphrase-multilingual-MiniLM-L12-v2")
db = FAISS.load_local("knowledge_base", embeddings)
# 2. 定义提示词模板
prompt_template = PromptTemplate.from_template(template)
# 3. 检索增强生成流程
def rag_answer(question, chat_history=[]):
# 检索相关文档(限制 3 条结果)docs = db.similarity_search(question, k=3)
context = "\n".join([d.page_content for d in docs])
# 动态构建提示词(融入对话历史)history_str = "\n".join([f"用户:{q}\nAI:{a}" for q,a in chat_history[-2:]])
full_prompt = prompt_template.format(
context=context,
question=f"{history_str}\n 最新问题:{question}"
)
# 调用 LLM 生成(示例用伪代码)return llm.generate(full_prompt)
关键处理逻辑 :
similarity_search限制返回结果数量(控制上下文长度)- 对话历史以固定格式拼接(保持多轮一致性)
- 最新问题采用明显标识(避免历史问题混淆)
性能优化:提示词瘦身秘籍
长度对延迟的影响实验数据
| 提示词长度 (tokens) | 平均响应时间 (ms) |
|---|---|
| <500 | 1200 |
| 500-1000 | 1800 |
| >1000 | 3000+ |
三大压缩策略
-
实体提取 :仅保留检索内容中的关键实体和关系
# 使用 spaCy 提取命名实体 import spacy nlp = spacy.load("zh_core_web_sm") def extract_entities(text): return " ".join([ent.text for ent in nlp(text).ents]) -
摘要生成 :用 T5 等模型生成检索内容的摘要
- 动态截断 :优先保留与问题 embedding 相似度高的文本片段
避坑指南:生产环境三大雷区
1. 冷启动问题
现象 :知识库初期数据少,检索结果质量差
解法 :
- 添加通用回复模板(” 正在学习这个知识 …”)
- 混合使用规则引擎和 RAG
2. 敏感信息泄露
风险 :检索系统返回含隐私的文档
防护 :
- 部署内容过滤器(如正则匹配身份证号)
- 开启 LLM 的安全输出模式
3. 时效性陷阱
案例 :问 ” 最新 iPhone 型号 ”,但知识库过期
策略 :
- 添加数据更新时间戳检测
- 对接实时 API 补充检索
思考题
- 如何设计量化指标评估提示词质量?准确率、流畅度之外还需考虑哪些维度?
- 当提示词优化遇到瓶颈时,哪些信号表明需要转向模型微调而非继续调整提示词?
正文完
发表至: 未分类
近两天内
