5个爆肝技巧!让你的RAG系统查询更精准,秒杀90%的文章!
**“**查询前处理是在用户提问之后,RAG系统去做检索查询之前做的事情。为了系统能够给出最精确的回答,需要在查询的过程做些优化。”
前面文章我们介绍了向量数据库,Text2SQL查询MySQL的知识内容。了解了在RAG系统中会存在多个不同的数据库。那么问题来了,用户提出问题,什么问题会去检索向量数据库的内容,什么问题会Text2SQL 查询MySQL数据库的信息呢,又或者用户提出的问题是否两个数据库都要检索查询呢。这就引出了本文所要分享的内容,查询前处理。

查询前处理是在用户提问之后,RAG系统去做检索查询之前做的事情。为了系统能够给出最精确的回答,需要在查询的过程做些优化。其实就是调用LLM模型将用户提出的问题处理一遍,再进行下一步动作。以下是查询前处理的一些思路。
01
—
查询改写
在用户提出问题后,调用LLM大模型看下问题描述是否清晰。如果问题描述不清晰让LLM大模型对问题进行改写,改写成更适合检索表结构、字段、示例的标准问题。
比如提问:今年一二月大概赚了多少钱,各项收入和纯利润分别是多少呀?
改写后:今年1月至2月的净利润和各项收入明细是多少?
流程图

代码样例
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
# 配置你的大模型API
API_KEY = os.getenv("R_PROXY_AI_API_KEY")
BASE_URL = os.getenv("R_PROXY_AI_BASE_URL")
MODEL = os.getenv("MODEL")
# DeepSeek、openAI都可以
client = OpenAI(
base_url=BASE_URL,
api_key=API_KEY
)
def finance_rewrite_query(question: str) -> str:
"""财务业务专用:用户口语问题清洗重写"""
prompt = """你是财务数据分析助手,对用户的财务问题进行重写优化。
规则:
1. 去掉无关闲聊、个人感慨、语气助词、废话
2. 替换为标准财务术语:净利润、主营业务收入、应收账款、应付账款、管理费用、资产负债等
3. 保留原始查询核心意图:时间、维度、统计诉求
4. 把模糊口语改成精准可查询的问句
只返回重写后的问题,不要任何解释、不要多余文字。
原始问题:{question}
"""
response = client.chat.completions.create(
model= MODEL,
messages=[{"role": "user", "content": prompt.format(question=question)}],
temperature=0
)
return response.choices[0].message.content.strip()
# 测试(财务口语问题)
if __name__ == "__main__":
raw_q = "今年一二月大概赚了多少钱,各项收入和纯利润分别是多少呀?"
print("原始问题:", raw_q)
print("重写后:", finance_rewrite_query(raw_q))
02
—
查询拆分
在用户提出问题后,调用LLM大模型将问题拆分成几个小问题,系统对每个小问题进行检索查询。
流程图

代码样例
from openai import OpenAI
import os
import logging
from dotenv import load_dotenv
from langchain_chroma import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.retrievers.multi_query import MultiQueryRetriever
# 加载环境
load_dotenv()
logging.basicConfig()
logging.getLogger("langchain.retrievers.multi_query").setLevel(logging.INFO)
# ===================== 你的 LLM 配置 =====================
API_KEY = os.getenv("R_PROXY_AI_API_KEY")
BASE_URL = os.getenv("R_PROXY_AI_BASE_URL")
MODEL = os.getenv("MODEL")
llm = OpenAI(
base_url=BASE_URL,
api_key=API_KEY,
default_headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
)
# ===================== 1. 加载财务知识库文档 =====================
# 你可以换成你的财务制度/报销规则文档
loader = TextLoader("你的财务知识库.txt", encoding='utf-8')
data = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=100)
splits = text_splitter.split_documents(data)
# 向量库
embed_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")
vectorstore = Chroma.from_documents(documents=splits, embedding=embed_model)
# ===================== 2. 多问题检索器(自动拆分问题) =====================
from langchain_openai import ChatOpenAI
# 包装成 LangChain LLM(必须这一步,才能用 MultiQueryRetriever)
langchain_llm = ChatOpenAI(
base_url=BASE_URL,
api_key=API_KEY,
model=MODEL,
temperature=0
)
# 核心:自动把用户问题拆成多个子问题 + 自动检索
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
llm=langchain_llm
)
# ===================== 3. 测试:财务复杂问题 =====================
if __name__ == "__main__":
# 你的复杂问题(包含多个诉求)
raw_query = """今年一二月大概赚了多少钱,各项收入和纯利润分别是多少呀?"""
print("原始问题:", raw_query)
print("=" * 80)
# 自动拆分 + 自动检索
docs = multi_query_retriever.invoke(raw_query)
print("最终检索到的文档:")
for idx, doc in enumerate(docs):
print(f"\n【文档 {idx+1}】")
print(doc.page_content)
03
—
生成HyDE假设性文档
在用户提出问题后,调用LLM大模型把问题回答一遍,生成假设性文档HyDE (Hypothetical Document Embeddings),再把这篇HyDE文档做向量,去 Milvus 做相似度检索。
流程图

代码样例
# ======================== 财务场景 HyDE 实现 ========================
from langchain.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_chroma import Chroma
from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
API_KEY = os.getenv("R_PROXY_AI_API_KEY")
BASE_URL = os.getenv("R_PROXY_AI_BASE_URL")
MODEL = os.getenv("MODEL")
# ===================== 1. 初始化 LLM =====================
llm = ChatOpenAI(
base_url=BASE_URL,
api_key=API_KEY,
model=MODEL,
temperature=0
)
# ===================== 2. 财务知识库向量库(你已有的) =====================
# 这里你可以继续用你的财务制度/报销文档
embed_model = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh")
vectorstore = Chroma(
embedding_function=embed_model,
persist_directory="./chroma_db" # 你已有的向量库
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
# ===================== 3. 【财务专用】HyDE 假设文档生成模板 =====================
hyde_template = """你是一位专业的财务分析师,请根据以下财务问题,撰写一段专业、详细、结构完整的假设性财务分析文档。
不需要真实数据,只需模拟正式的财务报告内容,用于文档检索。
问题:{question}
财务分析文档:
"""
hyde_prompt = ChatPromptTemplate.from_template(hyde_template)
# 构建 HyDE 文档生成链
hyde_chain = hyde_prompt | llm | StrOutputParser()
# ===================== 4. 测试:你的财务问题 =====================
if __name__ == "__main__":
# 你的真实业务问题
question = "今年一二月大概赚了多少钱,各项收入和纯利润分别是多少呀?"
print("原始问题:")
print(question)
print("=" * 80)
# --------------------- ① 生成 HyDE 假设文档 ---------------------
hyde_doc = hyde_chain.invoke({"question": question})
print("生成的 HyDE 假设性财务文档:")
print(hyde_doc)
print("=" * 80)
# --------------------- ② 用 HyDE 文档去检索真实知识库 ---------------------
retrieved_docs = retriever.invoke(hyde_doc)
print("根据 HyDE 文档检索到的财务知识:")
for i, doc in enumerate(retrieved_docs, 1):
print(f"\n检索文档 {i}:")
print(doc.page_content)
print("=" * 80)
# --------------------- ③ 最终生成答案 ---------------------
answer_prompt = ChatPromptTemplate.from_template("""
你是专业财务助手,请根据检索到的财务资料,准确回答用户问题。
资料:
{context}
用户问题:{question}
请给出专业、简洁、清晰的回答:
""")
final_chain = answer_prompt | llm | StrOutputParser()
final_answer = final_chain.invoke({
"context": retrieved_docs,
"question": question
})
print("最终财务回答:")
print(final_answer)
04
—
查询路由
按问题领域分到不同的数据库,比如统计类问题查询MySQL 数据,语义相关问题检索Milvus向量数据库数据。调用LLM模型分析问题走哪个数据库,进而进行相对应数据库的查询。
流程图

代码样例
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
import json
# ===================== 加载环境 =====================
load_dotenv()
API_KEY = os.getenv("R_PROXY_AI_API_KEY")
BASE_URL = os.getenv("R_PROXY_AI_BASE_URL")
MODEL = os.getenv("MODEL")
# ===================== LLM =====================
llm = ChatOpenAI(
base_url=BASE_URL,
api_key=API_KEY,
model=MODEL,
temperature=0
)
# ===================== 路由提示词=====================
system_prompt = """
你是专业财务数据路由专家,只按规则判断,输出纯JSON,不要其他内容。
规则:
1)统计、数值、收入、利润、金额、报表 → "mysql"
2)制度、报销、流程、规则、政策、定义 → "milvus"
输出格式:
{{"datasource": "mysql"}} 或 {{"datasource": "milvus"}}
"""
prompt = ChatPromptTemplate.from_messages([
("system", system_prompt),
("human", "{question}")
])
# 构建路由链
route_chain = prompt | llm
# ===================== 执行路由 =====================
def finance_route_question(question: str) -> str:
response = route_chain.invoke({"question": question})
result = json.loads(response.content.strip())
return result["datasource"]
# ===================== 测试 =====================
if __name__ == "__main__":
q1 = "今年一二月收入和净利润是多少?"
q2 = "财务报销流程是什么?"
print("问题1:", q1)
print("路由结果:", finance_route_question(q1))
print("-" * 50)
print("问题2:", q2)
print("路由结果:", finance_route_question(q2))
05
—
总结

查询前处理的目的,是为了让我们RAG系统能够给出最精确的回答!
最后
对于正在迷茫择业、想转行提升,或是刚入门的程序员、编程小白来说,有一个问题几乎人人都在问:未来10年,什么领域的职业发展潜力最大?
答案只有一个:人工智能(尤其是大模型方向)
当下,人工智能行业正处于爆发式增长期,其中大模型相关岗位更是供不应求,薪资待遇直接拉满——字节跳动作为AI领域的头部玩家,给硕士毕业的优质AI人才(含大模型相关方向)开出的月基础工资高达5万—6万元;即便是非“人才计划”的普通应聘者,月基础工资也能稳定在4万元左右。
再看阿里、腾讯两大互联网大厂,非“人才计划”的AI相关岗位应聘者,月基础工资也约有3万元,远超其他行业同资历岗位的薪资水平,对于程序员、小白来说,无疑是绝佳的转型和提升赛道。
如果你还不知道从何开始,我自己整理一套全网最全最细的大模型零基础教程,我也是一路自学走过来的,很清楚小白前期学习的痛楚,你要是没有方向还没有好的资源,根本学不到东西!
下面是我整理的大模型学习资源,希望能帮到你。

👇👇扫码免费领取全部内容👇👇

最后
1、大模型学习路线

2、从0到进阶大模型学习视频教程
从入门到进阶这里都有,跟着老师学习事半功倍。

3、 入门必看大模型学习书籍&文档.pdf(书面上的技术书籍确实太多了,这些是我精选出来的,还有很多不在图里)

4、 AI大模型最新行业报告
2026最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5、面试试题/经验

【大厂 AI 岗位面经分享(107 道)】

【AI 大模型面试真题(102 道)】

【LLMs 面试真题(97 道)】

6、大模型项目实战&配套源码

适用人群

四阶段学习规划(共90天,可落地执行)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
-
硬件选型
-
带你了解全球大模型
-
使用国产大模型服务
-
搭建 OpenAI 代理
-
热身:基于阿里云 PAI 部署 Stable Diffusion
-
在本地计算机运行大模型
-
大模型的私有化部署
-
基于 vLLM 部署大模型
-
案例:如何优雅地在阿里云私有部署开源大模型
-
部署一套开源 LLM 项目
-
内容安全
-
互联网信息服务算法备案
-
…
👇👇扫码免费领取全部内容👇👇

3、这些资料真的有用吗?
这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理,现任上海殷泊信息科技CEO,其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证,服务航天科工、国家电网等1000+企业,以第一作者在IEEE Transactions发表论文50+篇,获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的技术人员,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)