deepdata: core product code (backend, frontend, runtime, deepflow module)
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
"""
|
||||
LangChain Embeddings 封装
|
||||
|
||||
直接使用 LangChain 的 embeddings 功能,支持多种提供商:
|
||||
- OpenAI: langchain-openai
|
||||
- Ollama: langchain-community
|
||||
- 其他: 通过 LangChain 生态
|
||||
"""
|
||||
from typing import Optional, Any
|
||||
|
||||
from langchain_core.embeddings import Embeddings
|
||||
from langchain_openai import OpenAIEmbeddings
|
||||
|
||||
|
||||
class EmbeddingFactory:
|
||||
"""LangChain Embeddings 工厂类"""
|
||||
|
||||
@staticmethod
|
||||
def create_embeddings(
|
||||
model_name: str,
|
||||
base_url: Optional[str] = None,
|
||||
api_key: Optional[str] = None,
|
||||
**kwargs: Any,
|
||||
) -> Embeddings:
|
||||
"""
|
||||
创建 LangChain Embeddings 实例
|
||||
|
||||
Args:
|
||||
model_name: 模型名称(如 text-embedding-3-small)
|
||||
base_url: API 基础 URL
|
||||
api_key: API 密钥
|
||||
**kwargs: 其他参数
|
||||
|
||||
Returns:
|
||||
LangChain Embeddings 实例
|
||||
"""
|
||||
# ========== 新增修复开始 ==========
|
||||
# DashScope兼容模式不支持encoding_format=base64,强制删除该key
|
||||
if "encoding_format" in kwargs:
|
||||
del kwargs["encoding_format"]
|
||||
# ========== 新增修复结束 ==========
|
||||
|
||||
# OpenAI / OpenAI 兼容接口
|
||||
if "openai" in model_name.lower() or model_name.startswith("text-embedding"):
|
||||
return OpenAIEmbeddings(
|
||||
model=model_name,
|
||||
base_url=base_url,
|
||||
api_key=api_key,
|
||||
check_embedding_ctx_length=False,
|
||||
**kwargs,
|
||||
)
|
||||
# Ollama
|
||||
if base_url and "ollama" in base_url.lower():
|
||||
from langchain_community.embeddings.ollama import OllamaEmbeddings
|
||||
|
||||
return OllamaEmbeddings(
|
||||
model=model_name,
|
||||
base_url=base_url,
|
||||
**kwargs,
|
||||
)
|
||||
# 默认使用 OpenAI 兼容
|
||||
return OpenAIEmbeddings(
|
||||
model=model_name,
|
||||
base_url=base_url,
|
||||
api_key=api_key,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
# xuhuanqing
|
||||
@staticmethod
|
||||
async def aembed_texts(
|
||||
texts: list[str],
|
||||
model_name: str,
|
||||
base_url: str,
|
||||
api_key: str,
|
||||
**kwargs,
|
||||
) -> list[list[float]]:
|
||||
"""
|
||||
LangChain Embeddings 的异步包装
|
||||
专门给 LightRAG / 非 LangChain 调用方使用
|
||||
"""
|
||||
embeddings = EmbeddingFactory.create_embeddings(
|
||||
model_name=model_name,
|
||||
base_url=base_url,
|
||||
api_key=api_key,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
# LangChain 的 embed_documents 是同步的
|
||||
# 在 async 环境中用 run_in_executor 包装
|
||||
import asyncio
|
||||
loop = asyncio.get_running_loop()
|
||||
return await loop.run_in_executor(
|
||||
None,
|
||||
embeddings.embed_documents,
|
||||
texts,
|
||||
)
|
||||
Reference in New Issue
Block a user