【AI大模型开发】-RAG系统Query改写以及支持联网搜索实战(附源码)
Query 改写技术是 RAG 系统中的重要组成部分,本项目实现了多种类型的查询改写功能,为智能问答系统提供了有力支持。通过自动识别和改写用户查询,系统可以更准确地理解用户意图,提高检索质量和回答准确性。结合多模态信息,处理包含图片、语音的查询引入用户个性化信息,提供定制化的查询改写与知识图谱结合,提高查询理解的深度和准确性开发更多领域特定的查询改写策略。
Query 改写技术与应用文档
1. 项目概述
Query 改写技术是 RAG(Retrieval-Augmented Generation)系统中的重要组成部分,用于优化用户查询,提高检索质量和准确性。本项目实现了多种类型的查询改写功能,包括上下文依赖型、对比型、模糊指代型、多意图型和反问型查询的识别与改写,同时支持联网搜索需求的识别和搜索策略生成。
2. 项目结构
CASEA-Query改写/
├── 1-Query改写.py # 基础Query改写功能
├── 2-Query联网搜索改写.py # 联网搜索Query改写功能
├── requirements.txt # 依赖库配置
└── 20260123025805_011/ # 文档目录
├── query_rewrite_documentation.html # HTML文档
└── query_rewrite_documentation.md # Markdown文档
3. 核心功能
3.1 基础 Query 改写功能
1. 上下文依赖型 Query 改写
识别并改写依赖于对话历史的查询,将其转换为独立的、包含所有必要上下文信息的完整问题。
2. 对比型 Query 改写
识别查询中的比较对象,将原始问题改写成更明确、更适合在知识库中检索的对比性查询。
3. 模糊指代型 Query 改写
识别查询中的指代词(如"它"、“他们”、"都"等),替换为明确的对象名称,生成清晰、无歧义的新问题。
4. 多意图型 Query 改写
将用户的复杂问题分解成多个独立的、可以单独回答的简单问题。
5. 反问型 Query 改写
分析用户的反问或带有情绪的陈述,识别其背后真实的意图和问题,改写成中立、客观的查询。
6. 自动识别 Query 类型
自动分析用户查询,识别其类型并进行相应的改写,返回包含查询类型、改写结果和置信度的分析结果。
3.2 联网搜索 Query 改写功能
1. 联网搜索需求识别
分析用户查询,判断是否需要联网搜索来获取最新、最准确的信息,识别搜索原因和置信度。
2. 搜索查询优化
将用户查询改写为更适合搜索引擎检索的形式,添加具体地点、时间范围,使用关键词组合等。
3. 搜索策略生成
为用户查询制定详细的搜索策略,包括主要搜索词、扩展搜索词、推荐的搜索平台和时间范围。
4. 安装与配置
4.1 依赖库安装
pip install -r requirements.txt
4.2 API 密钥配置
本项目使用阿里云的 DashScope API,需要配置 API 密钥:
# 设置环境变量
# Windows系统
setx DASHSCOPE_API_KEY "your_api_key"
# 或在代码中直接设置
dashscope.api_key = "your_api_key"
5. 使用指南
5.1 环境准备
在使用 Query 改写功能之前,需要完成以下环境准备:
- 安装必要的依赖库:
pip install -r requirements.txt - 配置 DashScope API 密钥:可通过环境变量或直接在代码中设置
- 确保 Python 版本为 3.7 或以上
5.2 基础 Query 改写使用
5.2.1 导入模块
# 导入Query改写器类
from 1-Query改写 import QueryRewriter
5.2.2 初始化改写器
# 初始化Query改写器(使用默认模型)
rewriter = QueryRewriter()
# 或指定使用的模型
rewriter = QueryRewriter(model="qwen-plus")
5.2.3 上下文依赖型 Query 改写
示例:上下文依赖型 Query 改写
from 1-Query改写 import QueryRewriter
# 初始化Query改写器
rewriter = QueryRewriter()
# 对话历史
conversation_history = """
用户: "我想了解一下上海迪士尼乐园的最新项目。"
AI: "上海迪士尼乐园最新推出了'疯狂动物城'主题园区,这里有朱迪警官和尼克狐的互动体验。"
用户: "这个园区有什么游乐设施?"
AI: "'疯狂动物城'园区目前有疯狂动物城警察局、朱迪警官训练营和尼克狐的冰淇淋店等设施。"
"""
# 当前查询
current_query = "还有其他设施吗?"
# 执行改写
result = rewriter.rewrite_context_dependent_query(current_query, conversation_history)
print(f"改写结果: {result}")
# 预期输出示例:
# 改写结果: 上海迪士尼乐园的'疯狂动物城'主题园区除了疯狂动物城警察局、朱迪警官训练营和尼克狐的冰淇淋店外,还有其他什么设施吗?
5.2.4 对比型 Query 改写
示例:对比型 Query 改写
from 1-Query改写 import QueryRewriter
# 初始化Query改写器
rewriter = QueryRewriter()
# 上下文信息
context_info = """
用户: "我想了解一下上海迪士尼乐园的最新项目。"
AI: "上海迪士尼乐园最新推出了疯狂动物城主题园区,还有蜘蛛侠主题园区"
"""
# 原始查询
query = "哪个游玩的时间比较长,比较有趣"
# 执行改写
result = rewriter.rewrite_comparative_query(query, context_info)
print(f"改写结果: {result}")
# 预期输出示例:
# 改写结果: 上海迪士尼乐园的疯狂动物城主题园区和蜘蛛侠主题园区,哪个园区的游玩时间比较长,哪个园区比较有趣?
5.2.5 模糊指代型 Query 改写
示例:模糊指代型 Query 改写
from 1-Query改写 import QueryRewriter
# 初始化Query改写器
rewriter = QueryRewriter()
# 对话历史
conversation_history = """
用户: "我想了解一下上海迪士尼乐园和香港迪士尼乐园的烟花表演。"
AI: "好的,上海迪士尼乐园和香港迪士尼乐园都有精彩的烟花表演。"
"""
# 当前查询
current_query = "都什么时候开始?"
# 执行改写
result = rewriter.rewrite_ambiguous_reference_query(current_query, conversation_history)
print(f"改写结果: {result}")
# 预期输出示例:
# 改写结果: 上海迪士尼乐园和香港迪士尼乐园的烟花表演都什么时候开始?
5.2.6 多意图型 Query 改写
示例:多意图型 Query 改写
from 1-Query改写 import QueryRewriter
# 初始化Query改写器
rewriter = QueryRewriter()
# 原始查询
query = "有什么餐厅?价格怎么样?"
# 执行改写
result = rewriter.rewrite_multi_intent_query(query)
print(f"分解结果: {result}")
# 预期输出示例:
# 分解结果: ["上海迪士尼乐园有什么餐厅?", "上海迪士尼乐园的餐厅价格怎么样?"]
5.2.7 反问型 Query 改写
示例:反问型 Query 改写
from 1-Query改写 import QueryRewriter
# 初始化Query改写器
rewriter = QueryRewriter()
# 对话历史
conversation_history = """
用户: "你好,我想预订下周六上海迪士尼乐园的门票。"
AI: "正在为您查询... 查询到下周六的门票已经售罄。"
用户: "售罄是什么意思?我朋友上周去还能买到当天的票。"
"""
# 当前查询
current_query = "这不会也要提前一个月预订吧?"
# 执行改写
result = rewriter.rewrite_rhetorical_query(current_query, conversation_history)
print(f"改写结果: {result}")
# 预期输出示例:
# 改写结果: 上海迪士尼乐园的门票是否需要提前一个月预订?
5.2.8 自动识别 Query 类型
示例:自动识别 Query 类型
from 1-Query改写 import QueryRewriter
# 初始化Query改写器
rewriter = QueryRewriter()
# 测试查询
test_queries = [
"还有其他游乐项目吗?",
"哪个园区更好玩?",
"都适合小朋友吗?",
"有什么餐厅?价格怎么样?",
"这不会也要排队两小时吧?"
]
for i, query in enumerate(test_queries, 1):
print(f"测试查询 {i}: {query}")
result = rewriter.auto_rewrite_query(query)
print(f" 识别类型: {result['query_type']}")
print(f" 改写结果: {result['rewritten_query']}")
print(f" 置信度: {result['confidence']}")
print()
5.2.9 自动识别并执行改写
示例:自动识别并执行改写
from 1-Query改写 import QueryRewriter
# 初始化Query改写器
rewriter = QueryRewriter()
# 测试查询
query = "还有其他适合小朋友的游乐项目吗?"
# 对话历史
conversation_history = """
用户: "我想带孩子去上海迪士尼乐园玩"
AI: "上海迪士尼乐园有很多适合小朋友的游乐项目,比如小熊维尼历险记、小飞侠天空奇遇等。"
"""
# 执行自动改写
result = rewriter.auto_rewrite_and_execute(query, conversation_history)
# 输出结果
print(f"原始查询: {result['original_query']}")
print(f"检测类型: {result['detected_type']}")
print(f"置信度: {result['confidence']}")
print(f"改写结果: {result['rewritten_query']}")
# 预期输出示例:
# 原始查询: 还有其他适合小朋友的游乐项目吗?
# 检测类型: 上下文依赖型
# 置信度: 0.9
# 改写结果: 上海迪士尼乐园除了小熊维尼历险记、小飞侠天空奇遇等游乐项目外,还有其他适合小朋友的游乐项目吗?
5.3 联网搜索 Query 改写使用
5.3.1 导入模块
# 导入联网搜索Query改写器类
from 2-Query联网搜索改写 import WebSearchQueryRewriter
5.3.2 初始化改写器
# 初始化联网搜索Query改写器
web_searcher = WebSearchQueryRewriter()
# 或指定使用的模型
web_searcher = WebSearchQueryRewriter(model="qwen-plus")
5.3.3 联网搜索需求识别
示例:联网搜索需求识别
from 2-Query联网搜索改写 import WebSearchQueryRewriter
# 初始化联网搜索Query改写器
web_searcher = WebSearchQueryRewriter()
# 测试查询
queries = [
"上海迪士尼乐园今天开放吗?",
"上海迪士尼乐园有哪些游乐设施?",
"上海迪士尼乐园门票多少钱?",
"上海迪士尼乐园明天天气怎么样?"
]
for query in queries:
result = web_searcher.identify_web_search_needs(query)
print(f"查询: {query}")
print(f"需要搜索: {result['need_web_search']}")
print(f"搜索原因: {result['search_reason']}")
print(f"置信度: {result['confidence']}")
print()
5.3.4 为联网搜索改写查询
示例:为联网搜索改写查询
from 2-Query联网搜索改写 import WebSearchQueryRewriter
# 初始化联网搜索Query改写器
web_searcher = WebSearchQueryRewriter()
# 原始查询
query = "上海迪士尼乐园今天开放吗?现在人多不多?"
# 执行改写
result = web_searcher.rewrite_for_web_search(query)
# 输出结果
print(f"改写查询: {result['rewritten_query']}")
print(f"搜索关键词: {result['search_keywords']}")
print(f"搜索意图: {result['search_intent']}")
print(f"建议来源: {result['suggested_sources']}")
# 预期输出示例:
# 改写查询: 上海迪士尼乐园 今日开放时间 实时人流量 2024
# 搜索关键词: ["上海迪士尼乐园", "今日开放时间", "实时人流量", "2024"]
# 搜索意图: 实时信息查询
# 建议来源: ["上海迪士尼乐园官方网站", "旅游信息网站", "社交媒体实时更新"]
5.3.5 生成搜索策略
示例:生成搜索策略
from 2-Query联网搜索改写 import WebSearchQueryRewriter
# 初始化联网搜索Query改写器
web_searcher = WebSearchQueryRewriter()
# 用户查询
query = "上海迪士尼乐园门票多少钱?"
# 生成搜索策略
result = web_searcher.generate_search_strategy(query)
# 输出结果
print(f"主要关键词: {result['primary_keywords']}")
print(f"扩展关键词: {result['extended_keywords']}")
print(f"搜索平台: {result['search_platforms']}")
print(f"时间范围: {result['time_range']}")
# 预期输出示例:
# 主要关键词: ["上海迪士尼乐园", "门票价格"]
# 扩展关键词: ["上海迪士尼乐园票价", "上海迪士尼乐园门票费用", "上海迪士尼乐园门票预订"]
# 搜索平台: ["百度", "谷歌", "上海迪士尼乐园官方网站"]
# 时间范围: 最近一个月
5.3.6 自动识别并执行联网搜索改写
示例:自动识别并执行联网搜索改写
from 2-Query联网搜索改写 import WebSearchQueryRewriter
# 初始化联网搜索Query改写器
web_searcher = WebSearchQueryRewriter()
# 对话历史
conversation_history = """
用户: "我想去上海迪士尼乐园玩"
AI: "上海迪士尼乐园是一个很棒的选择!"
"""
# 当前查询
query = "上海迪士尼乐园今天开放吗?现在人多不多?"
# 执行自动识别和改写
result = web_searcher.auto_web_search_rewrite(query, conversation_history)
if result['need_web_search']:
print(f"✓ 需要联网搜索")
print(f" 搜索原因: {result['search_reason']}")
print(f" 置信度: {result['confidence']}")
print(f" 改写查询: {result['rewritten_query']}")
print(f" 搜索关键词: {result['search_keywords']}")
print(f" 搜索意图: {result['search_intent']}")
print(f" 建议来源: {result['suggested_sources']}")
print(f" 搜索策略:")
print(f" - 主要关键词: {result['search_strategy']['primary_keywords']}")
print(f" - 扩展关键词: {result['search_strategy']['extended_keywords']}")
print(f" - 搜索平台: {result['search_strategy']['search_platforms']}")
print(f" - 时间范围: {result['search_strategy']['time_range']}")
else:
print(f"✗ 不需要联网搜索")
print(f" 原因: {result['reason']}")
5.4 实际应用示例
5.4.1 智能客服系统集成
示例:智能客服系统集成
from 1-Query改写 import QueryRewriter
from 2-Query联网搜索改写 import WebSearchQueryRewriter
class SmartCustomerService:
def __init__(self):
self.query_rewriter = QueryRewriter()
self.web_search_rewriter = WebSearchQueryRewriter()
self.conversation_history = ""
def process_query(self, user_query):
# 更新对话历史
self.conversation_history += f"用户: \"{user_query}\"\n"
# 首先检查是否需要联网搜索
web_search_result = self.web_search_rewriter.auto_web_search_rewrite(user_query, self.conversation_history)
if web_search_result['need_web_search']:
# 需要联网搜索,返回搜索建议
response = f"为了给您提供准确的信息,我需要查询最新数据。\n"
response += f"搜索关键词: {', '.join(web_search_result['search_keywords'])}\n"
response += f"建议查询: {web_search_result['rewritten_query']}"
else:
# 不需要联网搜索,使用基础Query改写
rewrite_result = self.query_rewriter.auto_rewrite_and_execute(user_query, self.conversation_history)
# 模拟基于改写结果的回答
response = f"根据您的问题,我理解您想了解: {rewrite_result['rewritten_query']}\n"
response += f"这是一个{rewrite_result['detected_type']}类型的问题"
# 更新对话历史
self.conversation_history += f"AI: \"{response}\"\n"
return response
# 使用示例
service = SmartCustomerService()
# 测试对话
queries = [
"我想了解上海迪士尼乐园",
"有什么适合小朋友的项目?",
"门票多少钱?",
"今天开放吗?"
]
for query in queries:
print(f"用户: {query}")
response = service.process_query(query)
print(f"AI: {response}")
print()
6. 技术原理
6.1 Query 类型识别
系统使用大语言模型对用户查询进行分析,识别其类型。识别依据包括:
- 上下文依赖型:包含"还有"、"其他"等需要上下文理解的词汇
- 对比型:包含"哪个"、“比较”、“更”、"哪个更好"等比较词汇
- 模糊指代型:包含"它"、“他们”、“都”、"这个"等指代词
- 多意图型:包含多个独立问题,用"、“或”?"分隔
- 反问型:包含"不会"、"难道"等反问语气
6.2 联网搜索需求识别
系统识别需要联网搜索的情况包括:
- 时效性信息:包含"最新"、“今天”、“现在”、“实时”、"当前"等时间相关词汇
- 价格信息:包含"多少钱"、“价格”、“费用”、"票价"等价格相关词汇
- 营业信息:包含"营业时间"、“开放时间”、“闭园时间”、"是否开放"等营业状态
- 活动信息:包含"活动"、“表演”、“演出”、“节日”、"庆典"等动态信息
- 天气信息:包含"天气"、“下雨”、"温度"等天气相关
- 交通信息:包含"怎么去"、“交通”、“地铁”、"公交"等交通方式
- 预订信息:包含"预订"、“预约”、“购票”、"订票"等预订相关
- 实时状态:包含"排队"、“拥挤”、"人流量"等实时状态
6.3 搜索查询优化策略
系统采用以下策略优化搜索查询:
- 添加具体地点 - 如"上海迪士尼乐园"、“香港迪士尼乐园”
- 添加时间范围 - 如"2024 年"、“今天”、“本周”
- 使用关键词组合 - 将长句拆分为关键词
- 添加搜索意图 - 明确搜索目的
- 去除口语化表达 - 转换为标准搜索词
- 添加相关词汇 - 增加同义词或相关词
7. 示例与应用场景
7.1 智能客服系统
在智能客服系统中,Query 改写技术可以帮助理解用户的上下文依赖问题,提高回答的准确性和连贯性。
7.2 知识库检索系统
在知识库检索系统中,Query 改写可以优化用户查询,提高检索命中率和相关性。
7.3 旅游信息查询系统
在旅游信息查询系统中,Query 改写可以识别用户的实时信息需求,自动触发联网搜索,获取最新的景点信息、天气状况和交通情况。
7.4 电商购物助手
在电商购物助手中,Query 改写可以识别用户的比较需求和多意图问题,提供更精准的商品推荐和价格比较。
8. 性能与优化
8.1 模型选择
本项目默认使用"qwen-turbo-latest"模型,可根据实际需求选择其他模型:
- qwen-turbo-latest:响应速度快,适合实时应用
- qwen-plus:效果更好,适合对质量要求高的场景
- qwen-max:能力最强,适合复杂任务
8.2 优化建议
- 对于高频查询,可建立缓存机制,减少重复计算
- 可根据业务场景定制 Query 类型识别规则,提高识别准确率
- 可结合用户历史行为数据,优化查询改写策略
- 对于大规模应用,可考虑使用批处理方式提高效率
9. 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| API 调用失败 | API 密钥错误或过期 | 检查并更新 API 密钥 |
| 查询类型识别错误 | 查询表述不清晰或模型理解偏差 | 调整提示词或使用更高级的模型 |
| 改写结果不符合预期 | 对话历史信息不足或提示词设计不合理 | 提供更完整的对话历史,优化提示词 |
| 响应速度慢 | 模型处理时间长 | 使用更轻量级的模型或优化代码结构 |
10. 总结与展望
Query 改写技术是 RAG 系统中的重要组成部分,本项目实现了多种类型的查询改写功能,为智能问答系统提供了有力支持。通过自动识别和改写用户查询,系统可以更准确地理解用户意图,提高检索质量和回答准确性。
未来的发展方向包括:
- 结合多模态信息,处理包含图片、语音的查询
- 引入用户个性化信息,提供定制化的查询改写
- 与知识图谱结合,提高查询理解的深度和准确性
- 开发更多领域特定的查询改写策略
互动讨论
你对 Query 改写技术有什么看法?在你的项目中是否使用过类似的技术?欢迎在评论区分享你的经验和见解!如果你对本项目有任何问题或建议,也请随时提出,我们一起探讨如何进一步优化和应用 Query 改写技术。
更多推荐


所有评论(0)