149 lines
6.0 KiB
Python
149 lines
6.0 KiB
Python
"""集成查询处理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结果:"""
|