Query改写技术:让你的AI助手更懂你问的是什么!

🚀 爽文预警:这篇文章将带你快速掌握Query改写技术的精髓,让你的AI应用瞬间提升一个档次!

前言:为什么Query改写如此重要?

在构建智能问答系统时,我们经常会遇到这样的问题:

  • 用户说"还有吗?",AI却一脸懵逼

  • 用户问"哪个更好?",AI不知道在比较什么

  • 用户反问"这不会很贵吧?",AI答非所问

这些问题的根源在于:用户的查询往往不够明确!而Query改写技术就是解决这个问题的神器!

两大神器代码解析

🔥 神器一:通用Query改写器(1-Query改写.py)

这个文件简直就是Query改写的"瑞士军刀",能处理各种复杂查询:

1. 上下文依赖型Query改写
# 用户问:"还有其他设施吗?"
# AI理解:用户在问"上海迪士尼疯狂动物城园区还有其他设施吗?"
2. 对比型Query改写
# 用户问:"哪个游玩的时间比较长,比较有趣"
# AI理解:用户在比较"上海迪士尼疯狂动物城和蜘蛛侠主题园区哪个游玩时间更长更有趣?"
3. 模糊指代型Query改写
# 用户问:"都什么时候开始?"
# AI理解:用户在问"上海迪士尼乐园和香港迪士尼乐园的烟花表演什么时候开始?"
4. 多意图型Query改写
# 用户问:"门票多少钱?需要提前预约吗?停车费怎么收?"
# AI分解为:
# ["门票多少钱?", "需要提前预约吗?", "停车费怎么收?"]
5. 反问型Query改写
# 用户问:"这不会也要提前一个月预订吧?"
# AI理解:用户在问"上海迪士尼乐园门票需要提前多久预订?"

⚡ 神器二:联网搜索Query改写器(2-Query联网搜索改写.py)

这个文件专门处理需要实时信息的查询,比如:

1. 时效性信息查询
# 用户问:"上海迪士尼乐园今天开放吗?现在人多不多?"
# AI改写为搜索关键词:"上海迪士尼乐园 2024年10月28日 开放状态 实时人流量"
2. 价格和预订信息查询
# 用户问:"下周六的门票多少钱?需要提前多久预订?"
# AI改写为搜索关键词:"上海迪士尼乐园 下周六 门票价格 预订时间要求"

实战演示:迪士尼场景应用

让我们看看这两个神器在迪士尼场景下的实际表现:

场景一:计划游玩

用户:我想去上海迪士尼乐园玩
AI:上海迪士尼乐园是一个很棒的选择!
用户:上海迪士尼乐园今天开放吗?现在人多不多?
​
神器分析结果:
✓ 需要联网搜索
  搜索原因: 包含时效性信息(今天开放吗)和实时状态(现在人多不多)
  改写查询: 上海迪士尼乐园 2024年10月28日 开放时间 实时人流量
  搜索关键词: ['上海迪士尼乐园', '今日开放状态', '实时人流量']

场景二:购票咨询

用户:下周六的门票多少钱?需要提前多久预订?
​
神器分析结果:
✓ 需要联网搜索
  搜索原因: 包含价格信息(多少钱)和预订信息(需要提前多久预订)
  改写查询: 上海迪士尼乐园 下周六 门票价格 预订政策
  搜索关键词: ['上海迪士尼乐园', '下周六门票', '价格', '预订要求']

核心代码详解

通用Query改写器核心实现

class QueryRewriter:
    def __init__(self, model="qwen-turbo-latest"):
        self.model = model
    
    def auto_rewrite_query(self, query, conversation_history="", context_info=""):
        """自动识别Query类型并进行改写"""
        instruction = """
你是一个智能的查询分析专家。请分析用户的查询,识别其属于以下哪种类型:
1. 上下文依赖型 - 包含"还有"、"其他"等需要上下文理解的词汇
2. 对比型 - 包含"哪个"、"比较"、"更"、"哪个更好"、"哪个更"等比较词汇
3. 模糊指代型 - 包含"它"、"他们"、"都"、"这个"等指代词
4. 多意图型 - 包含多个独立问题,用"、"或"?"分隔
5. 反问型 - 包含"不会"、"难道"等反问语气
说明:如果同时存在多意图型、模糊指代型,优先级为多意图型>模糊指代型
​
请返回JSON格式的结果:
{
    "query_type": "查询类型",
    "rewritten_query": "改写后的查询",
    "confidence": "置信度(0-1)"
}
"""

代码解析:

  1. 类型识别:通过大模型提示词工程,让AI自动识别Query类型

  2. 优先级处理:定义了多意图型Query的优先级高于模糊指代型

  3. 结构化输出:统一返回JSON格式,便于后续处理

    def auto_rewrite_and_execute(self, query, conversation_history="", context_info=""):
        """自动识别Query类型并进行改写,然后根据类型调用相应的改写方法"""
        # 首先进行自动识别
        result = self.auto_rewrite_query(query, conversation_history, context_info)
        
        # 根据识别结果调用相应的改写方法
        query_type = result.get('query_type', '')
        
        if '上下文依赖' in query_type:
            final_result = self.rewrite_context_dependent_query(query, conversation_history)
        elif '对比' in query_type:
            final_result = self.rewrite_comparative_query(query, context_info or conversation_history)
        elif '模糊指代' in query_type:
            final_result = self.rewrite_ambiguous_reference_query(query, conversation_history)
        elif '多意图' in query_type:
            final_result = self.rewrite_multi_intent_query(query)
        elif '反问' in query_type:
            final_result = self.rewrite_rhetorical_query(query, conversation_history)
        else:
            # 对于其他类型,返回自动识别的改写结果
            final_result = result.get('rewritten_query', query)
        
        return {
            "original_query": query,
            "detected_type": query_type,
            "confidence": result.get('confidence', 0.5),
            "rewritten_query": final_result,
            "auto_rewrite_result": result
        }

代码解析:

  1. 分层处理:先识别类型,再针对性处理

  2. 方法分发:根据不同类型调用对应的改写方法

  3. 结果整合:将原始查询、识别类型、置信度和改写结果统一返回

联网搜索Query改写器核心实现

class WebSearchQueryRewriter:
    def __init__(self, model="qwen-turbo-latest"):
        self.model = model
    
    def identify_web_search_needs(self, query, conversation_history=""):
        """识别查询是否需要联网搜索"""
        instruction = """
你是一个智能的查询分析专家。请分析用户的查询,判断是否需要联网搜索来获取最新、最准确的信息。
​
需要联网搜索的情况包括:
1. 时效性信息 - 包含"最新"、"今天"、"现在"、"实时"、"当前"等时间相关词汇
2. 价格信息 - 包含"多少钱"、"价格"、"费用"、"票价"等价格相关词汇
3. 营业信息 - 包含"营业时间"、"开放时间"、"闭园时间"、"是否开放"等营业状态
4. 活动信息 - 包含"活动"、"表演"、"演出"、"节日"、"庆典"等动态信息
5. 天气信息 - 包含"天气"、"下雨"、"温度"等天气相关
6. 交通信息 - 包含"怎么去"、"交通"、"地铁"、"公交"等交通方式
7. 预订信息 - 包含"预订"、"预约"、"购票"、"订票"等预订相关
8. 实时状态 - 包含"排队"、"拥挤"、"人流量"等实时状态

代码解析:

  1. 智能识别:通过提示词工程,让AI判断哪些查询需要实时信息

  2. 分类明确:定义了8种需要联网搜索的查询类型

  3. 置信度评估:返回判断的置信度,便于后续决策

    def auto_web_search_rewrite(self, query, conversation_history=""):
        """自动识别并改写为联网搜索查询"""
        # 第一步:识别是否需要联网搜索
        search_analysis = self.identify_web_search_needs(query, conversation_history)
        
        if not search_analysis.get('need_web_search', False):
            return {
                "need_web_search": False,
                "reason": "查询不需要联网搜索",
                "original_query": query
            }
        
        # 第二步:改写查询
        rewritten_result = self.rewrite_for_web_search(query)
        
        # 第三步:生成搜索策略
        search_strategy = self.generate_search_strategy(query)
        
        return {
            "need_web_search": True,
            "search_reason": search_analysis.get('search_reason', ''),
            "confidence": search_analysis.get('confidence', 0.5),
            "original_query": query,
            "rewritten_query": rewritten_result.get('rewritten_query', query),
            "search_keywords": rewritten_result.get('search_keywords', []),
            "search_intent": rewritten_result.get('search_intent', ''),
            "suggested_sources": rewritten_result.get('suggested_sources', []),
            "search_strategy": search_strategy
        }

代码解析:

  1. 三步处理:识别→改写→生成策略,流程清晰

  2. 早期退出:如果不需要联网搜索,直接返回结果

  3. 策略完整:不仅改写查询,还生成完整的搜索策略

发展方向展望

🚀 1. 智能化升级

  • 自适应学习:根据用户反馈自动优化改写策略

  • 个性化改写:根据不同用户的历史行为定制改写方式

🌐 2. 多模态融合

  • 图像理解:结合图片内容进行Query改写

  • 语音识别:处理语音查询中的模糊表达

🧠 3. 深度理解增强

  • 情感分析:识别用户情绪,调整改写策略

  • 意图预测:预测用户下一步可能的查询

📱 4. 应用场景拓展

  • 电商搜索:商品查询优化

  • 医疗问诊:症状描述规范化

  • 教育辅导:学习问题精准化

🌍 5. 多语言支持

  • 跨语言Query改写:支持多语言查询的相互转换

  • 文化适配:根据不同文化背景调整表达方式

技术实现要点

核心技术栈

# 基于通义千问大模型
import dashscope
from datetime import datetime
import json
import re

关键设计思路

  1. 分层处理:先识别Query类型,再针对性改写

  2. 上下文感知:充分利用对话历史信息

  3. 结构化输出:统一的JSON格式便于后续处理

  4. 置信度评估:量化改写结果的可靠性

结语

Query改写技术就像AI的"读心术",能让机器真正理解用户想要什么。掌握了这两大神器,你的AI应用将不再是简单的问答机器人,而是真正懂用户的智能助手!

💡 小贴士:在实际应用中,建议将这两种改写技术结合使用,先判断Query类型,再决定是否需要联网搜索,最后进行针对性改写。

未来已来,让我们一起用Query改写技术打造更智能的AI应用吧!✨

代码

Query改写\1-Query改写.py

# Query改写使用示例
# 导入依赖库
import dashscope
import os
import json

# 从环境变量中获取 API Key
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY')

# 基于 prompt 生成文本
def get_completion(prompt, model="qwen-turbo-latest"):
    messages = [{"role": "user", "content": prompt}]
    response = dashscope.Generation.call(
        model=model,
        messages=messages,
        result_format='message',
        temperature=0,
    )
    return response.output.choices[0].message.content

# Query改写功能
class QueryRewriter:
    def __init__(self, model="qwen-turbo-latest"):
        self.model = model
    
    def rewrite_context_dependent_query(self, current_query, conversation_history):
        """上下文依赖型Query改写"""
        instruction = """
你是一个智能的查询优化助手。请分析用户的当前问题以及前序对话历史,判断当前问题是否依赖于上下文。
如果依赖,请将当前问题改写成一个独立的、包含所有必要上下文信息的完整问题。
如果不依赖,直接返回原问题。
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 对话历史 ###
{conversation_history}

### 当前问题 ###
{current_query}

### 改写后的问题 ###
"""
        
        return get_completion(prompt, self.model)
    
    def rewrite_comparative_query(self, query, context_info):
        """对比型Query改写"""
        instruction = """
你是一个查询分析专家。请分析用户的输入和相关的对话上下文,识别出问题中需要进行比较的多个对象。
然后,将原始问题改写成一个更明确、更适合在知识库中检索的对比性查询。
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 对话历史/上下文信息 ###
{context_info}

### 原始问题 ###
{query}

### 改写后的查询 ###
"""
        
        return get_completion(prompt, self.model)
    
    def rewrite_ambiguous_reference_query(self, current_query, conversation_history):
        """模糊指代型Query改写"""
        instruction = """
你是一个消除语言歧义的专家。请分析用户的当前问题和对话历史,找出问题中 "都"、"它"、"这个" 等模糊指代词具体指向的对象。
然后,将这些指代词替换为明确的对象名称,生成一个清晰、无歧义的新问题。
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 对话历史 ###
{conversation_history}

### 当前问题 ###
{current_query}

### 改写后的问题 ###
"""
        
        return get_completion(prompt, self.model)
    
    def rewrite_multi_intent_query(self, query):
        """多意图型Query改写 - 分解查询"""
        instruction = """
你是一个任务分解机器人。请将用户的复杂问题分解成多个独立的、可以单独回答的简单问题。以JSON数组格式输出。
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 原始问题 ###
{query}

### 分解后的问题列表 ###
请以JSON数组格式输出,例如:["问题1", "问题2", "问题3"]
"""
        
        response = get_completion(prompt, self.model)
        try:
            return json.loads(response)
        except:
            return [response]
    
    def rewrite_rhetorical_query(self, current_query, conversation_history):
        """反问型Query改写"""
        instruction = """
你是一个沟通理解大师。请分析用户的反问或带有情绪的陈述,识别其背后真实的意图和问题。
然后,将这个反问改写成一个中立、客观、可以直接用于知识库检索的问题。
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 对话历史 ###
{conversation_history}

### 当前问题 ###
{current_query}

### 改写后的问题 ###
"""
        
        return get_completion(prompt, self.model)
    
    def auto_rewrite_query(self, query, conversation_history="", context_info=""):
        """自动识别Query类型并进行改写"""
        instruction = """
你是一个智能的查询分析专家。请分析用户的查询,识别其属于以下哪种类型:
1. 上下文依赖型 - 包含"还有"、"其他"等需要上下文理解的词汇
2. 对比型 - 包含"哪个"、"比较"、"更"、"哪个更好"、"哪个更"等比较词汇
3. 模糊指代型 - 包含"它"、"他们"、"都"、"这个"等指代词
4. 多意图型 - 包含多个独立问题,用"、"或"?"分隔
5. 反问型 - 包含"不会"、"难道"等反问语气
说明:如果同时存在多意图型、模糊指代型,优先级为多意图型>模糊指代型

请返回JSON格式的结果:
{
    "query_type": "查询类型",
    "rewritten_query": "改写后的查询",
    "confidence": "置信度(0-1)"
}
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 对话历史 ###
{conversation_history}

### 上下文信息 ###
{context_info}

### 原始查询 ###
{query}

### 分析结果 ###
"""
        
        response = get_completion(prompt, self.model)
        try:
            return json.loads(response)
        except:
            return {
                "query_type": "未知类型",
                "rewritten_query": query,
                "confidence": 0.5
            }
    
    def auto_rewrite_and_execute(self, query, conversation_history="", context_info=""):
        """自动识别Query类型并进行改写,然后根据类型调用相应的改写方法"""
        # 首先进行自动识别
        result = self.auto_rewrite_query(query, conversation_history, context_info)
        
        # 根据识别结果调用相应的改写方法
        query_type = result.get('query_type', '')
        
        if '上下文依赖' in query_type:
            final_result = self.rewrite_context_dependent_query(query, conversation_history)
        elif '对比' in query_type:
            final_result = self.rewrite_comparative_query(query, context_info or conversation_history)
        elif '模糊指代' in query_type:
            final_result = self.rewrite_ambiguous_reference_query(query, conversation_history)
        elif '多意图' in query_type:
            final_result = self.rewrite_multi_intent_query(query)
        elif '反问' in query_type:
            final_result = self.rewrite_rhetorical_query(query, conversation_history)
        else:
            # 对于其他类型,返回自动识别的改写结果
            final_result = result.get('rewritten_query', query)
        
        return {
            "original_query": query,
            "detected_type": query_type,
            "confidence": result.get('confidence', 0.5),
            "rewritten_query": final_result,
            "auto_rewrite_result": result
        }

def main():
    # 初始化Query改写器
    rewriter = QueryRewriter()    
    print("=== Query改写功能使用示例(迪士尼主题乐园) ===\n")
    
    # 示例1: 上下文依赖型Query
    print("示例1: 上下文依赖型Query")
    conversation_history = """
用户: "我想了解一下上海迪士尼乐园的最新项目。"
AI: "上海迪士尼乐园最新推出了'疯狂动物城'主题园区,这里有朱迪警官和尼克狐的互动体验。"
用户: "这个园区有什么游乐设施?"
AI: "'疯狂动物城'园区目前有疯狂动物城警察局、朱迪警官训练营和尼克狐的冰淇淋店等设施。"
"""
    current_query = "还有其他设施吗?"
    
    print(f"对话历史: {conversation_history}")
    print(f"当前查询: {current_query}")
    
    result = rewriter.rewrite_context_dependent_query(current_query, conversation_history)
    print(f"改写结果: {result}\n")
    
    # 示例2: 对比型Query
    print("示例2: 对比型Query")
    conversation_history = """
用户: "我想了解一下上海迪士尼乐园的最新项目。"
AI: "上海迪士尼乐园最新推出了疯狂动物城主题园区,还有蜘蛛侠主题园区"
"""
    current_query = "哪个游玩的时间比较长,比较有趣"
    
    print(f"对话历史: {conversation_history}")
    print(f"当前查询: {current_query}")
    
    result = rewriter.rewrite_comparative_query(current_query, conversation_history)
    print(f"改写结果: {result}\n")
    
    # 示例3: 模糊指代型Query
    print("示例3: 模糊指代型Query")
    conversation_history = """
用户: "我想了解一下上海迪士尼乐园和香港迪士尼乐园的烟花表演。"
AI: "好的,上海迪士尼乐园和香港迪士尼乐园都有精彩的烟花表演。"
"""
    current_query = "都什么时候开始?"
    
    print(f"对话历史: {conversation_history}")
    print(f"当前查询: {current_query}")
    
    result = rewriter.rewrite_ambiguous_reference_query(current_query, conversation_history)
    print(f"改写结果: {result}\n")
    
    # 示例4: 多意图型Query
    print("示例4: 多意图型Query")
    query = "门票多少钱?需要提前预约吗?停车费怎么收?"
    
    print(f"原始查询: {query}")
    
    result = rewriter.rewrite_multi_intent_query(query)
    print(f"分解结果: {result}\n")
    
    # 示例5: 反问型Query
    print("示例5: 反问型Query")
    conversation_history = """
用户: "你好,我想预订下周六上海迪士尼乐园的门票。"
AI: "正在为您查询... 查询到下周六的门票已经售罄。"
用户: "售罄是什么意思?我朋友上周去还能买到当天的票。"
"""
    current_query = "这不会也要提前一个月预订吧?"
    
    print(f"对话历史: {conversation_history}")
    print(f"当前查询: {current_query}")
    
    result = rewriter.rewrite_rhetorical_query(current_query, conversation_history)
    print(f"改写结果: {result}\n")
    
    # 示例6: 自动识别Query类型
    print("示例6: 自动识别Query类型")
    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']}\n")

if __name__ == "__main__":
    main() 

Query改写\2-Query联网搜索改写.py

# Query联网搜索改写功能
# 导入依赖库
import dashscope
import os
import json
import re
from datetime import datetime

# 从环境变量中获取 API Key
dashscope.api_key = os.getenv('DASHSCOPE_API_KEY')

# 基于 prompt 生成文本
def get_completion(prompt, model="qwen-turbo-latest"):
    messages = [{"role": "user", "content": prompt}]
    response = dashscope.Generation.call(
        model=model,
        messages=messages,
        result_format='message',
        temperature=0,
    )
    return response.output.choices[0].message.content

class WebSearchQueryRewriter:
    def __init__(self, model="qwen-turbo-latest"):
        self.model = model
    
    def identify_web_search_needs(self, query, conversation_history=""):
        """识别查询是否需要联网搜索"""
        instruction = """
你是一个智能的查询分析专家。请分析用户的查询,判断是否需要联网搜索来获取最新、最准确的信息。

需要联网搜索的情况包括:
1. 时效性信息 - 包含"最新"、"今天"、"现在"、"实时"、"当前"等时间相关词汇
2. 价格信息 - 包含"多少钱"、"价格"、"费用"、"票价"等价格相关词汇
3. 营业信息 - 包含"营业时间"、"开放时间"、"闭园时间"、"是否开放"等营业状态
4. 活动信息 - 包含"活动"、"表演"、"演出"、"节日"、"庆典"等动态信息
5. 天气信息 - 包含"天气"、"下雨"、"温度"等天气相关
6. 交通信息 - 包含"怎么去"、"交通"、"地铁"、"公交"等交通方式
7. 预订信息 - 包含"预订"、"预约"、"购票"、"订票"等预订相关
8. 实时状态 - 包含"排队"、"拥挤"、"人流量"等实时状态

请返回JSON格式:
{
    "need_web_search": true/false,
    "search_reason": "需要搜索的原因",
    "confidence": "置信度(0-1)"
}
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 对话历史 ###
{conversation_history}

### 用户查询 ###
{query}

### 分析结果 ###
"""
        
        response = get_completion(prompt, self.model)
        try:
            return json.loads(response)
        except:
            return {
                "need_web_search": False,
                "search_reason": "无法解析",
                "confidence": 0.5
            }
    
    def rewrite_for_web_search(self, query, search_type="general"):
        """为联网搜索改写查询"""
        instruction = """
你是一个专业的搜索查询优化专家。请将用户的查询改写为更适合搜索引擎检索的形式。

改写技巧:
1. 添加具体地点 - 如"上海迪士尼乐园"、"香港迪士尼乐园"
2. 添加时间范围 - 如"2024年"、"今天"、"本周"
3. 使用关键词组合 - 将长句拆分为关键词
4. 添加搜索意图 - 明确搜索目的
5. 去除口语化表达 - 转换为标准搜索词
6. 添加相关词汇 - 增加同义词或相关词

请返回JSON格式:
{
    "rewritten_query": "改写后的搜索查询",
    "search_keywords": ["关键词1", "关键词2", "关键词3"],
    "search_intent": "搜索意图",
    "suggested_sources": ["建议搜索的网站类型"]
}
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 原始查询 ###
{query}

### 搜索类型 ###
{search_type}

### 改写结果 ###
"""
        
        response = get_completion(prompt, self.model)
        try:
            return json.loads(response)
        except:
            return {
                "rewritten_query": query,
                "search_keywords": [query],
                "search_intent": "信息查询",
                "suggested_sources": ["官方网站", "旅游网站"]
            }
    
    def generate_search_strategy(self, query, search_type="general"):
        """生成搜索策略"""
        current_date = datetime.now().strftime("%Y年%m月%d日")
        instruction = f"""
你是一个搜索策略专家。请为用户的查询制定详细的搜索策略。

当前日期:{current_date}

搜索策略包括:
1. 主要搜索词 - 核心关键词
2. 扩展搜索词 - 相关词汇和同义词
3. 搜索网站 - 推荐的搜索平台
4. 时间范围 - 具体的搜索时间范围

请返回JSON格式:
{{
    "primary_keywords": ["主要关键词"],
    "extended_keywords": ["扩展关键词"],
    "search_platforms": ["搜索平台"],
    "time_range": "具体的时间范围"
}}
"""
        
        prompt = f"""
### 指令 ###
{instruction}

### 用户查询 ###
{query}

### 搜索类型 ###
{search_type}

### 搜索策略 ###
"""
        
        response = get_completion(prompt, self.model)
        try:
            return json.loads(response)
        except:
            return {
                "primary_keywords": [query],
                "extended_keywords": [],
                "search_platforms": ["百度", "谷歌"],
                "time_range": "最近一周"
            }
    
    def auto_web_search_rewrite(self, query, conversation_history=""):
        """自动识别并改写为联网搜索查询"""
        # 第一步:识别是否需要联网搜索
        search_analysis = self.identify_web_search_needs(query, conversation_history)
        
        if not search_analysis.get('need_web_search', False):
            return {
                "need_web_search": False,
                "reason": "查询不需要联网搜索",
                "original_query": query
            }
        
        # 第二步:改写查询
        rewritten_result = self.rewrite_for_web_search(query)
        
        # 第三步:生成搜索策略
        search_strategy = self.generate_search_strategy(query)
        
        return {
            "need_web_search": True,
            "search_reason": search_analysis.get('search_reason', ''),
            "confidence": search_analysis.get('confidence', 0.5),
            "original_query": query,
            "rewritten_query": rewritten_result.get('rewritten_query', query),
            "search_keywords": rewritten_result.get('search_keywords', []),
            "search_intent": rewritten_result.get('search_intent', ''),
            "suggested_sources": rewritten_result.get('suggested_sources', []),
            "search_strategy": search_strategy
        }

def main():
    # 初始化联网搜索Query改写器
    web_searcher = WebSearchQueryRewriter()
    
    print("=== Query联网搜索识别与改写示例(迪士尼主题乐园) ===\n")
    
    # 示例1: 时效性信息查询
    print("示例1: 时效性信息查询")
    conversation_history1 = """
用户: "我想去上海迪士尼乐园玩"
AI: "上海迪士尼乐园是一个很棒的选择!"
"""
    query1 = "上海迪士尼乐园今天开放吗?现在人多不多?"
    
    print(f"对话历史: {conversation_history1}")
    print(f"当前查询: {query1}")
    
    result1 = web_searcher.auto_web_search_rewrite(query1, conversation_history1)
    
    if result1['need_web_search']:
        print(f"✓ 需要联网搜索")
        print(f"  搜索原因: {result1['search_reason']}")
        print(f"  置信度: {result1['confidence']}")
        print(f"  改写查询: {result1['rewritten_query']}")
        print(f"  搜索关键词: {result1['search_keywords']}")
        print(f"  搜索意图: {result1['search_intent']}")
        print(f"  建议来源: {result1['suggested_sources']}")
        print(f"  搜索策略:")
        print(f"    - 主要关键词: {result1['search_strategy']['primary_keywords']}")
        print(f"    - 扩展关键词: {result1['search_strategy']['extended_keywords']}")
        print(f"    - 搜索平台: {result1['search_strategy']['search_platforms']}")
        print(f"    - 时间范围: {result1['search_strategy']['time_range']}")
    else:
        print(f"✗ 不需要联网搜索")
        print(f"  原因: {result1['reason']}")
    
    print("\n" + "="*60 + "\n")
    
    # 示例2: 价格和预订信息查询
    print("示例2: 价格和预订信息查询")
    query2 = "下周六的门票多少钱?需要提前多久预订?"
    
    print(f"当前查询: {query2}")
    
    result2 = web_searcher.auto_web_search_rewrite(query2)
    
    if result2['need_web_search']:
        print(f"✓ 需要联网搜索")
        print(f"  搜索原因: {result2['search_reason']}")
        print(f"  置信度: {result2['confidence']}")
        print(f"  改写查询: {result2['rewritten_query']}")
        print(f"  搜索关键词: {result2['search_keywords']}")
        print(f"  搜索意图: {result2['search_intent']}")
        print(f"  建议来源: {result2['suggested_sources']}")
        print(f"  搜索策略:")
        print(f"    - 主要关键词: {result2['search_strategy']['primary_keywords']}")
        print(f"    - 扩展关键词: {result2['search_strategy']['extended_keywords']}")
        print(f"    - 搜索平台: {result2['search_strategy']['search_platforms']}")
        print(f"    - 时间范围: {result2['search_strategy']['time_range']}")
    else:
        print(f"✗ 不需要联网搜索")
        print(f"  原因: {result2['reason']}")

if __name__ == "__main__":
    main() 

Logo

更多推荐