【AI大模型应用开发】【项目实战】19.RAG智慧问答项目-(七)基于Milvus库的问答系统之prompts设计与query意图识别 一.prompts设计与query意图识别目标掌握如何设计和使用Prompt模板来引导大语言模型生成高质量输出学会查询分类的基本原理,了解如何通过分类优化输入处理流程prompts.py和query_classifier.py是EduRAG系统中core模块的重要组成部分,分别负责Prompt模板管理和查询分类,这两个模块通过优化用户输入的处理,增强了系统的灵活性和智能性,为RAG系统的检索和生成阶段奠定了基础,prompts.py定义了多种Prompt模板,用于引导大语言模型生成特定输出,而query_classifier.py通过分类用户查询,决定是否直接使用模型回答或触发检索流程1.Prompt管理(1).功能概述prompts.py定义了RAGPrompts类,负责管理系统中使用的所有Prompt模板,这些模板用于指导大语言模型完成不同任务,例如生成最终答案、假设答案、子查询或简化问题,通过集中管理Prompt,系统能够确保输入的一致性和输出质量实现下图中的4个大模型的Prompt:(2).代码实现# core/prompts.py # 导入 PromptTemplate 类,用于创建 Prompt 模板 from langchain_core.prompts import PromptTemplate # 定义 RAGPrompts 类,用于管理所有 Prompt 模板 class RAGPrompts: # 定义 RAG 提示模板 # @: 装饰器, 注解(是给计算看的),注释(给码农看的) # 需要注意: # # - Augment+Generate这一步需要大模型具备一定的**指令遵循**和**逻辑推理**能力,当输入的上下文和query没有问题但是效果不符合预期时。需要考虑更换能力更强的模型。 # - 如果在这个阶段要求大模型输出的语言风格和话术非常专业,**需要进行微调** @staticmethod def rag_prompt(): # 创建并返回 PromptTemplate 对象 return PromptTemplate( template=""" 你是一个IT领域的智能助手,帮助用户回答问题。你的语言专业,严谨,言简意赅。 如果提供了上下文,请基于上下文回答;如果没有上下文,请直接根据你的知识回答。 回答需要参考用户和系统的历史对话,如果没有历史对话,只参考上下文即可。 如果答案来源于检索到的文档,请在回答中说明。 上下文: 「 {context} 」 问题: 「 {question} 」 历史对话:「 {history} 」 如果无法回答,请回复:“信息不足,无法回答,请联系人工客服,电话:{phone}。” 回答: """, # 定义输入变量 input_variables=["context", "question", "history", "phone"], ) # @staticmethod # def rag_prompt(): # return PromptTemplate( # template=""" # 你是一个智能助手,负责帮助用户回答问题。请按照以下步骤处理: # # 1. **分析问题和上下文**: # - 基于提供的上下文(如果有)和你的知识回答问题。 # - 如果答案来源于检索到的文档,请在回答中明确说明,例如:“根据提供的文档,……”。 # # 2. **评估对话历史**: # - 检查对话历史是否与当前问题相关(例如,是否涉及相同的话题、实体或问题背景)。 # - 如果对话历史与问题相关,请结合历史信息生成更准确的回答。 # - 如果对话历史无关(例如,仅包含问候或不相关的内容),忽略历史,仅基于上下文和问题回答。 # # 3. **生成回答**: # - 提供清晰、准确的回答,避免无关信息。 # - 如果上下文和历史消息均不足以回答问题,请回复:“信息不足,无法回答,请联系人工客服,电话:{phone}。” # # **上下文**: {context} # **对话历史**: # {history} # **问题**: {question} # # **回答**: # """, # input_variables=["context", "history", "question", "phone"], # ) # 定义假设问题生成的 Prompt 模板 @staticmethod def hyde_prompt(): # 创建并返回 PromptTemplate 对象 return PromptTemplate( template=""" 假设你是用户,想了解以下问题,请生成一个简短的假设答案,以便于去查询向量库,获取当更好的查询结果: 问题: 「 {query} 」 需要注意,你的回答只能包含假设答案本身,且长度不能超过200个字。 接下来,请你输出假设答案: """, # 定义输入变量 input_variables=["query"], ) # 定义子查询生成的 Prompt 模板 @staticmethod def subquery_prompt(): # 创建并返回 PromptTemplate 对象 return PromptTemplate( template=""" 将以下复杂查询分解为多个简单子查询,每行一个子查询,以便于去查询向量库,获取当更好的查询结果: 查询: 「 {query} 」 需要注意,你的回答只能包含子查询本身,不要有任何的补充说明和其他无关内容。 接下来,请你输出子查询结果: """, # 定义输入变量 input_variables=["query"], ) # 定义回溯问题生成的 Prompt 模板 @staticmethod def backtracking_prompt(): # 创建并返回 PromptTemplate 对象 return PromptTemplate( template=""" 将以下复杂查询简化为一个更简单的问题,以便于去查询向量库,获取当更好的查询结果: 查询: 「 {query} 」 需要注意,你的回答只能包含简化后的问题本身,不要有任何的补充说明和其他无关内容。 接下来,请你输出简化后的问题: """, # 定义输入变量 input_variables=["query"], ) if __name__ == '__main__': prompt = RAGPrompts.hyde_prompt() prompt_str = prompt.format(query="大模型在教育领域的应用有哪些?") print(prompt_str)(3).实现细节1.rag_prompt:作用:核心回答模板,结合检索到的上下文生成最终答案输入变量:context(检索文档内容)、question(用户查询)、phone(客服电话)设计逻辑:支持有无上下文的回答,并提供兜底回复,确保用户体验2.hyde_prompt:作用:生成假设答案,用于HyDE(Hypothetical Document Embeddings)策略,优化抽象查询的检索输入变量:query(用户查询)设计逻辑:通过生成假设答案,间接增强查询与文档的语义匹配3.subquery_prompt:作用:将复杂查询分解为多个子查询,适合涉及多方面的查询输入变量:query(用户查询)设计逻辑:分解复杂问题以提高检索覆盖率4.backtracking_prompt:作用:将复杂查询简化为更基础的问题,便于检索输入变量:query(用户查询)设计逻辑:通过简化查询降低检索难度2.查询分类QueryClassifier是 EduRAG 系统的核心组件,负责将用户查询分为“通用知识”和“专业咨询”两类,以决定查询路由到知识库还是咨询接口,本模块介绍基于 BERT的优化实现,替换传统TF-IDF 模型,利用 5000 条混合数据集(training_dataset_hybrid_5000.json)进行训练,并解决评估中的标签处理问题(1).功能概述QueryClassifier提供以下功能:数据加载:读取 5000 条 JSON 数据集,包含查询和标签(“通用知识”或“专业咨询”)BERT 训练:使用bert-base-chinese模型,微调二分类任务,准确率达90%+评估优化:直接处理数字标签(0 或 1),生成分类报告和混淆矩阵预测接口:支持实时分类,集成到 EduRAG 系统""" 意图识别模块,提供如下功能: 1. 数据加载:读取 5000 条 JSON 数据集,包含查询和标签(“通用知识”或“专业咨询”) 2. 模型训练:使用 bert-base-chinese 模型,微调二分类任务,准确率达 90%+ 3. 评估优化:直接处理数字标签(0 或 1),生成分类报告和混淆矩阵 4. 预测接口:支持实时分类,集成到 EduRAG 系统。 为了满足以上功能,需要实现以下需求: 1. 初始化方法:初始化预训练的分词器、 预训练的模型。 如果是在上线阶段,主要是负责加载训练好的模型 2. 数据预处理:将查询文本和预测标签转化为模型的输入数据格式 3. 构建数据集:用于模型的训练,适配模型的训练函数 4. 模型训练:基于处理好的数据集划分出来训练集,对模型进行训练 5. 模型评估:在数据集划分出来的验证集,对模型进行评估 6. 模型预测:加载训练好的模型,完成意图识别任务 """(2).代码实现""" 意图识别模块,提供如下功能: ---------------------------------------在项目上线之前执行一次--------------------------------------- 1. 数据加载:读取 5000 条 JSON 数据集,包含查询和标签(“通用知识”或“专业咨询”) 2. 模型训练:使用 bert-base-chinese 模型,微调二分类任务,准确率达 90%+ 3. 评估优化:直接处理数字标签(0 或 1),生成分类报告和混淆矩阵 ---------------------------------------在项目上线之前执行一