打造更聪明的语义搜索:融合 RAG、Re-ranking 与 Prompt 增强的实战指南

内容纲要

这篇我们就冲进语义搜索 + 大模型的世界,做一件真正「懂用户」的事:引入 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 条。

这时可以使用 CrossEncoderRM-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 产品的核心路径。


引用资料

  1. Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. arXiv:2005.11401
  2. SBERT CrossEncoder 文档:https://www.sbert.net/examples/applications/cross-encoder
  3. OpenAI API:https://platform.openai.com/docs/guides/gpt
  4. ChatGLM:https://github.com/THUDM/ChatGLM3
  5. LangChain RAG 实战指南:https://docs.langchain.com/

Leave a Comment

您的电子邮箱地址不会被公开。 必填项已用*标注

close
arrow_upward