首先回到这张图,RAG的基本过程就是拿到用户query,转换成向量在知识库检索出相似度高的chunk,再将chunk和问题丢给大模型,让大模型结合chunk回答问题。那么要提RAG的高效召回方法就可以从query、知识库检索和知识库的处理三个方面着手优化。首先你可能会问为什么要改写query呢,因为RAG的核心就是“检索-生成”,如果检索的过程就无法提供准确的答案,那生成阶段的质量必然会被降低。而用户提出的问题往往是口语化的、承接上下文的、模糊的,甚至是包含了情绪的,知识库中的内容往往是客观陈述性的。我们需要将用户提问转换成书面化、精确的检索语句。我们只需要精心设计Prompt,让大预言模型帮我们转换即可。instruction="""你是一个智能的查询优化助手。请分析用户的当前问题以及前序对话历史,判断当前问题是否依赖于上下文。如果依赖,请将当前问题改写成一个独立的、包含所有必要上下文信息的完整问题。如果不依赖,直接返回原问题。"""prompt=f"""###指令###{instruction}###对话历史###{conversation_history}###当前问题###{current_query}###改写后的问题###"""instruction="""你是一个查询分析专家。请分析用户的输入和相关的对话上下文,识别出问题中需要进行比较的多个对象。然后,将原始问题改写成一个更明确、更适合在知识库中检索的对比性查询。""" instruction="""你是一个消除语言歧义的专家。请分析用户的当前问题和对话历史,找出问题中"都"、"它"、"这个"等模糊指代词具体指向的对象。然后,将这些指代词替换为明确的对象名称,生成一个清晰、无歧义的新问题。""" instruction="""你是一个任务分解机器人。请将用户的复杂问题分解成多个独立的、可以单独回答的简单问题。以JSON数组格式输出。"""prompt=f"""###指令###{instruction}###原始问题###{query}###分解后的问题列表###请以JSON数组格式输出,例如:["问题1","问题2","问题3"]"""#原始查询:门票多少钱?需要提前预约吗?停车费怎么收?#分解结果:['门票多少钱?','需要提前预约吗?','停车费怎么收?']instruction="""你是一个沟通理解大师。请分析用户的反问或带有情绪的陈述,识别其背后真实的意图和问题。然后,将这个反问改写成一个中立、客观、可以直接用于知识库检索的问题。""" 这么多种类型要如何判断什么时候用哪种类型呢?当然还是让大预言模型告诉我们,我们通过: instruction="""你是一个智能的查询分析专家。请分析用户的查询,识别其属于以下哪种类型:1.上下文依赖型-包含'还有'、'其他'等需要上下文理解的词汇2.对比型-包含'哪个'、'比较'、'更'、'哪个更好'、'哪个更'等比较词汇3.模糊指代型-包含"它"、"他们"、"都"、"这个"等指代词4.多意图型-包含多个独立问题,用"、"或"?"分隔5.反问型-包含"不会"、"难道"等反问语气说明:如果同时存在多意图型、模糊指代型,优先级为多意图型>模糊指代型请返回JSON格式:{"query_type":"查询类型","rewritten_query":"改写后的查询","confidence":"置信度(0-1)"}"""prompt=f"""###指令###{instruction}###对话历史###{conversation_history}###上下文信息###{context_info}###原始查询###{query}###分析结果###"""高效的检索方法,特别适用于处理长文档或多文档场景。核心思想是通过小规模内容(如摘要、关键字或段落)建立索引,并链接到大规模内容主体中。 小规模内容检索:用户输入查询后,系统首先在小规模内容(如摘要、关键句或段落)中检索匹配的内容。小规模内容通常是通过摘要生成、关键句提取等技术从大规模内容中提取的,并建立索引。 链接到大规模内容:当小规模内容匹配到用户的查询后,系统会通过预定义的链接(如文档 ID、URL 或指针)找到对应的大规模内容(如完整的文档、文章)。大规模内容包含更详细的上下文信息,为 RAG 提供丰富的背景知识。 上下文补充:将大规模内容作为 RAG 系统的上下文输入,结合用户查询和小规模内容,生成更准确和连贯的答案。
知识库处理 可以将大段的知识交给大模型,让大模型根据文本生成多个问题,再将这些问题和知识组成chunk存入到知识库,提升知识库的丰富度。 instruction="""你是一个专业的问答系统专家。给定的知识内容能回答哪些多样化的问题,这些问题可以:1.使用不同的问法(直接问、间接问、对比问等)2.避免重复和相似的问题3.确保问题不超出知识内容范围""" 产品上线后每天产生大量对话,可以从这些对话中提取和沉淀有价值的知识,持续丰富知识库。当然实现过程还是交给大模型帮我们去做。 首先提取知识: instruction="""你是一个专业的知识提取专家。请从给定的对话中提取有价值的知识点,包括:1.事实性信息(地点、时间、价格、规则等)2.用户需求和偏好3.常见问题和解答4.操作流程和步骤5.注意事项和提醒""" 然后将知识做整理: prompt= f"""你是一个专业的知识整理专家。请将以下知识点进行智能合并,生成一个更完整、准确的知识点。### 合并要求:1. 保留所有重要信息,避免信息丢失2. 消除重复内容,整合相似表述3. 提高内容的准确性和完整性4. 保持逻辑清晰,结构合理5. 合并后的置信度取所有知识点中的最高值
### 待合并的知识点:xxxxx"""
最后将整理的知识当成chunk放进知识库。 |