feat: Agent间知识共享 — 全局知识池(去重+置信度+过期)
- GlobalKnowledge 模型新增 confidence 和 expires_at 字段 - save_global_knowledge 增加 MD5 去重、置信度评分、TTL过期 - _global_knowledge_search 增加过期过滤、置信度优先排序 - run()/run_stream() 所有完成路径补齐知识提取调用 - 新增 Alembic 迁移 010_add_global_knowledge Cl oses #9 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -226,6 +226,7 @@ class AgentRuntime:
|
||||
# LLM 直接返回文本 → 结束
|
||||
self.context.add_assistant_message(content)
|
||||
final_text = content or "(模型未返回有效内容)"
|
||||
review_score = 0.0
|
||||
|
||||
# 输出质量自检(默认关闭,Agent 节点可开启)
|
||||
if self.config.self_review_enabled and not _self_review_attempted:
|
||||
@@ -239,6 +240,7 @@ class AgentRuntime:
|
||||
tool_result=json.dumps(review, ensure_ascii=False),
|
||||
))
|
||||
if review["passed"]:
|
||||
review_score = review["score"]
|
||||
logger.info("self_review 通过 (%.2f >= %.2f)", review["score"], review["threshold"])
|
||||
else:
|
||||
logger.info("self_review 未通过 (%.2f < %.2f),追加修正", review["score"], review["threshold"])
|
||||
@@ -269,7 +271,7 @@ class AgentRuntime:
|
||||
tool_calls_made=self.context.tool_calls_made,
|
||||
)
|
||||
# 提取知识到全局知识池(Agent 间知识共享)
|
||||
await self._extract_global_knowledge(user_input, final_text, steps)
|
||||
await self._extract_global_knowledge(user_input, final_text, steps, review_score)
|
||||
return AgentResult(
|
||||
success=True,
|
||||
content=final_text,
|
||||
@@ -393,6 +395,9 @@ class AgentRuntime:
|
||||
iterations_used=self.context.iteration,
|
||||
tool_calls_made=self.context.tool_calls_made,
|
||||
)
|
||||
# 提取知识到全局知识池(即便截断,工具调用序列仍有参考价值)
|
||||
if last_content:
|
||||
await self._extract_global_knowledge(user_input, last_content, steps)
|
||||
if last_content:
|
||||
steps.append(AgentStep(
|
||||
iteration=self.context.iteration,
|
||||
@@ -512,6 +517,7 @@ class AgentRuntime:
|
||||
# LLM 直接返回文本 → 结束
|
||||
self.context.add_assistant_message(content)
|
||||
final_text = content or "(模型未返回有效内容)"
|
||||
review_score = 0.0
|
||||
|
||||
# 输出质量自检(默认关闭)
|
||||
if self.config.self_review_enabled and not _self_review_attempted:
|
||||
@@ -524,6 +530,7 @@ class AgentRuntime:
|
||||
"session_id": self.context.session_id,
|
||||
}
|
||||
if review["passed"]:
|
||||
review_score = review["score"]
|
||||
logger.info("self_review 通过 (%.2f >= %.2f)", review["score"], review["threshold"])
|
||||
else:
|
||||
logger.info("self_review 未通过 (%.2f < %.2f),追加修正", review["score"], review["threshold"])
|
||||
@@ -560,6 +567,8 @@ class AgentRuntime:
|
||||
iterations_used=self.context.iteration,
|
||||
tool_calls_made=self.context.tool_calls_made,
|
||||
)
|
||||
# 提取知识到全局知识池(Agent 间知识共享)
|
||||
await self._extract_global_knowledge(user_input, final_text, steps, review_score)
|
||||
return
|
||||
|
||||
# 有工具调用 → 先记录 assistant 消息
|
||||
@@ -706,6 +715,9 @@ class AgentRuntime:
|
||||
iterations_used=self.context.iteration,
|
||||
tool_calls_made=self.context.tool_calls_made,
|
||||
)
|
||||
# 提取知识到全局知识池(即便截断,工具调用序列仍有参考价值)
|
||||
if last_content:
|
||||
await self._extract_global_knowledge(user_input, last_content, steps)
|
||||
yield {
|
||||
"type": "final",
|
||||
"content": last_content or "已达最大迭代次数,但模型未返回最终回答。",
|
||||
@@ -778,6 +790,7 @@ class AgentRuntime:
|
||||
|
||||
async def _extract_global_knowledge(
|
||||
self, user_input: str, final_answer: str, steps: List[AgentStep],
|
||||
self_review_score: float = 0.0,
|
||||
) -> None:
|
||||
"""从 Agent 执行结果中提取知识,写入全局知识池(Agent 间共享)。"""
|
||||
# 提取工具调用名称作为 tags
|
||||
@@ -798,11 +811,24 @@ class AgentRuntime:
|
||||
source_agent_id = self.config.name if self.config.name != "default_agent" else ""
|
||||
source_user_id = self.config.user_id or ""
|
||||
|
||||
# 置信度评估:基于 self_review 评分和工具执行成功数
|
||||
confidence = "medium"
|
||||
if self_review_score >= 0.8:
|
||||
confidence = "high"
|
||||
elif self_review_score > 0 and self_review_score < 0.5:
|
||||
confidence = "low"
|
||||
elif tool_names and len(tool_names) >= 2:
|
||||
confidence = "high" # 多工具协作通常质量更高
|
||||
# TTL: 高置信度知识有效期更长
|
||||
ttl_hours = 720 if confidence == "high" else 168 if confidence == "medium" else 24
|
||||
|
||||
await self.memory.save_global_knowledge(
|
||||
content=content,
|
||||
source_agent_id=source_agent_id,
|
||||
source_user_id=source_user_id,
|
||||
tags=tags,
|
||||
confidence=confidence,
|
||||
ttl_hours=ttl_hours,
|
||||
)
|
||||
|
||||
async def _self_review(self, content: str, task_context: str = "") -> dict:
|
||||
|
||||
Reference in New Issue
Block a user