openJiuwen agent-core 检索模块 Embedding 基类全解析:统一文本嵌入接口的设计与实战
人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习【免费下载链接】agent-coreopenJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力项目地址https://gitcode.com/openJiuwen/agent-core点击查看免费下载本篇技术指南围绕 openJiuwen agent-core 检索模块中的嵌入Embedding抽象基类展开讲解openjiuwen.core.retrieval.embedding.base.Embedding如何为文本嵌入提供统一接口以及它在向量检索、知识库索引与多模态检索中的实际应用。读完本文你将掌握该基类的三个核心抽象成员embed_query、embed_documents、dimension的契约与实现原理理解APIEmbedding、OpenAIEmbedding、VLLMEmbedding、DashscopeEmbedding等派生实现的分层结构并能直接运行仓库自带的文本/多模态嵌入示例代码完成向量化与相似度验证。一、Embedding 基类在检索链路中的位置在 openJiuwen agent-core 中检索retrieval模块承担知识库管理、文档索引、嵌入向量生成、向量搜索以及多策略检索向量/稀疏/混合/图谱/Agentic等能力。嵌入模型位于这条链路的最前端任何文本或文档要进入向量库进行相似度检索都必须先通过 Embedding 模型转换为向量。从源码结构看模块的导入关系如下模块导出入口 通过_NON_LAZY_ATTRIBUTES直接暴露了Embedding与APIEmbedding两个类而OpenAIEmbedding、VLLMEmbedding、DashscopeEmbedding等重量级实现采用 PEP 562 的__getattr__惰性加载lazy import避免在导入检索模块时引入openai、dashscope等重型依赖。基类定义文件 本身非常精简它只是把 foundation 层的抽象类 重新导出__all__ [Embedding] from openjiuwen.core.foundation.store.base_embedding import Embedding也就是说base.Embedding的真正定义位于 foundation 存储层供检索模块、记忆模块等多个上层模块共享同一套嵌入抽象。二、抽象基类接口契约详解Embedding继承自abc.ABC定义了三个抽象成员任何具体实现都必须补齐这些能力。1.embed_query(text: str, **kwargs) - List[float]abstractmethod async获取单条查询文本的嵌入向量返回一维浮点列表abstractmethod async def embed_query(self, text: str, **kwargs) - List[float]: Embed query text参数说明参数类型说明textstr查询文本。在具体实现中如DashscopeEmbedding也接受MultimodalDocument多模态文档kwargsAny可变参数用于传递额外的配置参数例如dimensions、callback_cls等该方法主要用于检索阶段的 query 向量化用户输入一条查询得到向量后与索引库中的文档向量做相似度计算。2.embed_documents(texts: List[str], batch_size: Optional[int] None, **kwargs) - List[List[float]]abstractmethod async获取文档列表的嵌入向量返回二维浮点列表每个文档对应一个向量abstractmethod async def embed_documents( self, texts: List[str], batch_size: Optional[int] None, **kwargs, ) - List[List[float]]: Embed document texts参数说明参数类型说明textsList[str]文档文本列表batch_sizeint可选批处理大小默认值为None。传入后会与实现内部的max_batch_size取较小值确保不突破服务端限制kwargsAny可变参数可传入callback_cls回调类等该方法主要用于索引阶段的文档向量化批量把切分好的文本块TextChunk转为向量并写入向量存储。3.dimension - intpropertyabstractmethod返回嵌入向量的维度property abstractmethod def dimension(self) - int: Return embedding dimension在具体实现中维度通常不是固定写死的而是在首次请求成功后从返回向量长度推断并缓存。例如 APIEmbedding 的实现 会先查缓存self._dimension为空时通过同步方式调用embed_query_sync(test)探测一次并缓存结果同时在_get_embeddings中每次拿到响应后也会更新维度缓存。4. 配套配置模型EmbeddingConfig与基类同文件定义的还有 Pydantic 配置模型用于统一描述嵌入模型的接入信息class EmbeddingConfig(BaseModel): Embedding model configuration model_name: str Field(..., descriptionModel name) base_url: str Field(..., descriptionAPI Base URL) api_key: Optional[str] Field(None, descriptionAPI Key)其中model_name与base_url为必填项api_key可选本地推理服务如 vLLM 通常不需要。该配置模型在 检索公共配置 中被重新导出为openjiuwen.core.retrieval.EmbeddingConfig供知识库、索引器等场景统一使用。三、从抽象到实现Embedding 的类层次结构Embedding作为抽象基类并不直接实例化实际使用需选择具体实现。从 embedding 子包 的源码结构看当前仓库提供了四条实现路径1.APIEmbedding——通用 HTTP 嵌入客户端api_embedding.py 直接继承Embedding是最通用的实现。它以标准 HTTP POST 方式调用任意兼容 OpenAI 风格的嵌入服务请求体{model: model_name, input: text 或 list, **kwargs}请求头默认application/json若配置了api_key则附加Authorization: Bearer api_key响应兼容三种格式{embedding: [...]}{embeddings: [...]}{data: [{embedding: [...]}, ...]}OpenAI 标准格式关键构造参数及其作用参数默认值说明timeout60请求超时秒max_retries3失败重试次数extra_headersNone附加请求头max_batch_size8单次请求最大批大小max_concurrent50最大并发数通过asyncio.Semaphore控制实现细节上embed_documents会先经validate_embed_docs校验输入空列表、空文本、回调类合法性都会抛出对应错误码再按批大小切分并用asyncio.gather并发处理所有批次每批内部用信号量限制并发同步版本embed_documents_sync则通过懒初始化的ThreadPoolExecutor线程名前缀openjiuwen_embed并发提交任务。SSL 校验行为由环境变量控制EMBEDDING_SSL_VERIFYfalse可关闭校验EMBEDDING_SSL_CERT/path/to/ca.pem可指定自定义 CA 证书未设置时使用系统默认 CAHTTP 地址则自动跳过校验。2.OpenAIEmbedding——OpenAI 标准服务实现openai_embedding.py 继承APIEmbedding使用官方openaiSDK 封装内部同时创建openai.AsyncOpenAI与openai.OpenAI两个客户端。它额外支持encoding_formatbase64响应中的 base64 编码向量由 utils.py 中的parse_base64_embedding解码为float32列表Matryoshka 维度裁剪传入dimension整数后请求会自动附带dimensions参数服务端按目标维度输出matryoshka_dimensionTrue时生效构造时会把base_url尾部多余的/与/embeddings后缀去除保证拼接路径正确。3.VLLMEmbedding——vLLM 多模态嵌入实现vllm_embedding.py 继承OpenAIEmbedding面向 vLLM 部署的多模态嵌入模型如 Qwen3-VL-Embedding。其核心是parse_multimodal_input把MultimodalDocument转换为 vLLM 所需的extra_body.messages结构并支持通过instruction参数定制系统提示词默认Represent the users input.。embed_multimodal/embed_multimodal_sync分别提供异步与同步的多模态嵌入入口。4.DashscopeEmbedding——阿里云 DashScope 多模态实现dashscope_embedding.py 继承APIEmbedding基于dashscopeSDK 支持文本、图片、视频三类模态的嵌入。它同样支持 Matryoshka 维度裁剪dimension参数、max_batch_size、max_concurrent、自定义 SSL 上下文等能力并对响应做严格校验空embeddings、缺失字段等都会抛出RETRIEVAL_EMBEDDING_RESPONSE_INVALID等错误码同时按index字段对返回向量排序以保证与请求顺序一致。5. 统一错误码体系上述实现共享 异常码定义位于openjiuwen.core.common.exception.codes.StatusCode中的RETRIEVAL_EMBEDDING_*系列错误码例如RETRIEVAL_EMBEDDING_INPUT_INVALID输入为空文本或空列表RETRIEVAL_EMBEDDING_CALLBACK_INVALIDcallback_cls不是BaseCallback子类RETRIEVAL_EMBEDDING_REQUEST_CALL_FAILED重试耗尽后请求仍失败RETRIEVAL_EMBEDDING_RESPONSE_INVALID响应中缺少合法向量所有实现均通过build_error构造统一格式的异常便于上层捕获与日志排查。四、实战示例文本嵌入与语义相似度验证仓库在 examples/retrieval/ 目录下提供了可直接运行的示例脚本其中 showcase_text_embedding.py 演示了 Embedding 基类接口的完整用法。1. 环境准备先基于 .env.example 创建.env文件并填入嵌入服务配置# examples/retrieval/showcase_text_embedding.py EMBEDDING_API_BASE EMBEDDING_API_KEY EMBEDDING_MODELconfigs.py 会加载该文件并组装EmbeddingConfigEMBEDDING_CONFIG EmbeddingConfig( model_nameos.environ[EMBEDDING_MODEL], base_urlos.environ[EMBEDDING_API_BASE], api_keyos.environ[EMBEDDING_API_KEY], )若.env不存在程序会直接抛出FileNotFoundError(Please supply your .env file based on the .env.example provided)。2. 初始化嵌入模型示例选用VLLMEmbedding也可换成OpenAIEmbedding或APIEmbedding通过dimension参数指定向量维度timeout控制请求超时model VLLMEmbedding(EMBEDDING_CONFIG, dimensionEMBEDDING_DIM, timeout10)其中EMBEDDING_DIM 128注释明确说明Set to None to use default dimension。3. 调用embed_documents批量向量化embeddings await model.embed_documents([DOCUMENT_1, DOCUMENT_2, DOCUMENT_3]) emb1, emb2, emb3 embeddings[0], embeddings[1], embeddings[2]示例准备了三份文档英文现代光线追踪DOCUMENT_1、中文现代光线追踪DOCUMENT_2与 DOCUMENT_1 语义相同但语言不同、经典 Doom 光线投射引擎DOCUMENT_3。随后利用 utils/vector_similarities.py 提供的cosine_similarity与euclidean_distance计算两两相似度sim_1_2 cosine_similarity(emb1, emb2) # 期望跨语言同主题相似度最高 sim_1_3 cosine_similarity(emb1, emb3) # 期望相关渲染技术有较高相似度 dist_1_2 euclidean_distance(emb1, emb2) # 期望相似文档欧氏距离更小脚本末尾会输出 PASS/FAIL 判定验证三个预期跨语言同主题相似度最高、相关技术主题相似度大于 0.7、相似文档欧氏距离更小。这套流程直观展示了嵌入模型对语义而非字面相似度的捕捉能力。4. 多模态嵌入示例showcase_multimodal_embedding.py 演示了多模态路径通过MultimodalDocument把文本与图片组合成文档再调用embed_multimodal得到向量docs [MultimodalDocument() for _ in range(4)] docs[0].add_field(text, REFERENCE_TEXT).add_field(image, file_pathREF_IMAGE) docs[1].add_field(text, REFERENCE_TEXT).add_field(image, file_pathSAME_CONTENT_DIFFERENT_IMAGE) docs[2].add_field(text, REFERENCE_TEXT).add_field(image, file_pathDIFFERENT_IMAGE) docs[3].add_field(text, DIFFERENT_TEXT).add_field(image, file_pathREF_IMAGE) model VLLMEmbedding(MULTIMODAL_EMBEDDING_CONFIG, dimensionEMBEDDING_DIM, timeout10) emb1, emb2, emb3, emb4 await asyncio.gather(*(model.embed_multimodal(doc) for doc in docs))脚本验证了四个结论同一张图片不同格式jpg vs ppm向量高度相似不同图片向量差异显著相似度通常 0.9同一图片不同文本仍比不同图片更相似同一图片同一文本比同一图片不同文本更相似。从中可以推断多模态嵌入把图片内容与文本内容同时编码进向量MultimodalDocument的content与dashscope_input属性分别提供 OpenAI 风格与 DashScope 风格的请求结构详见 document.py。多模态配置同样在.env中提供MULTIMODAL_EMBEDDING_API_BASE MULTIMODAL_EMBEDDING_API_KEY MULTIMODAL_EMBEDDING_MODEL五、基类接口在上层检索场景中的接入方式Embedding 基类的三个抽象成员被上层多个组件直接消费从源码检索到的调用点包括vector_retriever.py、hybrid_retriever.py、graph_retriever.py在召回阶段调用embed_query把用户查询向量化再与向量库比对。embed_chunks.py、milvus_indexer.py在索引阶段调用embed_documents批量把文本块向量化后写入 Milvus、Chroma 等向量存储。因此任何自定义嵌入实现只要补齐embed_query、embed_documents、dimension三个抽象成员就可以无缝接入上述检索与索引流程这正是抽象基类统一接口设计的价值所在。单元测试方面tests/unit_tests/core/retrieval/embedding/ 下的test_api_embedding.py、test_openai_embedding.py、test_vllm_embedding.py、test_dashscope_embedding.py分别验证了各实现的关键行为——例如test_api_embedding.py用 Mock 断言了配置注入、信号量并发控制max_concurrent、线程池懒初始化与复用、错误码抛出等细节可作为二次开发自定义 Embedding 时的参考基线。六、小结openjiuwen.core.retrieval.embedding.base.Embedding是 openJiuwen agent-core 检索体系中最基础的抽象契约embed_query负责查询向量化、embed_documents负责文档批量向量化、dimension提供向量维度元信息。围绕这一契约仓库在 embedding 子包 内实现了通用 HTTPAPIEmbedding、OpenAI 标准OpenAIEmbedding、vLLM 多模态VLLMEmbedding、DashScope 多模态DashscopeEmbedding四条路径并配套了 基础定义 与统一错误码。实际开发中你既可以直接复用这些实现参考 示例代码也可以继承Embedding编写自定义嵌入模型将其接入向量检索、混合检索与知识库索引等完整链路。赞分享人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习【免费下载链接】agent-coreopenJiuwen agent-core可提供AI Agent开发、运行、调优与演进相关的全套SDK能力项目地址https://gitcode.com/openJiuwen/agent-core点击查看免费下载相关推荐openJiuwen agent-core 文本向量化Embedding 抽象基类接口设计与多后端实现深度解析openJiuwen agent core 文本向量化Embedding 抽象基类接口设计与多后端实现深度解析 导读 本文以 openJiuwen agent人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 检索索引中的 Chunker 文本分块基类接口设计、参数校验与扩展实践openJiuwen agent core 检索索引中的 Chunker 文本分块基类接口设计、参数校验与扩展实践 文本分块Chunking是构建 RAG人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习openJiuwen agent-core 检索器统一抽象接口Retriever 基类深度解析与实战指南openJiuwen agent core 检索器统一抽象接口Retriever 基类深度解析与实战指南 导读 本文围绕 openJiuwen agent c人工智能AI AgentAgent 框架大模型工具调用RAG提示工程强化学习创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考