1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//! Retrieval(语义检索)抽象模块
//!
//! # 概述
//!
//! Retrieval 用于向量存储和相似度搜索,支持:
//! - 插入/更新向量(upsert)
//! - 删除向量(delete)
//! - 获取向量(get)
//! - 相似度搜索(search)
//! - 清空存储(clear)
//! - 计数(count)
//!
//! 在 core 层,我们只定义抽象接口,不绑定具体实现。
//!
//! # 核心类型
//!
//! ## VectorStore trait
//!
//! [`VectorStore`] trait 定义了向量存储的接口:
//!
//! ```rust,no_run
//! use rucora_core::retrieval::{VectorStore, VectorRecord, VectorQuery, SearchResult};
//! use rucora_core::error::ProviderError;
//! use async_trait::async_trait;
//!
//! # async fn example(store: &dyn VectorStore) -> Result<(), ProviderError> {
//! // 插入向量
//! store.upsert(vec![
//! VectorRecord::new("id1".to_string(), vec![0.1; 128])
//! .with_text("Hello".to_string()),
//! ]).await?;
//!
//! // 搜索
//! let results = store.search(
//! VectorQuery::new(vec![0.1; 128])
//! .with_top_k(10)
//! ).await?;
//! # Ok(())
//! # }
//! ```
//!
//! ## VectorRecord
//!
//! 向量记录,包含:
//! - `id`: 记录 ID
//! - `vector`: 向量数据
//! - `text`: 可选的原始文本
//! - `metadata`: 可选元数据
//!
//! ## VectorQuery
//!
//! 向量查询,包含:
//! - `vector`: 查询向量
//! - `top_k`: 返回数量
//! - `filter`: 可选过滤条件
//! - `score_threshold`: 可选分数阈值
//!
//! ## SearchResult
//!
//! 搜索结果,包含:
//! - `id`: 记录 ID
//! - `score`: 相似度分数
//! - `text`: 可选的原始文本
//! - `metadata`: 可选元数据
//! - `vector`: 可选向量数据
//!
//! # 使用示例
//!
//! ## 实现简单 VectorStore
//!
//! ```rust,no_run
//! use rucora_core::retrieval::{VectorStore, VectorRecord, VectorQuery, SearchResult};
//! use rucora_core::error::ProviderError;
//! use async_trait::async_trait;
//!
//! struct SimpleVectorStore;
//!
//! #[async_trait]
//! impl VectorStore for SimpleVectorStore {
//! async fn upsert(&self, records: Vec<VectorRecord>) -> Result<(), ProviderError> {
//! // 实现插入逻辑
//! Ok(())
//! }
//!
//! async fn delete(&self, ids: Vec<String>) -> Result<(), ProviderError> {
//! // 实现删除逻辑
//! Ok(())
//! }
//!
//! async fn get(&self, ids: Vec<String>) -> Result<Vec<VectorRecord>, ProviderError> {
//! // 实现获取逻辑
//! Ok(vec![])
//! }
//!
//! async fn search(&self, query: VectorQuery) -> Result<Vec<SearchResult>, ProviderError> {
//! // 实现搜索逻辑
//! Ok(vec![])
//! }
//!
//! async fn clear(&self) -> Result<(), ProviderError> {
//! // 实现清空逻辑
//! Ok(())
//! }
//!
//! async fn count(&self) -> Result<usize, ProviderError> {
//! // 实现计数逻辑
//! Ok(0)
//! }
//! }
//! ```
//!
//! # 常见 VectorStore 实现
//!
//! - Chroma
//! - Pinecone
//! - Weaviate
//! - Milvus
//! - Qdrant
//! - 本地 SQLite + 向量扩展
/// 重新导出 retrieval 相关 trait
pub use r#trait::*;