
基于 Haystack 2.x 的 ArcadeDB 集成指南ArcadeDBDocumentStore 与 ArcadeDBEmbeddingRetriever 实战【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack本篇技术指南以 Haystack 官方 API 参考文档为骨架系统讲解 ArcadeDB 在 Haystack 2.x 中的集成方式如何通过ArcadeDBDocumentStore将 ArcadeDB支持 LSM_VECTOR/HNSW 向量索引的多模型数据库作为文档存储以及如何用ArcadeDBEmbeddingRetriever完成基于向量相似度的语义检索。读完本文你将掌握从环境搭建、凭据配置、文档写入到构建完整语义检索 Pipeline 的全部实操步骤并理解底层基于 HTTP/JSON API 的实现原理与关键参数语义。ArcadeDB 集成概览ArcadeDB 是一款多模型数据库graph、document、key-value在 Haystack 生态中它扮演的是向量检索型文档存储的角色。根据 文档存储选型指南 的定位ArcadeDB 通过 HTTP/JSON API 提供 HNSW 向量搜索支持的检索类型为Embedding向量检索。本次集成包含两个核心组件均由arcadedb-haystack包提供组件模块路径职责ArcadeDBDocumentStorehaystack_integrations.document_stores.arcadedb文档存储与写入、删除、过滤、元数据统计HNSW 向量索引管理ArcadeDBEmbeddingRetrieverhaystack_integrations.components.retrievers.arcadedb通过向量相似度LSM_VECTOR / HNSW 索引从 DocumentStore 检索文档两个组件都在官方 API 参考文档 integrations-api/arcadedb.md 中有完整的签名与参数说明下文逐一展开。环境准备与安装启动 ArcadeDB 服务推荐使用 Docker 一键启动 ArcadeDB并通过JAVA_OPTS设置 root 密码docker run -d -p 2480:2480 \ -e JAVA_OPTS-Darcadedb.server.rootPasswordarcadedb \ arcadedata/arcadedb:latest这里将容器的2480端口映射到宿主机2480是 ArcadeDB 的 HTTP 端点端口后续 DocumentStore 默认连接地址http://localhost:2480即指向该服务。安装集成包pip install arcadedb-haystack若需要运行本文中的嵌入示例使用 Sentence Transformers 生成向量还需安装对应的 embedder 集成包pip install sentence-transformers-haystack配置凭据环境变量方式推荐ArcadeDBDocumentStore默认通过 HTTP Basic Auth 认证用户名与密码分别从环境变量读取对应__init__中Secret.from_env_var(...)的默认行为见 API 参考export ARCADEDB_USERNAMEroot export ARCADEDB_PASSWORDarcadedb也可以在构造 DocumentStore 时显式传入username与password覆盖环境变量。ArcadeDBDocumentStore文档存储与向量索引ArcadeDBDocumentStore是面向 Haystack 2.x 的 ArcadeDB 文档存储实现。其核心设计特点是所有操作都通过 ArcadeDB 的 HTTP/JSON API 完成无需额外的数据库驱动支持 HNSW 向量搜索LSM_VECTOR 索引以及基于 SQL 的元数据过滤。初始化参数详解构造签名摘自 API 参考__init__( *, url: str http://localhost:2480, database: str haystack, username: Secret Secret.from_env_var(ARCADEDB_USERNAME, strictFalse), password: Secret Secret.from_env_var(ARCADEDB_PASSWORD, strictFalse), type_name: str Document, embedding_dimension: int 768, similarity_function: str cosine, recreate_type: bool False, create_database: bool True ) - None参数默认值说明urlhttp://localhost:2480ArcadeDB HTTP 端点databasehaystack数据库名称username环境变量ARCADEDB_USERNAMEHTTP Basic Auth 用户名password环境变量ARCADEDB_PASSWORDHTTP Basic Auth 密码type_nameDocument存储文档的顶点Vertex类型名embedding_dimension768HNSW 索引的向量维度需与你的 Embedder 输出维度一致similarity_functioncosine距离度量可选cosine、euclidean、dotrecreate_typeFalse若为True初始化时删除并重建该类型适用于反复测试create_databaseTrue若为True数据库不存在时自动创建写入文档的基本用法from haystack import Document from haystack_integrations.document_stores.arcadedb import ArcadeDBDocumentStore document_store ArcadeDBDocumentStore( urlhttp://localhost:2480, databasehaystack, embedding_dimension768, recreate_typeTrue, ) document_store.write_documents( [ Document(contentThis is first, embedding[0.0] * 768), Document(contentThis is second, embedding[0.1, 0.2, 0.3] [0.0] * 765), ] ) print(document_store.count_documents())write_documents接受 HaystackDocument列表与DuplicatePolicy策略返回实际写入的文档数量int。需要注意缺少嵌入或维度不一致的文档会被以零填充向量zero-padded的方式存储从而仍可被写入和过滤若要进行真正的语义检索应在索引阶段使用 Document Embedder 生成真实嵌入。recreate_typeTrue会先删除再重建顶点类型适合开发调试生产环境一般保持False以免误删数据。文档操作 API 全览ArcadeDBDocumentStore实现了 Haystack 文档存储协议对应 document_store 协议定义除写入外还提供以下操作方法签名要点返回值用途count_documents() - intint统计文档总数filter_documents(filtersNone) - list[Document]list[Document]按 Haystack 过滤字典筛选文档delete_documents(document_ids: list[str]) - NoneNone按 ID 删除文档delete_all_documents() - NoneNone清空所有文档delete_by_filter(filters) - intint删除匹配过滤条件的文档并返回删除数量update_by_filter(filters, meta) - intint批量更新匹配文档的元数据并返回更新数量count_documents_by_filter(filters) - intint统计匹配过滤条件的文档数count_unique_metadata_by_filter(filters, metadata_fields) - dict[str, int]dict[str, int]统计各元数据字段的唯一值数量get_metadata_fields_info() - dict[str, dict[str, str]]字段名到{type: ...}的映射基于采样文档推断元数据字段及类型get_metadata_field_min_max(metadata_field) - dict[str, Any]含min/max键的字典获取数值型元数据字段的最小/最大值get_metadata_field_unique_values(metadata_field, search_termNone, from_0, size10, filtersNone)tuple[list[Any], int]分页获取字段唯一值及其总数关于get_metadata_field_unique_values有一个容易踩坑的细节API 参考中特别注明即使不同值在 Python 中比较相等只要类型不同就会被分别返回——例如整数1、浮点数1.0、布尔值True和字符串1会被当作四个独立的值。此外search_term是大小写不敏感的子串搜索from_与size用于分页控制。过滤与删除的元数据过滤语法delete_by_filter与update_by_filter中的filters参数遵循 Haystack 标准的元数据过滤语法比较过滤器如{field: meta.type, operator: , value: article}逻辑过滤器如{operator: AND, conditions: [...]}。从 FilterPolicy 实现 可以看出Haystack 过滤器分为比较型含field/operator/value三键与逻辑型含operator/conditions两类ArcadeDB 集成会将这些过滤条件翻译为底层的 SQL 过滤。ArcadeDBEmbeddingRetriever向量相似度检索ArcadeDBEmbeddingRetriever是配套的向量检索组件它利用 ArcadeDB 的 LSM_VECTORHNSW索引将查询向量与文档向量做相似度比对返回最相似的文档列表。初始化与运行签名构造签名摘自 API 参考__init__( *, document_store: ArcadeDBDocumentStore, filters: dict[str, Any] | None None, top_k: int 10, filter_policy: FilterPolicy FilterPolicy.REPLACE ) - Nonerun方法签名run( query_embedding: list[float], filters: dict[str, Any] | None None, top_k: int | None None, ) - dict[str, list[Document]]参数位置说明document_store__init__必填ArcadeDBDocumentStore实例filters__init__/run元数据过滤条件init 中设置的作为每次检索的默认过滤top_k__init__默认 10/run返回的最大文档数run中的值可覆盖 init 值filter_policy__init__默认REPLACE运行时过滤器与默认过滤器的交互策略query_embeddingrun必填查询文本的嵌入向量list[float]run返回字典键为documents值为与query_embedding最相似的Document列表。单独使用的完整示例以下示例来自 API 参考文档演示了「写入 → 嵌入 → 检索」的最小闭环from haystack import Document # Requires: pip install sentence-transformers-haystack from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, ) from haystack_integrations.components.retrievers.arcadedb import ( ArcadeDBEmbeddingRetriever, ) from haystack_integrations.document_stores.arcadedb import ArcadeDBDocumentStore store ArcadeDBDocumentStore(databasemydb) retriever ArcadeDBEmbeddingRetriever(document_storestore, top_k5) # 写入文档 documents [ Document(textMy name is Carla and I live in Berlin), Document(textMy name is Paul and I live in New York), Document(textMy name is Silvano and I live in Matera), Document(textMy name is Usagi Tsukino and I live in Tokyo), ] document_store.write_documents(documents) # 对查询生成嵌入 embedder SentenceTransformersTextEmbedder() query_embeddings embedder.run(Who lives in Berlin?)[embedding] # 向量相似度检索 result retriever.run(queryquery_embeddings) for doc in result[documents]: print(doc.content)关于 filter_policy运行时过滤器与默认过滤器的交互filter_policy控制 init 阶段设置的默认过滤器与run阶段传入的运行时过滤器如何组合。根据 FilterPolicy 源码 的定义FilterPolicy.REPLACE默认运行时过滤器直接替换 init 过滤器FilterPolicy.MERGE运行时过滤器与 init 过滤器合并字段冲突时以运行时值为准。合并遵循 apply_filter_policy 中的规则比较型与逻辑型过滤器会按AND逻辑组合可配置default_logical_operator同字段冲突时运行时过滤器优先。在 Pipeline 中使用完整的语义搜索/RAG 检索链路ArcadeDBEmbeddingRetriever最常见的 Pipeline 位置是在 Text Embedder 之后、ChatPromptBuilder 之前RAG 场景或作为语义搜索管线的最后一个组件。完整示例见 Retriever 用户指南from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) from haystack_integrations.document_stores.arcadedb import ArcadeDBDocumentStore from haystack_integrations.components.retrievers.arcadedb import ( ArcadeDBEmbeddingRetriever, ) document_store ArcadeDBDocumentStore( urlhttp://localhost:2480, databasehaystack, embedding_dimension768, recreate_typeTrue, ) documents [ Document(contentThere are over 7,000 languages spoken around the world today.), Document(contentElephants have been observed to recognize themselves in mirrors.), Document(contentBioluminescent waves can be seen in the Maldives and Puerto Rico.), ] # 索引侧用 Document Embedder 生成嵌入后写入 document_embedder SentenceTransformersDocumentEmbedder() documents_with_embeddings document_embedder.run(documents) document_store.write_documents( documents_with_embeddings[documents], policyDuplicatePolicy.OVERWRITE, ) # 查询侧Text Embedder - ArcadeDBEmbeddingRetriever query_pipeline Pipeline() query_pipeline.add_component(text_embedder, SentenceTransformersTextEmbedder()) query_pipeline.add_component( retriever, ArcadeDBEmbeddingRetriever(document_storedocument_store, top_k3), ) query_pipeline.connect(text_embedder.embedding, retriever.query_embedding) result query_pipeline.run( {text_embedder: {text: How many languages are there?}}, ) print(result[retriever][documents][0])这里的DuplicatePolicy.OVERWRITE是 Haystack 标准枚举值之一。完整定义见 policy.pyNONE不做去重处理、SKIP跳过重复、OVERWRITE覆盖写入、FAIL遇重复报错。在反复运行索引流程时使用OVERWRITE可避免文档 ID 冲突导致写入失败。序列化与资源管理两个组件都实现了 Haystack 标准的序列化接口便于在 Pipeline YAML 中保存与恢复方法组件说明to_dict() - dict[str, Any]两者将组件序列化为字典from_dict(data) - ArcadeDBDocumentStore / ArcadeDBEmbeddingRetriever两者从字典反序列化恢复组件close() - None两者释放底层 Document Store 的同步资源其中from_dict的反序列化过程会依据序列化字典重建组件实例close用于显式释放 HTTP 连接等同步资源适合在长生命周期应用中做资源清理。常见问题与使用建议嵌入维度必须一致embedding_dimension默认 768必须与所选 Embedder 的输出维度匹配否则 HNSW 索引无法正确检索维度不匹配的文档会被零填充存储只可过滤、不可有效检索。距离度量选择similarity_function支持cosine默认、euclidean、dot三种需与 Embedder 的训练目标/使用习惯保持一致例如 Sentence Transformers 通常搭配 cosine。开发期使用recreate_typeTrue需要反复修改 schema 或清空重建时开启生产环境务必关闭。凭据安全优先使用环境变量ARCADEDB_USERNAME/ARCADEDB_PASSWORD避免在代码或 YAML 中明文写入密码。定位认知根据 文档存储选型指南ArcadeDB 作为多模型数据库支持 embedding 检索适合需要向量搜索与图/文档模型能力结合的场景纯向量检索场景也可按需选择其他专用向量存储。参考资源API 参考integrations-api/arcadedb.md本文核心依据DocumentStore 用户指南arcadedbdocumentstore.mdxRetriever 用户指南arcadedbembeddingretriever.mdx存储选型choosing-a-document-store.mdx底层协议与策略文档存储协议 protocol.py、去重策略 policy.py、过滤策略 filter_policy.py【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考