重构:添加模型服务模块,支持嵌入和重排服务的自动降级

新增功能:
- 创建 app/model_services 模块,提供统一的模型服务获取接口
- 实现 BaseServiceProvider 基类和 FallbackServiceChain 降级链
- 实现 get_embedding_service():优先本地 llama.cpp,降级到智谱 API
- 实现 get_rerank_service():优先本地 llama.cpp,降级到智谱 API
- 支持单例管理,确保全局只有一个服务实例

修改内容:
- 更新 app/config.py,添加智谱 API 相关配置
- 修改 rag_core/vector_store.py:支持接受外部传入的 embeddings
- 修改 rag_core/retriever_factory.py:支持接受外部传入的 embeddings
- 修改 app/agent/rag_initializer.py:使用 get_embedding_service()
- 修改 app/rag/pipeline.py:使用 get_rerank_service()
- 修改 app/memory/mem0_client.py:智能判断可用服务配置 mem0
- 修改 rag_indexer/index_builder.py:支持使用新服务,保持向后兼容
- 修改 rag_indexer/config.py:添加智谱配置

环境变量:
- ZHIPUAI_API_KEY:智谱 API 密钥(必选)
- ZHIPU_EMBEDDING_MODEL:可选,默认 embedding-3
- ZHIPU_RERANK_MODEL:可选,默认 rerank-2
- ZHIPU_API_BASE:可选,默认 https://open.bigmodel.cn/api/paas/v4
This commit is contained in:
2026-04-24 22:52:36 +08:00
parent 4722e2646a
commit 8db63e7a8d
13 changed files with 794 additions and 58 deletions

View File

@@ -2,12 +2,11 @@
import asyncio
import os
from ..config import LLAMACPP_RERANKER_URL, LLAMACPP_API_KEY
from typing import List
from langchain_core.documents import Document
from langchain_core.language_models import BaseLanguageModel
from .reranker import LLaMaCPPReranker
from ..model_services import get_rerank_service
from .query_transform import MultiQueryGenerator
from .fusion import reciprocal_rank_fusion
@@ -37,13 +36,9 @@ class RAGPipeline:
self.num_queries = num_queries
self.rerank_top_n = rerank_top_n
# 初始化组件
# 初始化组件 - 使用统一的重排服务获取接口
self.query_generator = MultiQueryGenerator(llm=llm, num_queries=num_queries)
self.reranker = LLaMaCPPReranker(
base_url=LLAMACPP_RERANKER_URL,
api_key=LLAMACPP_API_KEY,
top_n=rerank_top_n,
)
self.reranker = get_rerank_service()
async def aretrieve(self, query: str) -> List[Document]:
"""
@@ -68,9 +63,9 @@ class RAGPipeline:
# Step 4: 重排序
try:
final_docs = self.reranker.compress_documents(fused_docs, query)
final_docs = self.reranker.compress_documents(fused_docs, query, top_n=self.rerank_top_n)
except Exception:
# 若重排序器不可用,直接返回融合后的前 N
# 若重排序器不可用,直接返回融合后的前 N 个结果
final_docs = fused_docs[:self.rerank_top_n]
return final_docs