基于 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包提供:
| 组件 | 模块路径 | 职责 |
|---|---|---|
ArcadeDBDocumentStore | haystack_integrations.document_stores.arcadedb | 文档存储与写入、删除、过滤、元数据统计,HNSW 向量索引管理 |
ArcadeDBEmbeddingRetriever | haystack_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 时显式传入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", 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_USERNAME | HTTP Basic Auth 用户名 |
password | 环境变量ARCADEDB_PASSWORD | HTTP Basic Auth 密码 |
type_name | "Document" | 存储文档的顶点(Vertex)类型名 |
embedding_dimension | 768 | HNSW 索引的向量维度,需与你的 Embedder 输出维度一致 |
similarity_function | "cosine" | 距离度量,可选"cosine"、"euclidean"、"dot" |
recreate_type | False | 若为True,初始化时删除并重建该类型(适用于反复测试) |
create_database | True | 若为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 | () -> int | int | 统计文档总数 |
filter_documents | (filters=None) -> list[Document] | list[Document] | 按 Haystack 过滤字典筛选文档 |
delete_documents | (document_ids: list[str]) -> None | None | 按 ID 删除文档 |
delete_all_documents | () -> None | None | 清空所有文档 |
delete_by_filter | (filters) -> int | int | 删除匹配过滤条件的文档并返回删除数量 |
update_by_filter | (filters, meta) -> int | int | 批量更新匹配文档的元数据并返回更新数量 |
count_documents_by_filter | (filters) -> int | int | 统计匹配过滤条件的文档数 |
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_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_VECTOR(HNSW)索引,将查询向量与文档向量做相似度比对,返回最相似的文档列表。
初始化与运行签名
构造签名(摘自 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_embedding | run(必填) | 查询文本的嵌入向量,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 连接等同步资源,适合在长生命周期应用中做资源清理。
常见问题与使用建议
- 嵌入维度必须一致:
embedding_dimension(默认 768)必须与所选 Embedder 的输出维度匹配,否则 HNSW 索引无法正确检索;维度不匹配的文档会被零填充存储,只可过滤、不可有效检索。 - 距离度量选择:
similarity_function支持cosine(默认)、euclidean、dot三种,需与 Embedder 的训练目标/使用习惯保持一致,例如 Sentence Transformers 通常搭配 cosine。 - 开发期使用
recreate_type=True:需要反复修改 schema 或清空重建时开启,生产环境务必关闭。 - 凭据安全:优先使用环境变量
ARCADEDB_USERNAME/ARCADEDB_PASSWORD,避免在代码或 YAML 中明文写入密码。 - 定位认知:根据 文档存储选型指南,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),仅供参考