feat(database): 为MySQL服务添加text函数导入支持

添加了SQLAlchemy的text函数导入,用于支持原始SQL查询操作,
增强数据库交互的灵活性和兼容性。

---

feat(excel): 改进Excel存储服务的列名处理机制

优化了列名清理逻辑,支持UTF8编码包括中文字符,实现唯一列名
生成机制,防止列名冲突。同时切换到pymysql直接插入方式,
提升批量数据插入性能并解决SQLAlchemy异步问题。

---

fix(rag): 改进RAG服务嵌入模型加载策略

当嵌入模型加载失败时,采用更稳健的降级策略,使用简化模式
运行RAG服务而非完全失败,确保系统核心功能可用性。
```
This commit is contained in:
2026-04-02 03:39:00 +08:00
parent 8e1ddb8aff
commit ec4759512d
3 changed files with 93 additions and 26 deletions

View File

@@ -40,24 +40,31 @@ class RAGService:
def _init_embeddings(self):
"""初始化嵌入模型"""
if self.embedding_model is None:
model_name = getattr(settings, 'EMBEDDING_MODEL', 'all-MiniLM-L6-v2')
# 使用轻量级本地模型,避免网络问题
model_name = 'all-MiniLM-L6-v2'
try:
self.embedding_model = SentenceTransformer(model_name)
self._dimension = self.embedding_model.get_sentence_embedding_dimension()
logger.info(f"RAG 嵌入模型初始化完成: {model_name}, 维度: {self._dimension}")
except Exception as e:
logger.warning(f"嵌入模型 {model_name} 加载失败,使用默认模型: {e}")
# 使用轻量级默认模型
self.embedding_model = SentenceTransformer('all-MiniLM-L6-v2')
self._dimension = self.embedding_model.get_sentence_embedding_dimension()
logger.info(f"RAG 嵌入模型使用默认: all-MiniLM-L6-v2, 维度: {self._dimension}")
logger.warning(f"嵌入模型 {model_name} 加载失败: {e}")
# 如果本地模型也失败使用简单hash作为后备
self.embedding_model = None
self._dimension = 384
logger.info("RAG 使用简化模式 (无向量嵌入)")
def _init_vector_store(self):
"""初始化向量存储"""
if self.index is None:
self._init_embeddings()
self.index = faiss.IndexIDMap(faiss.IndexFlatIP(self._dimension))
logger.info("Faiss 向量存储初始化完成")
if self.embedding_model is None:
# 无法加载嵌入模型,使用简化模式
self._dimension = 384
self.index = None
logger.warning("RAG 嵌入模型未加载,使用简化模式")
else:
self.index = faiss.IndexIDMap(faiss.IndexFlatIP(self._dimension))
logger.info("Faiss 向量存储初始化完成")
async def initialize(self):
"""异步初始化"""
@@ -86,6 +93,11 @@ class RAGService:
if not self._initialized:
self._init_vector_store()
# 如果没有嵌入模型,只记录到日志
if self.embedding_model is None:
logger.debug(f"字段跳过索引 (无嵌入模型): {table_name}.{field_name}")
return
text = f"表名: {table_name}, 字段: {field_name}, 描述: {field_description}"
if sample_values:
text += f", 示例值: {', '.join(sample_values)}"
@@ -108,6 +120,11 @@ class RAGService:
if not self._initialized:
self._init_vector_store()
# 如果没有嵌入模型,只记录到日志
if self.embedding_model is None:
logger.debug(f"文档跳过索引 (无嵌入模型): {doc_id}")
return
doc = SimpleDocument(
page_content=content,
metadata=metadata or {"doc_id": doc_id}