feat(memory): 实现知识图谱与双通道检索

- 新增 KnowledgeGraph trait + InMemoryGraph(BFS 图遍历 + 标签管理)
- 扩展 MemoryRetriever 为双通道检索(Hybrid/KnowledgeOnly/GraphOnly)
- 统一 RetrievalResult 为 RetrievalItem enum 变体
- GraphRelation 使用复合键 + composite_key() 派生 id
- 旧 ScoredItem 标注 #[deprecated]
- 新增 knowledge_graph_demo 示例
- 全量测试 427 passed,clippy/doc 0 警告
This commit is contained in:
徐涛
2026-07-17 14:37:49 +08:00
parent 5bb349d177
commit 7e72e102a2
8 changed files with 2365 additions and 43 deletions
+11 -2
View File
@@ -74,8 +74,15 @@ async fn main() {
let result = retriever.retrieve("Rust 异步").await.unwrap();
println!("query: {}", result.query);
for item in &result.items {
println!(" 命中: {} (score={:.3})", item.page.title, item.score);
assert!((0.0..=1.0).contains(&item.score), "score 应在 [0, 1] 区间");
match item {
agcore::memory::RetrievalItem::KnowledgePage { page, score } => {
println!(" 命中: {} (score={:.3})", page.title, score);
assert!((0.0..=1.0).contains(score), "score 应在 [0, 1] 区间");
}
agcore::memory::RetrievalItem::GraphEntity { entity, score, .. } => {
println!(" 命中实体: {} (score={:.3})", entity.name, score);
}
}
}
assert!(!result.items.is_empty(), "应至少命中一个页面");
@@ -89,6 +96,7 @@ async fn main() {
let cfg = RetrieverConfig {
max_results: 20,
min_score: 0.5,
graph_depth: 2,
};
let retriever2 = MemoryRetriever::new(ks2, cfg);
let result = retriever2.retrieve("完全不相关的火锅配方").await.unwrap();
@@ -111,6 +119,7 @@ async fn main() {
let cfg = RetrieverConfig {
max_results: 2,
min_score: 0.0,
graph_depth: 2,
};
let retriever3 = MemoryRetriever::new(ks3, cfg);
let result = retriever3.retrieve("Rust").await.unwrap();