refactor: 移除多查询生成方法,简化记忆检索逻辑;在工具接口中添加当前时间信息
This commit is contained in:
@@ -345,98 +345,6 @@ class MemoryManager:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
# ==================== 记忆检索操作 ====================
|
# ==================== 记忆检索操作 ====================
|
||||||
|
|
||||||
async def generate_multi_queries(
|
|
||||||
self,
|
|
||||||
query: str,
|
|
||||||
context: dict[str, Any] | None = None,
|
|
||||||
) -> list[tuple[str, float]]:
|
|
||||||
"""
|
|
||||||
使用小模型生成多个查询语句(用于多路召回)
|
|
||||||
|
|
||||||
简化版多查询策略:直接让小模型生成3-5个不同角度的查询,
|
|
||||||
避免复杂的查询分解和组合逻辑。
|
|
||||||
|
|
||||||
Args:
|
|
||||||
query: 原始查询
|
|
||||||
context: 上下文信息(聊天历史、发言人、参与者等)
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
List of (query_string, weight) - 查询语句和权重
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
from src.config.config import model_config
|
|
||||||
from src.llm_models.utils_model import LLMRequest
|
|
||||||
|
|
||||||
llm = LLMRequest(
|
|
||||||
model_set=model_config.model_task_config.utils_small,
|
|
||||||
request_type="memory.multi_query_generator"
|
|
||||||
)
|
|
||||||
|
|
||||||
# 构建上下文信息
|
|
||||||
chat_history = context.get("chat_history", "") if context else ""
|
|
||||||
|
|
||||||
prompt = f"""你是记忆检索助手。为提高检索准确率,请为查询生成3-5个不同角度的搜索语句。
|
|
||||||
|
|
||||||
**核心原则(重要!):**
|
|
||||||
对于包含多个概念的复杂查询(如"小明如何评价小王"),应该生成:
|
|
||||||
1. 完整查询(包含所有要素)- 权重1.0
|
|
||||||
2. 每个关键概念的独立查询(如"小明"、"小王")- 权重0.8,避免被主体淹没!
|
|
||||||
3. 主体+动作组合(如"小明 评价")- 权重0.6
|
|
||||||
4. 泛化查询(如"评价")- 权重0.7
|
|
||||||
|
|
||||||
**要求:**
|
|
||||||
- 第一个必须是原始查询或同义改写
|
|
||||||
- 识别查询中的所有重要概念,为每个概念生成独立查询
|
|
||||||
- 查询简洁(5-20字)
|
|
||||||
- 直接输出JSON,不要添加说明
|
|
||||||
|
|
||||||
**对话上下文:** {chat_history[-300:] if chat_history else "无"}
|
|
||||||
|
|
||||||
**输出JSON格式:**
|
|
||||||
```json
|
|
||||||
{{
|
|
||||||
"queries": [
|
|
||||||
{{"text": "完整查询", "weight": 1.0}},
|
|
||||||
{{"text": "关键概念1", "weight": 0.8}},
|
|
||||||
{{"text": "关键概念2", "weight": 0.8}},
|
|
||||||
{{"text": "组合查询", "weight": 0.6}}
|
|
||||||
]
|
|
||||||
}}
|
|
||||||
```"""
|
|
||||||
|
|
||||||
response, _ = await llm.generate_response_async(prompt, temperature=0.3, max_tokens=300)
|
|
||||||
|
|
||||||
# 解析JSON
|
|
||||||
import json
|
|
||||||
import re
|
|
||||||
response = re.sub(r"```json\s*", "", response)
|
|
||||||
response = re.sub(r"```\s*$", "", response).strip()
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = json.loads(response)
|
|
||||||
queries = data.get("queries", [])
|
|
||||||
|
|
||||||
result = []
|
|
||||||
for item in queries:
|
|
||||||
text = item.get("text", "").strip()
|
|
||||||
weight = float(item.get("weight", 0.5))
|
|
||||||
if text:
|
|
||||||
result.append((text, weight))
|
|
||||||
|
|
||||||
if result:
|
|
||||||
logger.info(f"生成 {len(result)} 个查询: {[q for q, _ in result]}")
|
|
||||||
return result
|
|
||||||
|
|
||||||
except json.JSONDecodeError as e:
|
|
||||||
logger.warning(f"解析失败: {e}, response={response[:100]}")
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
logger.warning(f"多查询生成失败: {e}")
|
|
||||||
|
|
||||||
# 回退到原始查询
|
|
||||||
return [(query, 1.0)]
|
|
||||||
|
|
||||||
async def search_memories(
|
async def search_memories(
|
||||||
self,
|
self,
|
||||||
query: str,
|
query: str,
|
||||||
|
|||||||
@@ -649,6 +649,7 @@ class MemoryTools:
|
|||||||
**当前查询:** {query}
|
**当前查询:** {query}
|
||||||
**发送者:** {sender if sender else '未知'}
|
**发送者:** {sender if sender else '未知'}
|
||||||
**参与者:** {', '.join(participants) if participants else '无'}
|
**参与者:** {', '.join(participants) if participants else '无'}
|
||||||
|
**当前时间:** {__import__('datetime').datetime.now().__str__()}
|
||||||
|
|
||||||
**最近聊天记录(最近5条):**
|
**最近聊天记录(最近5条):**
|
||||||
{recent_chat if recent_chat else '无聊天历史'}
|
{recent_chat if recent_chat else '无聊天历史'}
|
||||||
@@ -664,6 +665,7 @@ class MemoryTools:
|
|||||||
2. **关键概念查询**(权重0.8):查询中的核心概念,特别是聊天中提到的实体
|
2. **关键概念查询**(权重0.8):查询中的核心概念,特别是聊天中提到的实体
|
||||||
3. **话题扩展查询**(权重0.7):基于最近聊天话题的相关查询
|
3. **话题扩展查询**(权重0.7):基于最近聊天话题的相关查询
|
||||||
4. **动作/情感查询**(权重0.6):如果涉及情感或动作,生成相关查询
|
4. **动作/情感查询**(权重0.6):如果涉及情感或动作,生成相关查询
|
||||||
|
5. **精准时间查询**(权重0.5):针对时间相关的查询,生成更具体的时间范围,如2023年5月1日 12:00
|
||||||
|
|
||||||
**输出JSON格式:**
|
**输出JSON格式:**
|
||||||
```json
|
```json
|
||||||
|
|||||||
Reference in New Issue
Block a user