这篇我们就冲进语义搜索 + 大模型的世界,做一件真正「懂用户」的事:引入 RAG(检索增强生成)、Re-ranking 重排序 和 Prompt 指令增强,打造一个像 ChatGPT 那样“理解+回答一体”的系统。
一、引言:为什么语义搜索还不够?
我们刚构建的语义搜索系统已经可以:
✅ 理解语义
✅ 返回相似文本
但用户真正想要的,不只是“找到”,而是“理解 + 找到 + 回答”。
比如,用户问:
“如何训练一个句向量模型?”
语义搜索系统会找出相关文章,但不会自动生成答案。而 RAG(Retrieval-Augmented Generation)模型,就是为了解决这个“理解-召回-回答”三连跳问题的。
二、核心思想图解
用户提问
↓
向量召回(语义搜索)
↓
Top-K 文本拼接上下文(用于生成器输入)
↓
语言模型生成答案(BERT/LLM)
↓
可选 Re-ranking 优化顺序 or Prompt 增强理解
三、模块一:RAG(检索增强生成)
📌 什么是 RAG?
RAG = Retriever(检索器) + Generator(生成器)
先用语义搜索找到 Top-K 相关文档 → 拼成 prompt → 喂给大模型生成答案
✅ 示例代码(简化版)
from transformers import pipeline, AutoTokenizer, AutoModelForSeq2SeqLM
# 假设你已用 SBERT + Faiss 拿到 top_k 文档
top_k_docs = [
"句向量模型可以通过 Siamese 网络训练",
"使用 Sentence-BERT 是一种主流做法",
"监督学习能提升相似度建模效果"
]
query = "如何训练句向量模型?"
context = "\n".join(top_k_docs)
rag_prompt = f"问题:{query}\n已知信息:\n{context}\n请回答:"
# 用一个生成模型
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True)
model = AutoModelForSeq2SeqLM.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).cuda()
inputs = tokenizer(rag_prompt, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=256)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
🧠 如果用 OpenAI,可以更简单:
import openai
openai.api_key = "sk-xxx"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "你是一个技术专家,擅长NLP与大模型训练。"},
{"role": "user", "content": rag_prompt}
]
)
print(response['choices'][0]['message']['content'])
四、模块二:Re-ranking 重排序优化
有时候语义搜索找出来的 top-K 结果中,真正有用的可能是第 3 条而不是第 1 条。
这时可以使用 CrossEncoder 或 RM-BERT 模型进行重排序(re-ranking)。
✅ 示例代码:
from sentence_transformers import CrossEncoder
cross_encoder = CrossEncoder('cross-encoder/ms-marco-MiniLM-L-6-v2')
# 将 query 与每个文档组成句对打分
scores = cross_encoder.predict([(query, doc) for doc in top_k_docs])
# 排序
reranked = sorted(zip(top_k_docs, scores), key=lambda x: x[1], reverse=True)
📌 CrossEncoder 优点是考虑了 query + doc 组合上下文,更准确,但速度比 Faiss 慢,适合 rerank 小规模结果。
五、模块三:Prompt 指令增强(懂你想要的)
在生成器中嵌入精心设计的 Prompt,可以让回答更符合“你是谁、你想要什么”。
🎯 Prompt 示例
你是一个 AI 技术专家,善于用简洁的语言解答问题。
请基于下方提供的知识,为用户的问题生成准确简明的中文回答。
用户问题:如何训练句向量模型?
已知文档:
1. 句向量模型可以通过 Siamese 网络训练
2. 使用 Sentence-BERT 是一种主流做法
3. 监督学习能提升相似度建模效果
请开始回答:
🔧 进阶提示:
- 用 Role Prompt 明确模型角色
- 用 Format Prompt 控制回答格式(如:Markdown、JSON)
- 用 Style Prompt 控制语言风格(如:官方/亲切/技术性)
六、架构总图:全链路 RAG 系统
┌─────────────┐
│ 用户问题输入 │
└─────┬───────┘
↓
┌─────────────┐
│ 向量检索召回 │(SBERT + Faiss)
└─────┬───────┘
↓
┌──────────────────────────┐
│ Top-K 文本拼接成上下文 Prompt │
└─────┬────────────────────┘
↓
┌────────────────────┐
│ Re-ranking(可选) │(CrossEncoder)
└─────┬──────────────┘
↓
┌────────────────────┐
│ 大模型生成答案(BERT/GLM/GPT) │
└────────────────────┘
七、实战 Tips
实践环节 | 建议工具 / 技术 |
---|---|
向量检索 | Faiss / Milvus / Qdrant |
句向量生成 | SBERT / Text2Vec / OpenAI |
重排序优化 | CrossEncoder / RM-BERT |
大模型回答 | ChatGLM / Qwen / GPT 系列 |
Prompt 设计 | 角色 + 任务 + 上下文 |
服务部署 | FastAPI / LangChain / Gradio |
八、总结
我们通过:
- 语义搜索召回(快速找)
- 重排序(找得更准)
- RAG 生成(用得上)
- Prompt 强化(说得对)
构建了一个具备类 GPT 能力的“检索+生成”系统。相比于传统 FAQ 和关键词系统,这种架构不仅懂“你问什么”,还能真正在“你需要什么”上做出反应。
这是下一代 AI 产品的核心路径。
引用资料
- Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. arXiv:2005.11401
- SBERT CrossEncoder 文档:https://www.sbert.net/examples/applications/cross-encoder
- OpenAI API:https://platform.openai.com/docs/guides/gpt
- ChatGLM:https://github.com/THUDM/ChatGLM3
- LangChain RAG 实战指南:https://docs.langchain.com/