feat: 实现 BM25 稀疏 + 稠密向量混合检索功能
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Has been cancelled
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Has been cancelled
This commit is contained in:
@@ -3,11 +3,15 @@
|
||||
|
||||
本模块提供统一的重排模型服务获取接口,支持自动降级:
|
||||
1. 优先使用本地 llama.cpp 重排服务
|
||||
2. 本地服务不可用时,自动降级到智谱 API 重排服务
|
||||
2. 本地服务不可用时,自动降级到硅基流动(SiliconFlow) API 重排服务
|
||||
3. 硅基流动服务不可用时,自动降级到智谱 API 重排服务
|
||||
4. 所有API服务不可用时,自动降级到 LLM 评分重排服务
|
||||
|
||||
主要功能:
|
||||
- LocalLlamaCppRerankProvider:本地 llama.cpp 重排服务提供者
|
||||
- SiliconFlowRerankProvider:硅基流动 API 重排服务提供者
|
||||
- ZhipuRerankProvider:智谱 API 重排服务提供者
|
||||
- LLMFallbackRerankProvider:LLM 评分降级重排服务提供者
|
||||
- get_rerank_service():获取重排服务的统一接口
|
||||
|
||||
注意:本模块只负责调用 rerank server,不包含业务逻辑(文档处理、排序、top_n)
|
||||
@@ -28,7 +32,10 @@ from app.config import (
|
||||
LLAMACPP_API_KEY,
|
||||
ZHIPUAI_API_KEY,
|
||||
ZHIPU_RERANK_MODEL,
|
||||
ZHIPU_API_BASE
|
||||
ZHIPU_API_BASE,
|
||||
SILICONFLOW_API_KEY,
|
||||
SILICONFLOW_RERANK_MODEL,
|
||||
SILICONFLOW_API_BASE
|
||||
)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -136,6 +143,53 @@ class ZhipuRerankService(BaseRerankService):
|
||||
raise
|
||||
|
||||
|
||||
class SiliconFlowRerankService(BaseRerankService):
|
||||
"""
|
||||
硅基流动(SiliconFlow) API 重排服务 - 纯服务层
|
||||
"""
|
||||
|
||||
def __init__(self, model: str | None = None, api_key: str | None = None, api_base: str | None = None):
|
||||
self.model = model or SILICONFLOW_RERANK_MODEL
|
||||
self.api_key = api_key or SILICONFLOW_API_KEY
|
||||
self.api_base = api_base or SILICONFLOW_API_BASE
|
||||
|
||||
def compute_scores(self, query: str, documents: List[str]) -> List[float]:
|
||||
"""
|
||||
调用 SiliconFlow rerank API 计算得分 - 纯 API 调用
|
||||
"""
|
||||
if not documents:
|
||||
return []
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {self.api_key}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
base = self.api_base.rstrip("/")
|
||||
payload = {
|
||||
"model": self.model,
|
||||
"query": query,
|
||||
"documents": documents,
|
||||
"return_documents": False
|
||||
}
|
||||
|
||||
with httpx.Client(timeout=120) as client:
|
||||
response = client.post(
|
||||
f"{base}/rerank",
|
||||
headers=headers,
|
||||
json=payload,
|
||||
)
|
||||
response.raise_for_status()
|
||||
data = response.json()
|
||||
|
||||
if isinstance(data, dict) and "results" in data:
|
||||
results = data["results"]
|
||||
results_sorted = sorted(results, key=lambda x: x["index"])
|
||||
return [item["relevance_score"] for item in results_sorted]
|
||||
else:
|
||||
raise ValueError(f"未知的 SiliconFlow rerank API 响应格式: {data}")
|
||||
|
||||
|
||||
class LLMFallbackRerankService(BaseRerankService):
|
||||
"""
|
||||
使用 LLM 作为最后的降级方案进行重排
|
||||
@@ -291,18 +345,53 @@ class ZhipuRerankProvider(BaseServiceProvider[BaseRerankService]):
|
||||
return self._service_instance
|
||||
|
||||
|
||||
class SiliconFlowRerankProvider(BaseServiceProvider[BaseRerankService]):
|
||||
"""
|
||||
硅基流动(SiliconFlow) API 重排服务提供者
|
||||
"""
|
||||
|
||||
def __init__(self, model: str | None = None):
|
||||
super().__init__("siliconflow_rerank")
|
||||
self._model = model or SILICONFLOW_RERANK_MODEL
|
||||
|
||||
def is_available(self) -> bool:
|
||||
"""
|
||||
检查 SiliconFlow API 重排服务是否可用
|
||||
"""
|
||||
if not SILICONFLOW_API_KEY:
|
||||
logger.warning("SILICONFLOW_API_KEY 未配置")
|
||||
return False
|
||||
|
||||
try:
|
||||
service = SiliconFlowRerankService(model=self._model)
|
||||
test_scores = service.compute_scores("test query", ["test document"])
|
||||
logger.info("SiliconFlow 重排服务可用")
|
||||
return True
|
||||
except Exception as e:
|
||||
logger.warning(f"SiliconFlow 重排服务不可用: {e}")
|
||||
return False
|
||||
|
||||
def get_service(self) -> BaseRerankService:
|
||||
"""
|
||||
获取 SiliconFlow API 重排服务
|
||||
"""
|
||||
if self._service_instance is None:
|
||||
self._service_instance = SiliconFlowRerankService(model=self._model)
|
||||
return self._service_instance
|
||||
|
||||
|
||||
def get_rerank_service() -> BaseRerankService:
|
||||
"""
|
||||
获取重排服务(带自动降级)- 纯服务层
|
||||
|
||||
降级链: Local llama.cpp -> Zhipu Rerank -> LLM Fallback
|
||||
降级链: Local llama.cpp -> SiliconFlow Rerank -> Zhipu Rerank -> LLM Fallback
|
||||
|
||||
Returns:
|
||||
BaseRerankService: 重排服务实例
|
||||
"""
|
||||
def _create_chain():
|
||||
primary = LocalLlamaCppRerankProvider()
|
||||
fallbacks = [ZhipuRerankProvider(), LLMFallbackRerankProvider()]
|
||||
fallbacks = [SiliconFlowRerankProvider(), ZhipuRerankProvider(), LLMFallbackRerankProvider()]
|
||||
return FallbackServiceChain(primary, fallbacks)
|
||||
|
||||
chain = SingletonServiceManager.get_or_create("rerank_service_chain", _create_chain)
|
||||
|
||||
Reference in New Issue
Block a user