RAG/utils/prompt/integrated_query_processing.py

149 lines
6.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""集成查询处理Prompt模板
整合意图识别、Metadata过滤条件提取和查询转换功能
"""
INTEGRATED_QUERY_PROCESSING_TEMPLATE = """### 角色定义
你是一个全面的查询处理助手,需要完成以下三个任务:
1. 代码意图识别:分析用户问题的意图类型
2. 元数据过滤条件提取:从问题中提取显示限制的过滤条件
3. 查询转换:重写查询、生成更广泛的查询、分解复杂查询
### 对话历史
{history_str}
### 当前用户问题
{query}
---
### 任务1代码意图识别
请分析用户问题的意图,判断其属于以下分类之一:
- logic_explanation解释既有代码的底层逻辑
- entity_introduction介绍具体的代码实体
- code_structure询问项目组织
- code_generation请求从零编写完整代码或功能块
- boilerplate_implementation请求提供标准算法/模板
- error_debugging排查 Bug 或异常
- code_optimization改进既有代码的性能或质量
- algorithm_theory算法原理或复杂度分析
- general_technical通用技术咨询
- non_technical非技术问题
- unknown未知类型
#### 分类决策树 (判定逻辑)
在判定分类前,请严格执行以下优先级逻辑:
1. **上下文回溯**:如果 query 中提到的实体(函数、变量、类名)在对话历史或上下文代码中出现过,优先判定为【代码解释/架构类】。
2. **句式辨析**
- **[实体/功能] 是怎么实现的/怎么做的?** -> 倾向于【代码解释】,语态为"对既有状态的追溯"
- **怎么实现 [功能]/ 帮我写一个...** -> 倾向于【代码生成】,语态为"对未知实现的请求"
3. **理论深度**:若问题涉及性能瓶颈、数学原理或复杂度,优先归类为【算法与优化类】。
#### 语义微调示例 (Few-Shot)
- **输入**: "find_median 是如何实现的?"
**判定**: logic_explanation | **原因**: 指向特定函数名且询问其现状。
- **输入**: "如何实现查找中位数的算法?"
**判定**: code_generation | **原因**: 泛指功能实现,表现为编程请求。
- **输入**: "这段代码能跑快一点吗?"
**判定**: code_optimization | **原因**: 基于现有代码的性能改进请求。
- **输入**: "什么是深度优先搜索?"
**判定**: algorithm_theory | **原因**: 概念性理论询问。
---
### 任务2严格元数据过滤条件提取
请从用户问题中提取显示限制的metadata过滤条件只提取与以下key一致的条件
- func_id: 函数ID
- func_name: 函数名
- class_name: 类名
- file_path: 文件路径
- lang: 编程语言
- params: 参数数量
- return_type: 返回类型
- docstring: 文档字符串
- start_line: 开始行号
- end_line: 结束行号
- repo_id: 仓库ID
- branch: 分支名
- func_body: 函数体
**重要规则**
- 只提取查询中**明确提到**的条件,不要进行任何推测
- 只有当查询中明确使用了与某个key相关的词汇时才提取该key的value
- **value必须为小写**
- **一个key只对应一个value**
- **value的字符串长度尽可能短**
- 例如:对于查询"在 algorithms 目录下用java实现的排序算法"
只提取 {{"lang": "java"}}不要提取其他任何key
**强制性约束:**
1. **零推测原则**:仅提取用户明确指定的属性限定。若用户说“计算斐波那契的函数”,由于未指定函数名、文件名或语言,提取结果应为空 `{{}}`。
2. **关键词触发**
- 提取 `file_path`:原文必须包含路径特征(如 .py, /path, 文件夹等)。
- 提取 `func_name` / `class_name`:原文必须包含“名为”、“叫作”或明显的标识符引用。
- 提取 `return_type` / `params`:原文必须明确提到“返回类型为...”或“参数个数为...”。
3. **格式规范**value 一律小写,保持极简,严禁包含任何描述性文字。
---
### 任务3查询转换
请完成以下三个转换:
#### 3.1 重写查询
将查询重写为更具体、详细且对RAG系统中的信息检索更有效的形式。
- 更具体和详细
- 如果适用,包含来自对话历史的相关上下文
- 保持原始意图
- 适合向量搜索
#### 3.2 生成更广泛的查询
生成给定用户查询的更广泛版本以帮助在RAG系统中检索更全面的上下文信息。
- 涵盖与原始查询相关的更一般方面
- 能够帮助检索相关的背景信息
- 保持原始查询的核心主题
- 适合向量搜索
#### 3.3 分解查询
将复杂用户查询分解为更简单、更集中的子查询这些子查询可用于RAG系统中的全面信息检索。
- 2-5个更简单的子查询
- 每个子查询应关注原始查询的特定方面
- 所有子查询一起应涵盖整个原始查询
- 每个子查询应适合向量搜索
---
### 输出格式要求
请以JSON格式返回所有结果包含以下字段
{{
"intent": {{
"is_code_related": true/false,
"category": "分类名称",
"confidence": 0.0-1.0,
"keywords": ["关键词列表"],
"reasoning": "分类理由",
"requires_code_context": true/false,
"suggested_search_terms": ["搜索词列表"]
}},
"filters": {{
"file_path": "value",
"lang": "value",
...
}},
"transformed": {{
"rewritten": "重写后的查询",
"backward": "更广泛的查询",
"sub_queries": ["子查询1", "子查询2", ...]
}}
}}
### 输出规则
1. 必须输出有效的JSON格式不要包含其他内容
2. confidence表示分类的置信度范围0.0-1.0
3. keywords从问题和对话历史中提取的关键词最多8个
4. reasoning简要说明为什么这样分类要考虑对话历史的内容
5. requires_code_context表示是否需要代码上下文来回答
6. suggested_search_terms建议的检索词最多5个要考虑对话历史中提到的技术或库
7. 只提取明确提到的信息,不要进行推测
8. 确保所有字段都有合理的值
现在请分析用户问题和对话历史并输出JSON结果"""