基于反馈的Query改写:你说过的,我才最懂

​一、前言

本文对之前做过一段时间的Query改写(纠错,本文不严格区分这两种叫法)做一些总结,算法原理可以参考亚马逊的这篇论文:Feedback-Based Self-Learning in Large-Scale Conversational AI Agents。

二、方法

以前做Query纠错的一些通用思路是:基于大规模的线上日志训练一个相对置信的语言模型,基于相似度、编辑距离等方式挖掘一批高频词汇改写对,譬如说对于“伴奏兄弟”-->“半吨兄弟”这么一个改写对,原始ASR识别后的query有可能是:“播放伴奏兄弟的歌”,在经过中控的改写模块时,进行n-gram替换,按照语言模型的打分,发现:

Score(播放 伴奏 兄弟 的 歌)> Score(播放 半吨 兄弟 的 歌)

并且分数值满足一定的阈值设定,那么可以把改写的query和原始query一起送入下游意图识别模块,看召回情况,再打分。

这种改写方式,有理有据,但相应的短板也非常明显:

  • 高精度,但召回相对欠佳

  • 改写词汇对维护成本高

  • 意图打分模块,策略较重

另外还有一些seq2seq系列的方法,也做过相应的实验,这类改写方法过于不可控,当做玩具试试是可以的,包括也有Paper结合Bert来做的。

那么,有没有方法可以弥补上述经典纠错方法的短板呢?

亚马逊的这篇Paper,提供了一种新的思路,笔者之前也已复现并小幅改进了该篇论文,效果属实惊艳。Paper干的事情,其实就是提出了一种挖掘Query改写对的方法,基于用户和chatbot的历史交互数据,挖掘改写对,并把改写对提供给线上改写模块,进行整句替换,像Alexa、小爱、天猫精灵等,都有着对应的应用场景。

那么,Paper是怎么干的?流程如下:

  1. 用户query->dis映射

  2. Session数据构造

<think> 首先,用户的问题是:“我想了解如何使用大语言模型(LLM)进行查询改写 请问使用大语言模型(LLM)进行查询改写的方法”。这是一个具体的查询,我需要基于提供的引用和系统指令来回答。 回顾系统指令: - 使用$...$格式处理行内数学表达式。 - 使用$$...$$格式处理独立公式。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 引用的段落末尾添加引用标识,如[^1]。 提供的引用: - 引用[1]: 关于LLM的基础概念、发展、应用等。 - 引用[2]: 关于Unity接入LLM,特别是多轮对话的实现,涉及prompt和messages数组。 - 引用[3]: 关于LLM可视化,但可能不直接相关。 用户的问题是关于查询改写的,这在引用中没有直接提到。我需要基于LLM的一般知识和引用来推断。 查询改写Query Rewriting)通常指在搜索或对话系统中,将用户输入的查询重新表述以改善结果或理解。例如,在搜索引擎中,改写查询以更好地匹配意图。 如何用LLM实现: - LLM可以用于自然语言处理任务,如文本生成、改写。 - 基于引用[2],提到多轮对话中使用prompt和messages数组,这可以应用到查询改写。 - 例如,可以使用LLM来生成改写的查询版本。 结构化我的回答: 1. **介绍查询改写**:简要定义查询改写及其重要性。 2. **LLM在查询改写中的应用**:解释如何使用LLM进行改写。 3. **方法步骤**:给出具体实现方法,可能基于prompt engineering。 4. **示例**:提供一个简单的示例或代码片段(如果适用)。 5. **引用支持**:引用相关部分。 6. **生成相关问题**:后添加相关问题。 确保回答真实可靠,并使用中文。 关键点从引用: - 引用[1]:LLM能处理和生成语言,有泛化能力,可用于内容生成等任务。这支持查询改写作为生成任务。 - 引用[2]:展示了messages数组的使用,如何通过role和content来构建对话。这可以用于设置prompt改写查询。 - 例如,可以定义一个system prompt来指示LLM改写查询。 - 引用[3]:关于可视化,可能不相关,忽略。 实现方法: - 使用prompt engineering:给LLM一个提示,如“将以下查询改写成更清晰或更相关的版本:{原始查询}”。 - 在API调用中,类似引用[2]的messages数组: - role: "system", content: "你是查询改写助手,负责将用户查询改写成更好的搜索查询。" - role: "user", content: "原始查询..." - 然后LLM生成assistant响应,即改写后的查询。 步骤: 1. **准备prompt**:设置系统角色来定义任务。 2. **输入原始查询**:作为用户消息。 3. **获取输出**:LLM生成改写后的查询。 4. **处理输出**:解析和验证。 生成相关问题: - 基于主题,如优化方法、应用场景。 终回答结构: - 引言解释查询改写。 - 详细方法。 - 引用来源。 - 相关问题。 </think> ### 使用大语言模型(LLM)进行查询改写的方法 查询改写Query Rewriting)是指将用户输入的原始查询(如搜索查询或问题)重新表述为目标查询的过程,以提升相关性、消除歧义或改善结果质量。这在搜索引擎、对话系统和信息检索中尤为重要。大语言模型(LLM)凭借其强大的语言理解和生成能力,可以高效地实现这一任务。基于引用[1],LLM是对训练文本的高效压缩,能够生成新颖内容,而非简单检索,使其成为查询改写的理想工具[^1]。下面我将详细介绍使用LLM进行查询改写的步骤、方法和实例,确保结构清晰、易于理解。 #### 1. **查询改写的基本原理** 查询改写的核心是将模糊、不完整的原始查询转化为更精确、上下文相关的版本。LLM通过学习海量文本数据,能够识别查询意图、扩展关键词或简化表达。例如: - **改写类型**:包括同义替换(如“汽车”改为“车辆”)、意图澄清(如“天气”改为“北京今天天气预报”)、或语义扩展(如“AI应用”改为“大型语言模型在自然语言处理中的应用”)。 - **LLM的优势**:与传统规则引擎不同,LLM能创造性生成改写结果,无需预定义模板,尤其适用于复杂或新兴查询[^1]。 #### 2. **使用LLM进行查询改写的步骤** 基于引用[2]中提到的多轮对话机制(使用messages数组和prompt engineering),我们可以构建一个查询改写的流程。引用[2]展示了如何通过role字段(如system、user、assistant)组织上下文,这可以直接应用于改写任务[^2]。以下是具体方法: ##### **步骤1: 设置系统提示(System Prompt)** - **目的**:定义LLM的角色和任务规则,确保改写方向一致。 - **方法**: - 在messages数组中,添加一个role="system"的对象,指定提示内容(prompt)。这引导LLM后续行为。 - 示例prompt: "你是一个查询改写助手,负责将用户查询改写成更清晰、更相关的搜索查询。输出只返回改写后的查询,无需解释。" - 基于引用[2],这类似于在system角色中嵌入指令,使后续对话基于此框架展开[^2]。 ##### **步骤2: 输入原始查询** - **目的**:提供用户原始输入,作为LLM的处理起点。 - **方法**: - 在messages数组中,添加role="user"的对象,包含原始查询文本。 - 示例: 如果原始查询是“怎么减肥”,messages数组可能如下: ```json "messages": [ { "role": "system", "content": "你是一个查询改写助手,负责将用户查询改写成更清晰、更相关的搜索查询。输出只返回改写后的查询,无需解释。" }, { "role": "user", "content": "怎么减肥" } ] ``` - 引用[2]强调,这种结构允许LLM识别上下文,支持多轮交互(如累计历史查询)[^2]。 ##### **步骤3: 调用LLM API生成改写结果** - **目的**:让LLM基于prompt和输入生成改写后的查询。 - **方法**: - 使用LLM的API(如OpenAI GPT、LLaMA或Mistral),发送messages数组请求。 - API返回role="assistant"的响应,即改写后的查询。 - 示例输出: 对于输入“怎么减肥”,LLM可能生成“健康减肥方法大全”或“科学有效的减重指南”。 - 关键点:根据引用[1],LLM的泛化能力确保改写结果覆盖多样化场景,无需额外训练模型[^1]。 ##### **步骤4: 后处理与优化** - **目的**:提升改写质量,处理LLM输出中的偏差或不一致性。 - **方法**: - **验证输出**:检查改写查询是否与原意一致。例如,使用简单规则过滤无效字符。 - **添加约束**:在prompt中指定要求,如“输出不超过10个词”或“使用正式语言”,以减少LLM的随机性。 - **迭代反馈**:基于引用[2]的多轮机制,如果改写不满意,可以添加新user消息进行修正。例如: ```json "messages": [ { "role": "system", "content": "..." }, { "role": "user", "content": "怎么减肥" }, { "role": "assistant", "content": "健康减肥方法大全" }, { "role": "user", "content": "改写得更专业些" } // 第二轮反馈 ] ``` - 引用[2]明,这种历史记录保存能增强上下文理解[^2]。 #### 3. **实现示例:代码片段** 以下是一个Python示例,使用伪代码演示如何调用LLM API(如OpenAI)进行查询改写。基于引用[2]的原理,我们模拟messages数组结构[^2]。 ```python import openai # 假设使用OpenAI API def rewrite_query(original_query): # 设置API密钥(实际中需替换为有效密钥) openai.api_key = "your-api-key" # 构建messages数组,包含system prompt和user query messages = [ {"role": "system", "content": "你是一个查询改写助手,负责将用户查询改写成更清晰、更相关的搜索查询。输出只返回改写后的查询。"}, {"role": "user", "content": original_query} ] # 调用LLM生成响应 response = openai.ChatCompletion.create( model="gpt-3.5-turbo", # 例如使用GPT模型 messages=messages ) # 提取assistant的改写结果 rewritten_query = response.choices[0].message['content'].strip() return rewritten_query # 示例使用 original_query = "怎么减肥" rewritten = rewrite_query(original_query) print(f"原始查询: {original_query}") print(f"改写后查询: {rewritten}") # 可能输出:"科学减肥方法与饮食计划" ``` **明**: - 此代码基于引用[2]的messages数组逻辑,确保role字段清晰定义上下文[^2]。 - 实际应用中,可结合引用[1]提到的模型优化技术(如LoRA微调),针对特定领域(如医疗或电商)定制prompt,提升改写准确性[^1]。 - 输出验证:建议添加错误处理,防止LLM生成无关内容。 #### 4. **佳实践与注意事项** - **prompt工程技巧**: - **明确指令**:在system prompt中指定格式(如“输出为JSON”),以简化解析。 - **添加示例**:在prompt中包含少量示例查询和改写结果,引导LLM学习模式。 - **控制长度**:使用token限制(如max_tokens=50)避免冗长输出。 - **性能优化**: - 基于引用[1],结合模型压缩技术(如量化)部署轻量级LLM本地运行,减少延迟[^1]。 - 对于实时系统,缓存常见改写结果以提高效率。 - **潜在挑战**: - **偏差问题**:LLM可能生成偏见内容,建议在prompt中加入“确保中性且事实性”的约束。 - **领域适应性**:针对专业查询(如法律或医学),引用[1]提到使用自适应微调技术(如RLHF)优化模型[^1]。 总之,使用LLM进行查询改写依赖于高效的prompt设计和上下文管理。引用[2]展示了多轮对话机制的灵活性,使其能扩展到复杂场景[^2]。通过这种方法,LLM能显著提升搜索相关性和用户体验[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值