Haystack 集成 ArangoDB:ArangoDocumentStore 与 ArangoEmbeddingRetriever 实战指南
【免费下载链接】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
ArangoDB 是一款多模型数据库,将文档、图与键值数据统一在一个引擎中。本文基于 Haystack 官方集成文档与仓库中的用户指南(ArangoDocumentStore 文档、ArangoEmbeddingRetriever 文档)以及版本化 API 参考(version-2.20 integrations-api/arangodb),系统讲解ArangoDocumentStore与ArangoEmbeddingRetriever的安装、配置、初始化参数、相似度函数、CRUD 操作与序列化机制。读完本文,你将能够在 Haystack 管道中完整落地一套基于 ArangoDB 的向量检索与 GraphRAG 工作流。
ArangoDB 集成概览
在 Haystack 生态中,ArangoDB 集成通过arangodb-haystack包提供,核心包含两个组件:
ArangoDocumentStore:基于 ArangoDB 的文档存储,文档存放在 ArangoDB 集合中,利用 AQL(ArangoDB Query Language)向量函数执行向量相似度检索;ArangoEmbeddingRetriever:基于嵌入向量的检索器,从ArangoDocumentStore中检索与查询向量最相似的文档。
由于文档及其关联关系保存在同一个数据库中,ArangoDB 特别适合将语义搜索与图遍历结合的GraphRAG 管道(见 choosing-a-document-store 中对其的收录,以及 platform-components 中对其可用性的标注)。
版本前提:向量检索功能要求ArangoDB 3.12 或更高版本,且需在启动时开启向量索引特性(--vector-index启动参数)。
环境安装与 ArangoDB 启动
使用 Docker 启动 ArangoDB 并开启向量索引
在本地开发环境中,推荐用 Docker 一键启动 ArangoDB,同时设置 root 密码并开启--vector-index标志:
docker run -d -p 8529:8529 \ -e ARANGO_ROOT_PASSWORD=test-password \ arangodb:3.12 arangod --vector-index提示:
--vector-index是向量相似度检索的前提,缺失该标志时 AQL 向量函数将不可用。
安装 Haystack 集成包
pip install arangodb-haystack若需要跟随本文的示例运行,还需安装 Sentence Transformers 嵌入器集成包:
pip install sentence-transformers-haystackArangoDocumentStore 深度解析
ArangoDocumentStore将文档持久化到 ArangoDB 集合中,并对外提供写入、计数、过滤、删除与序列化等完整能力。其 API 参考见 version-2.20 integrations-api/arangodb。
构造参数详解
__init__的全部参数如下(均以关键字形式传入):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
host | str | "http://localhost:8529" | ArangoDB 服务器地址 |
database | str | "haystack" | 使用的数据库名,不存在时自动创建 |
username | Secret | Secret.from_env_var("ARANGO_USERNAME", strict=False) | ArangoDB 用户名,默认读取环境变量,未设置时回退为root |
password | Secret | Secret.from_env_var("ARANGO_PASSWORD") | ArangoDB 密码,默认从ARANGO_PASSWORD环境变量读取 |
collection_name | str | "haystack_documents" | 存放文档的集合名 |
embedding_dimension | int | 768 | 文档嵌入向量的维度 |
recreate_collection | bool | False | 为True时,启动时删除并重建集合 |
similarity_function | Literal["cosine", "dot_product", "l2"] | "cosine" | 向量检索使用的相似度函数 |
基础初始化示例:
from haystack_integrations.document_stores.arangodb import ArangoDocumentStore from haystack.utils import Secret store = ArangoDocumentStore( host="http://localhost:8529", database="haystack", username=Secret.from_env_var("ARANGO_USERNAME", strict=False), password=Secret.from_env_var("ARANGO_PASSWORD"), collection_name="documents", embedding_dimension=768, )几个关键设计点:
- 凭据默认来自环境变量:
ARANGO_USERNAME未设置时回退到root,因此通常只需导出密码即可连接:export ARANGO_PASSWORD=test-password recreate_collection=True适合索引重建场景:它会清空集合并重新创建,避免残留旧数据干扰实验,但注意这会丢失已有文档,生产环境慎用。embedding_dimension必须与嵌入模型输出维度严格一致:例如sentence-transformers/all-MiniLM-L6-v2输出 384 维,则embedding_dimension应设为384。
三种相似度函数
similarity_function参数决定向量检索的度量方式,需在初始化时一次性配置:
"cosine"(默认):余弦相似度,适合归一化嵌入向量,是大多数语义检索场景的首选;"dot_product":点积,当嵌入向量的模长携带语义信息时更有用;"l2":欧几里得(L2)距离,度量向量在空间中的实际距离。
document_store = ArangoDocumentStore( host="http://localhost:8529", embedding_dimension=768, similarity_function="dot_product", )写入文档
write_documents是核心写入入口,签名如下:
write_documents( documents: list[Document], policy: DuplicatePolicy = DuplicatePolicy.NONE ) -> intdocuments:待写入的Document对象列表;policy:重复文档处理策略,支持OVERWRITE(覆盖)、SKIP(跳过)与FAIL(失败,默认);- 返回实际写入的文档数量;
- 当列表中混入非
Document对象时抛出ValueError;当policy为FAIL且发现重复文档时抛出DuplicateDocumentError。
写入示例:
from haystack import Document from haystack_integrations.document_stores.arangodb import ArangoDocumentStore document_store = ArangoDocumentStore( host="http://localhost:8529", database="haystack", collection_name="documents", embedding_dimension=768, recreate_collection=True, ) document_store.write_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."), ], ) print(document_store.count_documents())若要写入真实嵌入,应先用 Document Embedder(如
SentenceTransformersDocumentEmbedder)计算嵌入,并确保嵌入维度与embedding_dimension配置一致。DuplicatePolicy枚举定义于 haystack/document_stores/types。
查询、计数与删除
| 方法 | 签名 | 说明 |
|---|---|---|
count_documents | count_documents() -> int | 返回存储中的文档总数 |
filter_documents | filter_documents(filters: dict[str, Any] \| None = None) -> list[Document] | 按 Haystack 元数据过滤器返回匹配文档;filters为None时返回全部 |
delete_documents | delete_documents(document_ids: list[str]) -> None | 按文档 ID 列表删除文档 |
# 按元数据过滤 docs = document_store.filter_documents({"field": "meta.language", "operator": "==", "value": "en"}) # 按 ID 删除 document_store.delete_documents(document_ids=["doc-id-1", "doc-id-2"])ArangoEmbeddingRetriever 深度解析
ArangoEmbeddingRetriever通过 ArangoDB 的 AQL 向量函数比较查询向量与文档向量的相似度,返回最相似的文档。其最典型的管道位置是:在 RAG 管道中位于 Text Embedder 之后、PromptBuilder 之前,或作为语义搜索管道的最后一个组件。
构造参数
__init__( *, document_store: ArangoDocumentStore, top_k: int = 10, filters: dict[str, Any] | None = None ) -> Nonedocument_store(必填):关联的ArangoDocumentStore实例;top_k:单次检索返回的最大文档数,默认10;filters:可选的 Haystack 元数据过滤器,在检索时生效。
run 方法
run( query_embedding: list[float], top_k: int | None = None, filters: dict[str, Any] | None = None, ) -> dict[str, list[Document]]query_embedding(必填):查询向量(浮点数列表);top_k/filters:均为可选,用于覆盖实例级配置,实现按调用动态调整;- 返回
{"documents": [...]},其中Document列表按相似度分数排序。
检索示例:
from haystack_integrations.document_stores.arangodb import ArangoDocumentStore from haystack_integrations.components.retrievers.arangodb import ArangoEmbeddingRetriever store = ArangoDocumentStore(host="http://localhost:8529", database="haystack", username="root", collection_name="docs", embedding_dimension=768) retriever = ArangoEmbeddingRetriever(document_store=store, top_k=5) result = retriever.run(query_embedding=[0.1, 0.2, ...])端到端实践
单独使用检索器
from haystack import Document from haystack_integrations.document_stores.arangodb import ArangoDocumentStore from haystack_integrations.components.retrievers.arangodb import ( ArangoEmbeddingRetriever, ) document_store = ArangoDocumentStore( host="http://localhost:8529", embedding_dimension=3, recreate_collection=True, ) document_store.write_documents( [ Document( content="There are over 7,000 languages spoken around the world today.", embedding=[0.1, 0.2, 0.3], ), Document( content="Elephants have been observed to recognize themselves in mirrors.", embedding=[0.8, 0.1, 0.5], ), ], ) retriever = ArangoEmbeddingRetriever(document_store=document_store, top_k=1) result = retriever.run(query_embedding=[0.1, 0.2, 0.3]) print(result["documents"][0].content)在 Haystack 管道中使用
将文本嵌入器与检索器连接成一条查询管道,实现"文本 → 向量 → 检索"的完整链路:
from haystack import Document, Pipeline from haystack.document_stores.types import DuplicatePolicy from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersDocumentEmbedder, SentenceTransformersTextEmbedder, ) from haystack_integrations.document_stores.arangodb import ArangoDocumentStore from haystack_integrations.components.retrievers.arangodb import ( ArangoEmbeddingRetriever, ) document_store = ArangoDocumentStore( host="http://localhost:8529", embedding_dimension=384, recreate_collection=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 = SentenceTransformersDocumentEmbedder( model="sentence-transformers/all-MiniLM-L6-v2", ) documents_with_embeddings = document_embedder.run(documents) document_store.write_documents( documents_with_embeddings["documents"], policy=DuplicatePolicy.OVERWRITE, ) query_pipeline = Pipeline() query_pipeline.add_component( "text_embedder", SentenceTransformersTextEmbedder(model="sentence-transformers/all-MiniLM-L6-v2"), ) query_pipeline.add_component( "retriever", ArangoEmbeddingRetriever(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].content)该示例说明了两条关键实践:
- 索引侧:
SentenceTransformersDocumentEmbedder负责把纯文本文档转化为带嵌入的Document,再以DuplicatePolicy.OVERWRITE策略写入,避免重复执行时产生重复文档; - 查询侧:
SentenceTransformersTextEmbedder将用户查询转为向量,通过connect("text_embedder.embedding", "retriever.query_embedding")把嵌入送入检索器,top_k=3限制返回条数。
序列化与资源管理
两个组件均实现了 Haystack 标准的序列化协议,便于管道持久化与重建:
to_dict() -> dict[str, Any]:将组件序列化为字典。对ArangoEmbeddingRetriever而言,序列化数据包含document_store、top_k与filters;对ArangoDocumentStore而言则包含全部初始化参数(凭据以Secret形式安全序列化)。from_dict(data: dict[str, Any]):从字典反序列化,返回新的组件实例。close() -> None:释放底层 Document Store 关联的同步资源(如 HTTP 连接池),在不再使用存储时调用,避免资源泄漏。
结合 Haystack 的 YAML 管道编排能力(参见 marshal/yaml.py),to_dict/from_dict让包含 ArangoDB 组件的管道可以声明式保存与恢复。
小结与适用场景
综合来看,ArangoDB 集成在 Haystack 中的价值集中在两点:
- 多模型统一:文档、向量与图关系存于同一数据库,省去多系统同步成本;
- GraphRAG 友好:语义检索与图遍历可在同一引擎内完成,适合构建结合知识图谱的检索增强生成管道。
配置上只需记住三件事:ArangoDB 需3.12+ 并开启--vector-index;embedding_dimension要与嵌入模型输出维度一致;相似度函数在cosine、dot_product、l2三者中按场景选择。相关完整 API 说明可继续查阅仓库内的 ArangoDB 集成 API 参考、ArangoDocumentStore 用户指南 与 ArangoEmbeddingRetriever 用户指南。
【免费下载链接】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),仅供参考