十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Haystack MariaDB 集成实战:MariaDBDocumentStore 与双模式 Retriever 的向量检索、全文检索和元数据过滤

Haystack MariaDB 集成实战:MariaDBDocumentStore 与双模式 Retriever 的向量检索、全文检索和元数据过滤 Haystack MariaDB 集成实战MariaDBDocumentStore 与双模式 Retriever 的向量检索、全文检索和元数据过滤【免费下载链接】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 2.21 的 MariaDB 集成 API 参考系统讲解MariaDBDocumentStore、MariaDBEmbeddingRetriever与MariaDBKeywordRetriever三个核心类的初始化参数、运行接口与底层检索机制并结合仓库内核心类型FilterPolicy、DuplicatePolicy的源码帮你把 MariaDB 11.7 的原生 VECTOR 能力落地到 RAG 与语义搜索管线中。集成定位与环境要求MariaDB 集成的 API 参考定义在 mariadb.md它描述了三个类类模块路径职责MariaDBDocumentStorehaystack_integrations.document_stores.mariadb.document_store基于 MariaDB 11.7 原生 VECTOR 支持的文档存储MariaDBEmbeddingRetrieverhaystack_integrations.components.retrievers.mariadb.embedding_retriever基于向量相似度的近似最近邻检索MariaDBKeywordRetrieverhaystack_integrations.components.retrievers.mariadb.keyword_retriever基于MATCH ... AGAINST的全文关键词检索需要强调的环境前提MariaDB 版本要求 11.7这是集成依赖原生VECTOR数据类型、MHNSW索引以及VEC_DISTANCE_COSINE/VEC_DISTANCE_EUCLIDEAN距离函数的最低版本集成包独立于核心库导入路径为haystack_integrations.*安装方式为pip install mariadb-haystack。该包以 C 扩展形式构建依赖 MariaDB Connector/C 系统库因此还需要sudo apt-get install -y libmariadb-devUbuntu/Debian或brew install mariadb-connector-cmacOS凭据通过环境变量注入user与password参数默认从MARIADB_USER、MARIADB_PASSWORD两个环境变量读取Secret类型不要把账号密码硬编码进代码。快速搭建一个 MariaDB 11.7 实例取自 mariadbdocumentstore.mdxdocker run -d -p 3306:3306 \ -e MARIADB_ROOT_PASSWORDsecret \ -e MARIADB_DATABASEhaystack \ -e MARIADB_USERhaystack \ -e MARIADB_PASSWORDsecret \ mariadb:11.7export MARIADB_USERhaystack export MARIADB_PASSWORDsecretMariaDBDocumentStore初始化参数逐项解析MariaDBDocumentStore的构造函数为全关键字参数*之后签名如下__init__( *, host: str 127.0.0.1, port: int 3306, database: str haystack, user: Secret Secret.from_env_var(MARIADB_USER), password: Secret Secret.from_env_var(MARIADB_PASSWORD), table_name: str haystack_documents, recreate_table: bool False, embedding_dimension: int 768, distance: str cosine, create_vector_index: bool False ) - None各参数说明与工程要点参数默认值说明host/port127.0.0.1/3306MariaDB 主机与端口databasehaystack数据库名对应 Docker 中的MARIADB_DATABASEuser/password环境变量MARIADB_USER/MARIADB_PASSWORD以Secret形式从环境变量读取table_namehaystack_documents存储文档的表名只允许字母、数字和下划线recreate_tableFalse初始化时先删除再重建表会清空所有数据调试阶段慎用embedding_dimension768向量维度只在建表时生效对已存在的表无效distancecosine向量距离函数取cosine或euclidean只在建表时生效create_vector_indexFalse为True时创建 MHNSW 向量索引以加速 ANN 检索只在建表时生效且要求每篇文档都有非空 embedding否则写入会报错最后三个参数是理解这个 Document Store 行为的关键它们共同构成建表快照。从文档说明看表一旦存在后续修改embedding_dimension、distance、create_vector_index不会触发任何 DDL 变更——也就是说若换用不同维度或距离函数的 embedding 模型必须配合recreate_tableTrue重建表。官方组件文档 mariadbdocumentstore.mdx 中专门用 Note 强调了这一点并给出建表示例import os from haystack_integrations.document_stores.mariadb import MariaDBDocumentStore from haystack import Document os.environ[MARIADB_USER] haystack os.environ[MARIADB_PASSWORD] secret document_store MariaDBDocumentStore( port3306, databasehaystack, embedding_dimension768, distancecosine, ) document_store.write_documents( [ Document(contentThis is first, embedding[0.1] * 768), Document(contentThis is second, embedding[0.3] * 768), ], ) print(document_store.count_documents())文档管理方法API 参考列出了六个文档管理方法构成完整的存取生命周期write_documents(documents, policyDuplicatePolicy.NONE) - int写入文档返回写入数量。policy控制id冲突时的行为取值来自核心库的DuplicatePolicy枚举定义于 policy.pyDuplicatePolicy.NONE不重复写入默认DuplicatePolicy.SKIP已存在则跳过DuplicatePolicy.OVERWRITE覆盖旧文档DuplicatePolicy.FAIL已存在则直接失败。异常约定传入非Document对象抛ValueError默认策略下遇到同id文档抛DuplicateDocumentError其他写入失败抛DocumentStoreError。delete_documents(document_ids: list[str]) - None按id列表删除文档count_documents() - int返回存储中的文档总数filter_documents(filtersNone) - list[Document]按 Haystack 标准元数据过滤语法比较条件 AND/OR/NOT逻辑组合返回匹配文档。filters非字典时抛TypeError语法非法抛ValueErrordelete_table() - None直接删除整个文档表配合write_documents前的清理逻辑使用close() - None释放关联的同步资源连接等。MariaDBEmbeddingRetriever基于 MHNSW 的向量检索该类使用 MariaDB 原生的VEC_DISTANCE_COSINE或VEC_DISTANCE_EUCLIDEAN函数并依托 MHNSW 索引进行高效的近似最近邻检索。最小可运行示例与 mariadbembeddingretriever.mdx 一致from haystack_integrations.document_stores.mariadb import MariaDBDocumentStore from haystack_integrations.components.retrievers.mariadb import MariaDBEmbeddingRetriever store MariaDBDocumentStore(host127.0.0.1, databasehaystack, embedding_dimension768) retriever MariaDBEmbeddingRetriever(document_storestore, top_k5) result retriever.run(query_embedding[0.1] * 768) documents result[documents]初始化参数__init__( *, document_store: MariaDBDocumentStore, filters: dict[str, Any] | None None, top_k: int 10, score_threshold: float | None None, filter_policy: str | FilterPolicy FilterPolicy.REPLACE ) - Nonedocument_store必须是MariaDBDocumentStore实例否则抛ValueErrorfilters初始化时固定的默认元数据过滤条件作用于每次查询top_k单次返回文档上限默认 10score_threshold最低得分阈值低于该分数的文档被排除——适合给 RAG 管线加相关性闸门避免低相关文档污染 Promptfilter_policy决定运行时filters与初始化filters的合并方式下一节详述。run 接口run( query_embedding: list[float], filters: dict[str, Any] | None None, top_k: int | None None, score_threshold: float | None None, ) - dict[str, list[Document]]query_embedding查询向量一维浮点列表长度必须与建表时的embedding_dimension一致filters/top_k/score_threshold运行时覆盖值按filter_policy与初始化参数交互返回字典含documents键值是按相似度排序的Document列表。在 Pipeline 中的典型位置组件文档给出了三种最常见位置RAG 管线中介于 Text Embedder 与PromptBuilder之间、语义搜索管线的最后一个组件、抽取式 QA 管线中介于 Text Embedder 与抽取 Reader 之间。完整管线示例含索引侧SentenceTransformersDocumentEmbedder与查询侧SentenceTransformersTextEmbedderimport os from haystack import Document, Pipeline from haystack_integrations.components.embedders.sentence_transformers import ( SentenceTransformersTextEmbedder, SentenceTransformersDocumentEmbedder, ) from haystack.document_stores.types import DuplicatePolicy from haystack_integrations.document_stores.mariadb import MariaDBDocumentStore from haystack_integrations.components.retrievers.mariadb import MariaDBEmbeddingRetriever os.environ[MARIADB_USER] haystack os.environ[MARIADB_PASSWORD] secret document_store MariaDBDocumentStore(embedding_dimension768, distancecosine) document_embedder SentenceTransformersDocumentEmbedder() documents_with_embeddings document_embedder.run(documents) document_store.write_documents( documents_with_embeddings.get(documents), policyDuplicatePolicy.OVERWRITE ) query_pipeline Pipeline() query_pipeline.add_component(text_embedder, SentenceTransformersTextEmbedder()) query_pipeline.add_component( retriever, MariaDBEmbeddingRetriever(document_storedocument_store) ) 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])注意要让向量索引真正生效建表时需设置create_vector_indexTrue否则相似度计算退化为扫描方式且如前所述该设置要求所有文档均有非空 embedding。MariaDBKeywordRetriever基于全文索引的关键词检索MariaDBKeywordRetriever走的是另一条检索路径——使用 MariaDBMATCH ... AGAINST全文搜索的自然语言模式底层由content列上的 FULLTEXT 索引支撑。它与向量检索互补前者擅长专有名词、错误码、精确术语等语义模型容易漂掉的查询场景。from haystack_integrations.document_stores.mariadb import MariaDBDocumentStore from haystack_integrations.components.retrievers.mariadb import MariaDBKeywordRetriever store MariaDBDocumentStore(host127.0.0.1, databasehaystack, embedding_dimension768) retriever MariaDBKeywordRetriever(document_storestore, top_k5) result retriever.run(queryclimate change) documents result[documents]初始化签名比向量版少一个score_threshold参数__init__( *, document_store: MariaDBDocumentStore, filters: dict[str, Any] | None None, top_k: int 10, filter_policy: str | FilterPolicy FilterPolicy.REPLACE ) - Nonerun接口run( query: str, filters: dict[str, Any] | None None, top_k: int | None None ) - dict[str, list[Document]]query关键词查询字符串按自然语言模式匹配 FULLTEXT 索引filters/top_k语义同向量版返回documents键下按相关度排序的结果列表。在 mariadbkeywordretriever.mdx 中官方给出了完整的关键词 RAG 管线示例MariaDBKeywordRetriever直接输出文档经ChatPromptBuilder组装提示词后交给OpenAIChatGenerator再由AnswerBuilder汇总回答文档写入时使用policyDuplicatePolicy.SKIP避免重复索引。这一示例覆盖了关键词检索从写入到问答的完整链路可直接作为集成模板。filter_policy运行时过滤与初始化过滤如何合并两个 Retriever 的filter_policy参数默认值都是FilterPolicy.REPLACE。该枚举及其合并逻辑在核心库中定义于 filter_policy.py从源码结构看REPLACE运行时filters完全替换初始化时设定的filters。适合每次查询条件完全不同的场景MERGE两者合并运行时值优先。核心库的apply_filter_policy函数实现了四种合并形态的组合——比较过滤 比较过滤、比较过滤 逻辑过滤、逻辑过滤 比较过滤、逻辑过滤 逻辑过滤——其中对同名字段会保留运行时条件并告警忽略初始化条件传字符串时通过FilterPolicy.from_str解析大小写不敏感非法取值抛ValueError因此 YAML 管线中直接写filter_policy: merge即可。典型用法把仅检索内部文档这类全局约束放初始化filters如{field: meta.source, operator: , value: internal}把每次查询的动态条件放run参数并选择filter_policymerge即可在保持全局约束的同时实现按查询收窄。序列化to_dict / from_dict 与管线持久化三个类都实现了to_dict() - dict[str, Any]与from_dict(data) - 对应类这对方法to_dict() - dict[str, Any] # 序列化组件/文档存储为字典 from_dict(data: dict[str, Any]) # 从字典反序列化这是 Haystack 管线 YAML 持久化pipeline.dumps()/Pipeline.loads()与远程部署的基础document_store以带类路径引用的嵌套结构被序列化进 Retriever 字典反序列化时按类路径重建。由于凭据来自环境变量序列化产物中不会明文包含密码同一份 YAML 可在不同环境凭环境变量注入不同凭据复用。局限与注意事项集成包mariadb-haystack发布在 Haystack 核心集成仓库本仓库只包含其 API 参考与组件文档若行为与预期不符应以集成包源码与当前参考文档mariadb.md为准embedding_dimension、distance、create_vector_index是建表一次性参数变更后必须recreate_tableTrue才生效create_vector_indexTrue强制全部文档携带 embedding混合部分有向量、部分纯文本的写入策略时建议关闭该索引或保证写入前完成 embedding全文检索依赖content列的 FULLTEXT 索引只对content字段生效meta中的文本不会被关键词检索覆盖本文内容基于版本 2.21 的 API 参考仓库中同时存在 version-2.22 至 version-3.1 等更新的参考版本升级 Haystack 主版本时应核对目标版本的参数签名是否有变化。【免费下载链接】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),仅供参考
返回列表