优化memory、rag和embedding模块
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Failing after 5m5s

This commit is contained in:
2026-04-29 10:52:01 +08:00
parent da4a7b0dd4
commit 223d1c9afd
4 changed files with 113 additions and 84 deletions

View File

@@ -4,24 +4,11 @@ Qdrant 向量检索器模块
提供基于 Qdrant 的基础向量检索和混合检索Dense + Sparse功能。
核心原理:
- 基础检索:将查询文本转换为向量,在 Qdrant 中进行近似最近邻ANN搜索
使用余弦相似度返回最相似的 k 个文档。
- 混合检索:结合稠密向量检索(语义相似)和 BM25 稀疏向量检索(关键词匹配),
通过加权或分数融合提高召回精度。
- 直接使用统一的 get_embedding_service(),已内置降级机制
使用示例:
>>> from rag_core import LlamaCppEmbedder
>>> embedder = LlamaCppEmbedder()
>>> embeddings = embedder.as_langchain_embeddings()
>>>
>>> # 创建基础检索器
>>> retriever = create_base_retriever(
... collection_name="my_docs",
... embeddings=embeddings,
... search_kwargs={"k": 10}
... )
>>>
>>> # 执行检索
>>> from app.rag.retriever import create_base_retriever
>>> retriever = create_base_retriever(collection_name="my_docs")
>>> docs = retriever.invoke("什么是 RAG")
"""
@@ -32,8 +19,10 @@ from langchain_qdrant import QdrantVectorStore
from langchain_core.embeddings import Embeddings
from langchain_core.retrievers import BaseRetriever
from rag_core import QDRANT_URL, QDRANT_API_KEY, LlamaCppEmbedder
from rag_core import QDRANT_URL, QDRANT_API_KEY
from rag_core.client import create_qdrant_client as create_core_qdrant_client
from app.model_services import get_embedding_service
from app.logger import info, warning
# 模块级常量
DEFAULT_SEARCH_K = 20
@@ -44,31 +33,24 @@ def create_base_retriever(
collection_name: str,
search_kwargs: Dict[str, Any] | None = None,
client: QdrantClient | None = None,
embeddings: Embeddings | None = None,
) -> BaseRetriever:
"""
创建基础向量检索器(仅稠密向量检索)
该检索器使用嵌入模型将查询转为向量,在 Qdrant 集合中执行 ANN 搜索,
返回语义上最相似的文档块。
创建基础向量检索器(仅稠密向量检索)
Args:
collection_name: Qdrant 集合名称(需预先创建并索引)。
search_kwargs: 搜索参数,可包含:
- k (int): 返回的文档数量,默认 20。
- score_threshold (float): 相似度阈值,仅返回高于此分数的文档。
- filter (dict): Qdrant 过滤条件。
若为 None则使用默认值 {"k": 20}。
client: 可选的 Qdrant 客户端实例。若未提供,将自动创建。
collection_name: Qdrant 集合名称
search_kwargs: 搜索参数
client: 可选的 Qdrant 客户端
embeddings: 可选的嵌入模型(默认使用 get_embedding_service()
Returns:
BaseRetriever 实例,可直接调用 .invoke(query) 或 .ainvoke(query) 检索
Raises:
ValueError: 如果集合不存在或嵌入模型无效。
LangChain 兼容的检索
"""
# 嵌入模型
embedder = LlamaCppEmbedder()
embeddings = embedder.as_langchain_embeddings()
# 默认使用统一嵌入服务(已内置降级机制)
if embeddings is None:
embeddings = get_embedding_service()
info("✅ 使用统一嵌入服务(本地 llama.cpp → 智谱 API 自动降级)")
# 合并默认搜索参数
merged_search_kwargs = {"k": DEFAULT_SEARCH_K}
@@ -79,14 +61,13 @@ def create_base_retriever(
if client is None:
client = create_core_qdrant_client()
# 验证集合是否存在(可选,便于提前发现问题)
# 验证集合是否存在
try:
client.get_collection(collection_name)
except UnexpectedResponse as e:
if e.status_code == 404:
raise ValueError(
f"Qdrant 集合 '{collection_name}' 不存在,请先创建并索引文档。"
)
warning(f"⚠️ Qdrant 集合 '{collection_name}' 不存在,请先创建并索引文档")
raise ValueError(f"Qdrant 集合 '{collection_name}' 不存在")
raise
# 构建向量存储
@@ -96,7 +77,6 @@ def create_base_retriever(
embedding=embeddings,
)
# 返回检索器
return vector_store.as_retriever(search_kwargs=merged_search_kwargs)
@@ -106,6 +86,7 @@ def create_hybrid_retriever(
sparse_k: int = 10,
score_threshold: float | None = DEFAULT_SCORE_THRESHOLD,
client: QdrantClient | None = None,
embeddings: Embeddings | None = None,
) -> BaseRetriever:
"""
创建混合检索器(稠密向量 + BM25 稀疏向量)。
@@ -122,6 +103,7 @@ def create_hybrid_retriever(
sparse_k: 稀疏向量检索返回数量,默认 10。
score_threshold: 相似度阈值,默认 0.3。
client: 可选的 Qdrant 客户端实例。
embeddings: 可选的嵌入模型实例。若未提供,将自动获取统一嵌入服务。
Returns:
BaseRetriever 实例,配置了混合搜索参数。
@@ -139,6 +121,7 @@ def create_hybrid_retriever(
collection_name=collection_name,
search_kwargs=search_kwargs,
client=client,
embeddings=embeddings,
)