feat(ai): 向量搜索 + hit test API

- KnowledgeV2Service.vector_search: pgvector 余弦相似度搜索
- SearchHit DTO: chunk_id/document_id/similarity/metadata
- hit_test handler: POST /ai/documents/hit-test (embed query → 搜索)
- AiState 添加 embedding 字段,共享 EmbeddingService 实例
- top_k 限制最大 20

Phase 2 Task 11
This commit is contained in:
iven
2026-05-27 00:24:34 +08:00
parent e94f5bc00c
commit 7d1b1f9c7c
5 changed files with 154 additions and 6 deletions

View File

@@ -594,6 +594,13 @@ async fn main() -> anyhow::Result<()> {
cache_ttl,
));
let embedding_svc = std::sync::Arc::new(
erp_ai::service::embedding::EmbeddingService::from_settings(&db).await,
);
let knowledge_v2_svc = std::sync::Arc::new(
erp_ai::service::knowledge_v2::KnowledgeV2Service::new(db.clone()),
);
erp_ai::AiState {
db: db.clone(),
event_bus: event_bus.clone(),
@@ -612,13 +619,15 @@ async fn main() -> anyhow::Result<()> {
),
knowledge: std::sync::Arc::new(erp_ai::service::knowledge::KnowledgeService::new(
db.clone(),
std::sync::Arc::new(
erp_ai::service::embedding::EmbeddingService::from_settings(&db).await,
),
embedding_svc.clone(),
)),
knowledge_v2: std::sync::Arc::new(
erp_ai::service::knowledge_v2::KnowledgeV2Service::new(db.clone()),
),
knowledge_v2: knowledge_v2_svc.clone(),
document: std::sync::Arc::new(erp_ai::service::document::DocumentService::new(
db.clone(),
knowledge_v2_svc,
embedding_svc.clone(),
)),
embedding: embedding_svc,
chat_session: std::sync::Arc::new(
erp_ai::service::chat_session::ChatSessionService::new(db.clone()),
),