基于 Haystack 2.x 的 ArcadeDB 集成指南:ArcadeDBDocumentStore 与 ArcadeDBEmbeddingRetriever 实战
2026/9/14 4:09:11 网站建设 项目流程

基于 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.rootPassword=arcadedb" \ 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_USERNAME=root export ARCADEDB_PASSWORD=arcadedb

也可以在构造 DocumentStore 时显式传入usernamepassword覆盖环境变量。

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", strict=False), password: Secret = Secret.from_env_var("ARCADEDB_PASSWORD", strict=False), type_name: str = "Document", embedding_dimension: int = 768, similarity_function: str = "cosine", recreate_type: bool = False, create_database: bool = True ) -> None
参数默认值说明
url"http://localhost:2480"ArcadeDB HTTP 端点
database"haystack"数据库名称
username环境变量ARCADEDB_USERNAMEHTTP Basic Auth 用户名
password环境变量ARCADEDB_PASSWORDHTTP Basic Auth 密码
type_name"Document"存储文档的顶点(Vertex)类型名
embedding_dimension768HNSW 索引的向量维度,需与你的 Embedder 输出维度一致
similarity_function"cosine"距离度量,可选"cosine""euclidean""dot"
recreate_typeFalse若为True,初始化时删除并重建该类型(适用于反复测试)
create_databaseTrue若为True,数据库不存在时自动创建

写入文档的基本用法

from haystack import Document from haystack_integrations.document_stores.arcadedb import ArcadeDBDocumentStore document_store = ArcadeDBDocumentStore( url="http://localhost:2480", database="haystack", embedding_dimension=768, recreate_type=True, ) document_store.write_documents( [ Document(content="This is first", embedding=[0.0] * 768), Document(content="This 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_type=True会先删除再重建顶点类型,适合开发调试;生产环境一般保持False以免误删数据。

文档操作 API 全览

ArcadeDBDocumentStore实现了 Haystack 文档存储协议(对应 document_store 协议定义),除写入外还提供以下操作:

方法签名要点返回值用途
count_documents() -> intint统计文档总数
filter_documents(filters=None) -> 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_term=None, from_=0, size=10, filters=None)tuple[list[Any], int]分页获取字段唯一值及其总数

关于get_metadata_field_unique_values有一个容易踩坑的细节(API 参考中特别注明):即使不同值在 Python 中比较相等,只要类型不同就会被分别返回——例如整数1、浮点数1.0、布尔值True和字符串"1"会被当作四个独立的值。此外search_term是大小写不敏感的子串搜索,from_size用于分页控制。

过滤与删除的元数据过滤语法

delete_by_filterupdate_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_VECTOR(HNSW)索引,将查询向量与文档向量做相似度比对,返回最相似的文档列表。

初始化与运行签名

构造签名(摘自 API 参考):

__init__( *, document_store: ArcadeDBDocumentStore, filters: dict[str, Any] | None = None, top_k: int = 10, filter_policy: FilterPolicy = FilterPolicy.REPLACE ) -> None

run方法签名:

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(database="mydb") retriever = ArcadeDBEmbeddingRetriever(document_store=store, top_k=5) # 写入文档 documents = [ Document(text="My name is Carla and I live in Berlin"), Document(text="My name is Paul and I live in New York"), Document(text="My name is Silvano and I live in Matera"), Document(text="My 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(query=query_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( url="http://localhost:2480", database="haystack", embedding_dimension=768, recreate_type=True, ) documents = [ Document(content="There are over 7,000 languages spoken around the world today."), Document(content="Elephants have been observed to recognize themselves in mirrors."), Document(content="Bioluminescent 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"], policy=DuplicatePolicy.OVERWRITE, ) # 查询侧:Text Embedder -> ArcadeDBEmbeddingRetriever query_pipeline = Pipeline() query_pipeline.add_component("text_embedder", SentenceTransformersTextEmbedder()) query_pipeline.add_component( "retriever", ArcadeDBEmbeddingRetriever(document_store=document_store, top_k=3), ) 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.py:NONE(不做去重处理)、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 连接等同步资源,适合在长生命周期应用中做资源清理。

常见问题与使用建议

  1. 嵌入维度必须一致embedding_dimension(默认 768)必须与所选 Embedder 的输出维度匹配,否则 HNSW 索引无法正确检索;维度不匹配的文档会被零填充存储,只可过滤、不可有效检索。
  2. 距离度量选择similarity_function支持cosine(默认)、euclideandot三种,需与 Embedder 的训练目标/使用习惯保持一致,例如 Sentence Transformers 通常搭配 cosine。
  3. 开发期使用recreate_type=True:需要反复修改 schema 或清空重建时开启,生产环境务必关闭。
  4. 凭据安全:优先使用环境变量ARCADEDB_USERNAME/ARCADEDB_PASSWORD,避免在代码或 YAML 中明文写入密码。
  5. 定位认知:根据 文档存储选型指南,ArcadeDB 作为多模型数据库支持 embedding 检索,适合需要向量搜索与图/文档模型能力结合的场景;纯向量检索场景也可按需选择其他专用向量存储。

参考资源

  • API 参考:integrations-api/arcadedb.md(本文核心依据)
  • DocumentStore 用户指南:arcadedbdocumentstore.mdx
  • Retriever 用户指南: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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询