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:
renjianbo
2026-05-06 22:04:56 +08:00
parent 1f7c136544
commit 9054f42cda
4 changed files with 175 additions and 8 deletions

View File

@@ -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: