ARTICLE DETAIL

资讯详情

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

使用 crewAI DB2VectorSearchTool:在 IBM DB2 中落地原生向量语义检索

使用 crewAI DB2VectorSearchTool:在 IBM DB2 中落地原生向量语义检索 使用 crewAI DB2VectorSearchTool在 IBM DB2 中落地原生向量语义检索【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI导读本文围绕 crewAI Tools 提供的DB2VectorSearchTool系统讲解如何让 CrewAI Agent 直接对IBM DB2 原生 VECTOR 数据类型执行语义检索。你将掌握该工具的安装配置、连接串与环境变量设定、OpenAI/自定义嵌入函数的选用、元数据过滤、距离度量选择与 JSON 结果解析并通过源码级拆解理解其背后的 SQL 构造、SQL 注入防护与连接生命周期设计最终能把它接入自己的 Crew 工作流。该工具在仓库中以独立模块存在核心实现位于 db2_search_tool.py公开导出类为DB2VectorSearchTool可直接从crewai_tools顶层导入。一、工具定位检索专用retrieval-onlyDB2VectorSearchTool是 CrewAI 系列向量检索工具中的一员专门承担从 DB2 中读取与查询最相似文档的职责。其功能边界如下生成查询文本的嵌入向量对 DB2 中的 VECTOR 列执行向量相似度搜索使用VECTOR_DISTANCE按需应用元数据过滤返回结构化的规范化 JSON 结果。按照官方 README 的架构说明该工具与 QdrantVectorSearchTool、WeaviateVectorSearchTool 采用同一套工具架构约定。特别需要注意的是该工具只做检索不做文档入库ingestion。向量数据的写入、批量嵌入、索引维护需要由独立的入库流程完成这是使用前必须接受的前提。二、安装与依赖工具本体随crewai-tools发布DB2 相关能力依赖两个可选第三方包。官方 README 给出的安装命令是uv add ibm_db openai其中ibm_db用于建立与 DB2 的原生连接与执行 SQLopenai仅在走默认 OpenAI 嵌入路径时才需要若完全使用自定义嵌入函数可不必安装openai。从源码看这两项依赖被登记在工具的元数据中见 db2_search_tool.py#L86-L91package_dependencies: list[str] Field( default_factorylambda: [ ibm_db, openai, # Optional openai is used for embeddings ] )同时tool.specs.json约 L6034 起同样记录了package_dependencies: [ibm_db, openai]便于自动化的依赖清单生成。需要特别说明工具的“运行时动态导入runtime dynamic imports”特性ibm_db、ibm_db_dbi乃至openai都不会在模块加载时被强制导入而是在首次真正使用时才通过importlib惰性加载见 db2_search_tool.py#L160-L172 的_resolve_db2_packages与 db2_search_tool.py#L211-L220 的_get_openai_client。这带来一个直接收益即使开发机尚未安装ibm_db也可以安全地 import 并实例化该工具——只有在真正发起检索并连接 DB2 时才会报缺包错误。测试代码也充分利用了这一点测试套件在 import 阶段预先注入ibm_db/ibm_db_dbi的桩模块使全部用例无需真实 DB2 即可运行见 test_db2_search_tool.py#L19-L50。三、环境变量与连接串工具声明了两个环境变量见 db2_search_tool.py#L93-L106OPENAI_API_KEYyour_openai_key DB2_CONNECTION_STRINGDATABASETESTDB;HOSTNAMElocalhost;PORT50000;PROTOCOLTCPIP;UIDdb2user;PWDpassword;两者的角色并不相同OPENAI_API_KEY仅在采用默认 OpenAI 嵌入路径时需要。源码中若检测不到该环境变量且未提供自定义嵌入函数会直接抛出OPENAI_API_KEY environment variable is missing. Required for default embeddings.见 db2_search_tool.py#L213-L217。因此它被声明为“非必需requiredFalse”是因为存在custom_embedding_fn这一替代方案DB2_CONNECTION_STRING作为连接串的环境变量备选。实际上连接串更推荐的传参方式是构造时的connection_string字段它被声明为必填required。connection_string字段的取值格式见 db2_search_tool.py#L108-L114支持两种写法标准键值对串DATABASEmydb;HOSTNAMElocalhost;PORT50000;PROTOCOLTCPIP;UIDuser;PWDpass;其中PROTOCOLTCPIP是 TCP 连接协议PORT默认常为50000本地数据库名简写仅传数据库名如TESTDB适用于本机已配置的本地连接。四、快速上手基础检索官方 README 提供了最小可运行示例。假设 DB2 中已有一张名为documents的表其默认约定为文本列名为content向量列名为embedding类型为 DB2VECTORfrom crewai_tools import DB2VectorSearchTool tool DB2VectorSearchTool( connection_stringDATABASETESTDB;HOSTNAMElocalhost;PORT50000;PROTOCOLTCPIP;UIDdb2user;PWDpassword;, table_namedocuments, ) result tool.run( queryWhat is machine learning?, ) print(result)DB2VectorSearchTool继承自crewai.tools.BaseTool见 db2_search_tool.py#L12、db2_search_tool.py#L62-L72因此它拥有标准的name、description、args_schema可以被 Agent 当作普通工具调度。一次run的内部执行链路为校验查询文本非空空串、纯空白或None都会返回错误 JSON见 db2_search_tool.py#L269-L276为查询文本生成嵌入向量建立 DB2 连接失败时清理并返回Failed to connect to DB2: ...校验距离度量与所有表/列标识符构造VECTOR_DISTANCESQL 并参数化执行按max_distance后置过滤、组装结果、断开连接返回规范化 JSON 字符串。成功响应示例run返回的是 JSON 字符串整体结构如下{ success: true, results: [ { distance: 0.12, data: { content: machine learning is ... } } ] }每个结果条目中distance恒为数值型的距离分数data则由“返回列名 → 行值”的映射构成。五、元数据过滤当需要按业务元数据缩小检索范围时同时传入filter_by列名与filter_value过滤值result tool.run( queryAI papers, filter_bycategory, filter_valueAI, )两点使用约束来自入参 schemaDB2ToolSchema的校验器见 db2_search_tool.py#L30-L59filter_by与filter_value必须成对出现只传其一会抛出filter_by and filter_value must be provided together.filter_by不允许为空白字符串否则抛出filter_by must be a non-empty column name.。这些行为均被单元测试覆盖例如 test_db2_search_tool.py#L111-L131。底层实现上过滤会拼接为参数化WHERE子句WHERE {filter_by} ?过滤值通过绑定参数传入而非字符串拼接从源头上杜绝值注入见 db2_search_tool.py#L306-L309。测试 test_db2_search_tool.py#L447-L461 验证了过滤值确实进入了execute的参数元组test_db2_search_tool.py#L485-L494 则验证了带过滤时 SQL 中确实包含WHERE dept ?。六、全部配置字段与默认值工具暴露了比 README 更丰富的可调参数。下表汇总了这些字段、默认值与约束均可从 db2_search_tool.py#L108-L137 以及 tool.specs.json L5852-L6076 的init_params_schema交叉印证字段默认值说明与约束connection_string必填DB2 连接串格式见上文是唯一必填参数table_namedocuments目标表名支持schema.table两段式限定名vector_columnembedding存有 VECTOR 数据的列名embedding_modeltext-embedding-3-large默认 OpenAI 嵌入模型名return_columns[content]SELECT 返回的普通列清单不允许为空空列表会触发校验错误见 db2_search_tool.py#L138-L145limit3返回条数Pydantic 约束 1–100越界报错distance_metricCOSINE距离度量运行前会按大写后做白名单校验max_distanceNone最大允许距离阈值不能为负数命中结果距离超过阈值会被丢弃custom_embedding_fnNone自定义嵌入函数签名形如Callable[[str], list[float]]提供后优先使用db2_package/db2_dbi_packageNoneDB2 底层模块默认为惰性解析为ibm_db/ibm_db_dbi组合示例多返回列 距离阈值下面示例演示检索时同时返回多列、收紧返回条数并过滤掉低相关度结果tool DB2VectorSearchTool( connection_stringDATABASETESTDB;HOSTNAMElocalhost;PORT50000;PROTOCOLTCPIP;UIDdb2user;PWDpassword;, table_namepapers, vector_columnembedding, return_columns[title, abstract, year], limit5, distance_metricCOSINE, max_distance0.35, ) result tool.run( querymulti-agent reinforcement learning, filter_byyear, filter_value2024, )支持的相似度度量源码通过类变量维护了一份距离度量白名单见 db2_search_tool.py#L74-L84与 DB2VECTOR_DISTANCE内置函数能力对齐COSINE默认余弦相似度语义EUCLIDEAN欧氏距离EUCLIDEAN_SQUARED平方欧氏距离DOT点积HAMMING汉明距离MANHATTAN曼哈顿距离传入白名单之外的度量例如大写后仍不匹配的字符串会抛出Invalid distance metric: ...测试见 test_db2_search_tool.py#L371-L383。这层白名单并非仅为了提示更是一道安全闸门度量值会直接拼进 SQL 的函数名位置白名单机制杜绝了在该位置注入任意 SQL 的可能。七、嵌入策略自定义函数优先否则 OpenAI查询向量生成遵循“自定义函数优先、OpenAI 兜底”的策略实现在 db2_search_tool.py#L222-L235def _generate_embedding(self, text: str) - list[float]: if self.custom_embedding_fn: return self.custom_embedding_fn(text) result ( self._get_openai_client() .embeddings.create( input[text], modelself.embedding_model, ) .data[0] .embedding ) return list(result)自定义嵌入函数如果希望接入自有嵌入服务、本地模型或企业级向量底座可直接传入可调用对象def my_embedder(text: str) - list[float]: # 调用任意模型服务返回一维 float 列表 return [0.1, 0.2, ...] tool DB2VectorSearchTool( connection_stringDATABASETESTDB;HOSTNAMElocalhost;PORT50000;PROTOCOLTCPIP;UIDdb2user;PWDpassword;, table_namedocuments, custom_embedding_fnmy_embedder, )其字段类型为ImportString[Callable[[str], list[float]]]见 db2_search_tool.py#L150-L153即支持传函数对象也可传一个可导入路径字符串。相关行为测试见 test_db2_search_tool.py#L279-L290。OpenAI 兜底路径未提供自定义函数时工具从环境变量读取OPENAI_API_KEY用embedding_model指定的模型默认text-embedding-3-large生成查询向量。OpenAI 客户端对象会缓存复用避免每次查询都重复初始化测试 test_db2_search_tool.py#L306-L319 断言构造函数只被调用一次。一个关键的工程提示从源码可以推断出一个与入库强相关的约束SQL 中向量维度取自查询向量的实际长度vector_dimension len(query_vector)并以此维度对存储向量做VECTOR(...)转换见 db2_search_tool.py#L237-L260、db2_search_tool.py#L300-L301。因此入库阶段使用的嵌入函数/模型必须与检索阶段保持一致否则存储向量与查询向量的维度或语义空间不匹配会导致转换错误或相似度失去意义。这也是“入库与检索分离”架构下最容易踩的坑。八、底层 SQL 与执行机制_build_sqldb2_search_tool.py#L237-L260负责把各参数拼装成一条完整的向量检索语句典型形态为SELECT {return_columns...}, VECTOR_DISTANCE({vector_column}, VECTOR(CAST(? AS CLOB), {vector_dimension}, FLOAT32), {distance_metric}) AS distance FROM {table_name} [WHERE {filter_by} ?] ORDER BY distance ASC FETCH FIRST {limit} ROWS ONLY;理解这条语句的几个关键点查询向量通过占位符?绑定先转CLOB再以FLOAT32与指定维度转成VECTOR作为VECTOR_DISTANCE的比对对象distance列始终被追加在 SELECT 的最后一列这正是结果解析时row[-1]取距离的约定来源见 db2_search_tool.py#L326结果按距离升序排列即最相似者排在最前FETCH FIRST {limit} ROWS ONLY在数据库侧就限制返回条数向量字符串与过滤值都走参数绑定返回列清单来自已通过校验的return_columns。filter_by/filter_value会额外追加WHERE子句无过滤时整段省略测试见 test_db2_search_tool.py#L496-L505。max_distance阈值则在 SQL 返回后于 Python 侧做二次过滤见 db2_search_tool.py#L328-L329测试用例 test_db2_search_tool.py#L434-L445 演示了“过远文档被剔除、邻近文档保留”。九、安全设计标识符校验与注入防护工具在源码 docstring 中自称 “fortified”加固型其安全设计可以从三层机制得到印证1. 标识符白名单正则校验任何进入 SQL 的表名、向量列名、返回列名、过滤列名都会先经过_validate_identifier见 db2_search_tool.py#L193-L209的严格校验简单标识符必须以字母开头仅允许字母、数字、下划线^[A-Za-z][A-Za-z0-9_]*$table_name额外开启allow_periodTrue允许myschema.mytable形式的恰好一段点号分隔任何不匹配的名字都会抛出Security Alert: Invalid database identifier detected: ...。测试 test_db2_search_tool.py#L230-L273 用一批恶意样本; DROP TABLE documents; --、table--、col OR 11、schema..table、纯点号串等验证了该校验的有效性。2. 度量白名单如第六节所述distance_metric仅允许六个预置值见 db2_search_tool.py#L74-L84防止度量被注入为任意 SQL。3. 参数化绑定 schema 级双保险过滤值一律通过?占位符绑定杜绝值注入filter_by/filter_value的成对性与非空约束又在DB2ToolSchema层提前拦截见 db2_search_tool.py#L53-L59。两条防线共同作用的结果是即使用户在filter_by中传入col; DROP TABLE ...这类载荷也会在校验阶段被拒绝并返回错误 JSON测试见 test_db2_search_tool.py#L552-L591。十、结果序列化与错误语义类型安全的 JSON 编码DB2 返回的行可能包含Decimal、datetime、bytes等无法直接被标准json序列化的类型。工具为此内置了DB2JSONEncoder见 db2_search_tool.py#L17-L27DB2 原生类型编码策略decimal.Decimal转为floatdatetime.date/datetime.datetime转为 ISO 格式字符串isoformat()bytes替换为binary_data占位避免输出不可读二进制其他未知类型抛TypeError走失败兜底对应测试见 test_db2_search_tool.py#L200-L223含 Decimal 金额列返回场景的端到端验证test_db2_search_tool.py#L507-L516。统一的错误返回格式工具的异常处理策略是不抛裸异常、以 JSON 形式返回错误见 db2_search_tool.py#L278-L362{ success: false, error: 具体的错误信息, error_type: ValueError }连接失败时错误信息带Failed to connect to DB2前缀空白查询则返回专门的Query cannot be empty or contain only whitespace.提示。应用层在调用后应首先检查success字段再读取results。error_type字段使用异常类型名如ValueError、RuntimeError便于上层进行精确的分类处理。十一、连接生命周期一次查询一个连接工具采用了“每次检索独立建连、显式释放”的短连接生命周期策略见 db2_search_tool.py#L174-L191_connect()惰性解析db2_package/db2_dbi_package支持默认None或显式字符串如ibm_db随后建立底层连接、包装 DBI 连接并取得 cursor_run()无论成功或异常都会在退出前调用_disconnect()关闭 cursor、DBI 连接与底层连接并把三个句柄全部复位为None幂等重复调用安全对象析构函数__del__同样调用_disconnect()作为最后的兜底清理见 db2_search_tool.py#L364-L365。测试 test_db2_search_tool.py#L609-L620 证明连续两次_connect()会建立两个新连接test_db2_search_tool.py#L518-L545 则验证了成功路径与异常路径都会触发_disconnect。这种策略对 Agent 多轮调用场景是友好的不会因为 Agent 空闲而长期占用 DB2 连接数。十二、在 Crew 中接入 Agent作为标准化的 CrewAI 工具最自然的用法是把它挂到 Agent 的tools列表中让 Agent 根据任务自行决定何时检索from crewai import Agent, Crew, Process, Task from crewai_tools import DB2VectorSearchTool search_tool DB2VectorSearchTool( connection_stringDATABASETESTDB;HOSTNAMElocalhost;PORT50000;PROTOCOLTCPIP;UIDdb2user;PWDpassword;, table_namedocuments, return_columns[title, content], limit5, ) researcher Agent( role知识库研究员, goal基于 DB2 向量知识库检索信息并回答问题, backstory你擅长把用户的提问转化为精准的语义检索。, tools[search_tool], ) task Task( description检索并总结什么是机器学习, expected_output一段基于检索结果的准确总结, agentresearcher, ) crew Crew(agents[researcher], tasks[task], processProcess.sequential) crew.kickoff()DB2VectorSearchTool已通过 crewai_tools 顶层__init__.py约 L67、L255对外导出因此from crewai_tools import DB2VectorSearchTool, DB2ToolSchema是官方支持的标准导入方式验证见 test_db2_search_tool.py#L701-L707。十三、无真实数据库的测试验证该工具的质量保障依赖一套纯单元测试其设计思路见 test_db2_search_tool.py#L1-L56是在 import 工具模块之前先向sys.modules注入ibm_db/ibm_db_dbi的 MagicMock 桩模块从而在没有真实 IBM DB2 实例、甚至没安装驱动的情况下覆盖全部逻辑分支。测试矩阵覆盖了schema 校验、默认值与字段约束limit越界、max_distance为负、空return_columns、标识符注入防护、嵌入函数优先级与 OpenAI 客户端缓存、空白查询防护、连接失败、非法度量、成功路径的 JSON 结构、多返回列映射、max_distance过滤、SQL 中的度量与WHERE/FETCH FIRST断言、断开连接的生命周期等等。若你希望本地复跑验证在 lib/crewai-tools 目录下执行 pytest 针对该文件即可crewai_tools.tools.db2_search_tool为正确导入名。结语DB2VectorSearchTool将 IBM DB2 从传统的关系型数据库延伸为 CrewAI Agent 可感知的语义检索底座它封装了查询嵌入、VECTOR_DISTANCE相似度计算、元数据过滤与规范化 JSON 输出同时在标识符校验、度量白名单、参数化绑定与连接生命周期上做了工程化加固。投入使用前请再次确认两点表结构符合约定VECTOR列 返回列且入库时的嵌入模型与检索时保持一致。关于完整的构造参数与运行时入参 schema可查阅工具生成的 tool.specs.json 中DB2VectorSearchTool条目。【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表