AI实现智能客服第5节:RAG优化之指代消解/查询重写增强同城旅行客服
先放一段AI大模型对它的介绍。在上一篇内容中,我们通过自动化的方式,抓取了同程旅行网客服系统中“景点”这条业务线的网页数据,用的是N8N这个开源免费的自动化编排工具。这一步其实是构建RAG系统和AI客服的起点:
数据导入
在企业实际场景中,数据导入的形式远不止网页内容。我们需要把各种各样的
结构化数据
非结构化数据
什么是结构化数据与非结构化数据?
- :没有固定格式、不能按行列直接组织的数据,比如PDF、Word、PPT文档,云文档、图片、网页内容等。
非结构化数据
- :按预定义结构组织的数据,通常是以行和列构成的表格,比如数据库中的表。
结构化数据
所以,企业在构建AI系统时,需要掌握从不同来源导入数据的能力,包括文本、表格、图片、网页等,才能为RAG系统提供多样、真实的数据支撑。
目前,我们已经通过N8N从网页中抓取了景点相关内容,并借助大模型自动总结成Markdown格式的知识文本,存入知识库。但对开发者来说,接下来还需要逐步掌握如何使用各种
数据加载器
上一篇中,我们完成了知识数据的准备工作,可以正式进入实际使用和学习阶段了。
有了知识,就要开始测试了。
拥有了基础知识后,在构建AI客服的过程中,就需要大量测试,模拟用户提问,并持续根据实际效果优化知识库、提示词、RAG检索策略以及AI Agent的工作流。
本节重点:AI客服系统中的
指代消解
查询重写
在搭建AI客服系统的过程中,有两个关键能力非常值得构建。
什么是指代消解?
简单来说,
指代消解
什么是查询重写?
查询重写
从实践角度看,指代消解可以看作是查询重写处理环节的一部分,或者说是一个典型场景。
指代消解介绍
设想一个场景:小明是一名程序员,他每天的工作离不开咖啡。有一天,他对同事说:“咖啡救了我,
它
这个小插曲体现了一个问题:当句子中间出现“它”时,我们如何知道它指的是咖啡而非别的东西?对人来说,凭借上下文能轻松判断,但对机器而言,这就像玩解谜游戏。如果机器不能正确指代消解,就有可能误解内容,影响信息检索和生成的准确性。正是因为这个原因,指代消解在RAG系统中变得异常重要,它能让系统更聪明地“猜测”每个代词的真实含义,从而提升召回率和回答质量。
说到这里,可能很多人还是不太了解。这里可以用一个非常通用的方法——5W1H思维方式来梳理。
1. What(什么是指代消解?)
指代消解(Anaphora Resolution)是自然语言处理中的一项技术,旨在确定文本中代词、名词短语等指代词的真正指向。简单来说,就是解决“它是谁”、“他指的是什么”的问题,从而让机器读懂文章中各个元素之间的关系。
2. Why(为什么要做指代消解?)
在RAG系统中,信息的准确检索和生成依赖于对上下文的深刻理解。如果系统不能正确解析指代关系,就会出现信息混淆,降低召回率和准确性。例如,在检索知识库时,错误地理解“它”可能导致系统返回与用户真正意图不匹配的答案。指代消解有助于:提升信息检索的精确度,增强生成回答的逻辑连贯性,改善用户体验。
3. When(何时使用指代消解?)
指代消解在处理含有复杂指代关系的文本时尤为关键。常见应用场景包括:自然语言问答系统、对话机器人、机器翻译、信息抽取与文本摘要。当文本中间出现多次代词指向同一对象或含糊不清的指代时,指代消解的作用就格外重要。
4. Where(指代消解应用于哪些领域?)
指代消解技术不仅在RAG系统中有着重要应用,还广泛存在于:搜索引擎优化、客服自动回复、语音助手,以及教育、医疗等各类智能信息系统中。通过正确解析文本中的指代关系,各行各业的智能系统都能更精准地理解用户需求,提供更高质量的服务。
5. Who(谁在使用指代消解?)
各种使用自然语言处理技术的公司和研究机构都在探索并应用指代消解技术,比如各类智能客服平台。
6. How(如何实现指代消解?)
指代消解的实现通常涉及以下几个步骤:
- :梳理用户可能常见的问题,识别出文本中所有可能的指代对象。
候选实体识别
- :利用上下文历史聊天记录信息、语义关系等提取有助于判断指代关系的特征。
特征提取
- :基于AI大模型,根据当前用户问题和历史聊天记录,确定最佳的指代关系。
模型判定
- :对返回结果进行优化和校正,确保整体准确性。
后处理与评估
为什么需要查询重写?
用户的提问通常比较口语化,直接用问题检索效果不佳;需要减少查询和文档之间的语义差异;而且多轮对话中的检索,也需要进行指代消解。
在做RAG系统的时候,会遇到很多很多问题。通常我们刚开始接触的RAG都算是最简单的原生RAG(Native RAG),而企业中要达到上线可用标准,至少需要达到高级RAG(Advanced RAG)级别,准确率在80-95%之间。这需要解决一些原生RAG带来的问题。Query理解处理得越清楚,后续问题处理就会越好。
AI工作流使用
对于我们目前基于FastGPT的AI大模型客服工作流,实现指代消解和查询重写只需要增加一个AI处理节点,用提示词处理即可。本节内容,我们继续基于FastGPT这个软件来了解这个知识。对于开发者来说,先学会走路比较重要——能够快速理解一项新内容,而不是上来就开始学底层技术。这个阶段也算是技术性的预研,了解成熟的工具的使用方法,对未来的程序层面开发也会有深刻理解,毕竟程序开发本质的核心是对现实世界的抽象。学会UI工具的使用,能提高我们在写程序时的认知。
先看看我们目前AI客服的工作流。再看一下在当前工作流中,没有增加指代消解时的回答现象。
首先问一个问题:可以看到读取了知识库中的内容,还可以。继续追问:这时候,问题就出现了。我们本意是想让他回答关于八达岭长城的退票相关内容,但知识库中目前没有这个内容,它却也回答了。这说明即使使用了RAG,用了FastGPT软件,我们还是会出现这样的幻觉问题。
可以看到,它在回答这个问题时,没有考虑上下文的相关性,直接基于没有主语的问题去搜索相关知识。从知识召回的角度来说,这不符合要求。它没有识别到“它”这个词代表的是八达岭长城,而是根据“它”这个词去知识库中搜索。如果当前知识库中的知识特别多,召回结果的质量将非常差。
正是因为这个现象,我们需要引入指代消解,对用户输入的问题进行处理,让它识别到指代关系。引入后,会对问题进行重写,效果如下。这里演示一下转换后的问题:可以基于这个新问题进行回答了。
做法如下:在问题开始的时候,我们可以让AI帮助我们写一个提示词,然后调用AI进行重写。工作流的流程是:1、增加一个AI对话节点,根据用户问题进行查询转换,对用户输入问题中的代词进行消解,进行
查询转换
一个简单版本的提示词如下:
## 角色你是用户问题的文案转换专家,能够根据用户的问题进行指代消解,根据用户问题重写为一个新问题。定位并解析代词(如“它”、“这个”,"刚才")的具体指向,将用户问题转换为为没有代词的问题,并且补全问题中缺失的历史上下文主题与关键词本轮问题如下:xxxxxx请根据用户问题,进行问题转换,强制需要包含景点名称,不要对用户的问题进行回答,需要对用户的问题重写。
这是一个简单的提示词,对于有些模型来说,不会完全实现我们的要求。所以我们可以选择一些质量较高的模型,例如gpt-4o。目前在企业中,使用这个模型来完成指代消解和查询重写。
在企业真实的数据使用中,随着测试问题的增多和准确率要求的提高,查询重写和指代消解的提示词大概如下:
### 角色 你是xxx公司一个专业的用户问题重写专家,具备多维对话状态建模能力,精准识别本轮用户问题中的显性/隐性需求,你的任务是结合对话上下文聊天记录和本轮的问题,对用户本轮问题进行准确、自然、流畅的表达进行用户文案重写,以提升后续处理的准确性。### 任务 1. **上下文桥梁**: - 解析历史对话上下文中的实体、事件和状态信息,确保本轮提问重写的问题与上下文语境一致,能够解决当前用户的问题。 - 识别代词(如“它”、“这个”、“上次”、“刚才”、“那种”、“该”)的指代对象,明确其具体含义。 - 捕捉用户情绪倾向(如紧急、困惑、比较),并确保重写后的问题保留用户的情感色彩。 2. **智能指代消解**样例如下: ┌───────────────┬───────────────────────┐ │ 当前提问代词 │ 自动替换逻辑 │ ├───────────────┼───────────────────────┤ │ 这个/它 │ 替换为最近的产品实体 │ │ 上次的 │ 替换为上轮完整产品型号 │ │ 那种 │ 关联同类产品特征词 │ └───────────────┴───────────────────────┘3. **意图解构**: - 区分用户的表层问题与深层需求。 - 识别复合问题中的多个子需求和子问题,并确保重写后的问题涵盖所有关键点。 4. **信息补全**: - 为省略主语的问题补全实体。 - 为不完整或模糊的问题补充必要的背景信息,确保问题表达完整。 - 在补全主语或实体时,仅根据当前对话上下文中的已提及内容进行,避免随意猜测或添加未提及的信息。5. **跨轮补全**: - 当检测到代词时,执行: 1) 向前检索5轮对话 2) 提取最后出现的相关实体 3) 强制替换格式:「原代词+(实体)」, 例:把这个→把这个(xxxxxx设备)。5.**问题重写** - 在不改变原意的前提下,将用户的本轮问题重写为更相似、更准确、更自然、更流畅、更容易让系统理解的表达,任何时候不要删减用户问题中的关键内容和关键词,保留用户问题中的具体需求。原始问题和重写后的问题需要是相同含义。### 重写规则- 确保重写后的问题保留用户的原意和语气。 - **仅返回重写后的问题**,不包含任何额外的解释或说明。
也可以根据自己的业务需求,让AI帮助我们针对实际场景进行优化:
### ? 角色你是同程旅行网AI客服系统中的**用户问题重写专家**,专注于提升用户问题的表达准确性。你具备多轮对话理解、指代消解、上下文建模与意图重构的能力,擅长将用户口语化、含糊或省略表达的提问,精准地重写为语义清晰、系统可理解的问题,涵盖景点、火车票、会员权益等业务领域。---### ? 任务目标你需要基于历史对话上下文和用户本轮输入,对当前问题进行**语义补全与重写**,以便:* 提高RAG系统的召回精度;* 准确处理用户查询中的指代关系;* 明确用户的实际意图,覆盖多维子需求。---### ? 任务拆解#### 1. 上下文桥梁* 理解历史对话内容,抽取用户已提及的实体(如:广州塔、学生票、白金会员等)、地点、时间、需求。* 保证当前问题的重写与上下文语义保持一致,必要时对问题进行场景补充。* 特别注意**多业务线场景切换**,准确识别当前业务上下文(如从景点跳转到火车票时)。#### 2. 智能指代消解* 对如“这个”、“它”、“那种”、“上次的”、“刚才的”等代词进行语义还原。* 若能明确指代对象,强制补充原实体名称,例如: * “它几点开门” → “广州塔几点开门(它=广州塔)” * “那个会员权益有变吗” → “白金会员的权益有变吗(那个=白金会员)”? **示例映射表**:| 当前代词 | 指代策略说明 || ------- | ------------------ || 它 / 这个 | 替换为上轮提及的地点或实体 || 那个 / 那种 | 替换为上轮涉及的类目或类别词 || 上次的 | 替换为用户最近一次提及的票种/权益 |> 优先使用最近5轮中提及的实体,跨轮查找时优先考虑业务领域的一致性。#### 3. 意图解构* 识别表层提问背后的深层动因,例如: * “几点开门” → 是在查询景点营业时间 * “还有票吗” → 是在查询车次余票* 拆解复合问题,例如: * “广州塔几点开门,有学生票吗?” → 两个子问题应被整合在一个完整表达中#### 4. 信息补全* 对省略主语的句子补全实体:* “几点开门?” → “广州塔几点开门?”* 补全场景必要信息,避免脱离上下文的模糊表达。* 不允许引入上下文中未提及的新实体。#### 5. 跨轮补全机制(强化指代消解)当检测到代词或模糊指向时,执行如下策略:1. 回溯最近5轮上下文2. 抽取最后出现的核心实体3. 替换代词,补充为完整问法,保留原始代词结构,例如: * “这个几点发车?” → “这个(G123次列车)几点发车?”--### ✍️ 重写策略* 保留用户问题原意、语气、情绪(如:紧急、困惑、不满等)* 不遗漏任何关键内容或子意图* 避免主观添加信息,仅基于对话上下文补全---### ? 最终产出要求***只返回重写后的问题**,不包含中间解释或提示* 确保语句自然、通顺、正式,方便系统处理
本文提到了一个词:查询重写。这是RAG优化策略中查询转换(Query Translation、Query Transformer)的一部分,主要目的是将输入的query变为一种便于检索的形式。这在RAG的优化中是一个非常重要的概念,里面又包含了若干个常用的优化手段。在LangChain实践中,总结出了下面这张图:对于一个问题,首先需要做的就是查询转换,从而更好地理解用户的问题。
查询转换常见的有三种玩法:查询重写、查询扩展、查询拆解。这张图来源于:https://github.com/langchain-ai/rag-from-scratch/blob/main/rag_from_scratch_5_to_9.ipynb。查询转换可以通过修改输入查询来增强检索结果。
总结
通过今天的分享,我们揭开了指代消解和查询重写的神秘面纱,演示了在FastGPT工作流中应用于同程旅行客服的实际效果,还通过5W1H的方式系统地介绍了这一技术的重要性和应用场景。指代消解和查询重写不仅让机器更“懂人心”,更是提升RAG召回率的重要利器。
如果你正在研究或开发RAG系统,不妨深入探讨指代消解和查询重写技术,优化你的模型和工作流,带来更加精准和智能的信息检索体验。未来,随着技术的不断进步,指代消解会在更多领域大放异彩,助力AI客服、语音助手等智能系统更好地服务于人类。如果你也在构建自己的RAG系统或者探索企业智能问答,不妨从这些看似“细节”的能力点入手,效果往往出乎意料。