如何为LangChain的SQL Agent扩展SQLDatabaseToolkit自定义工具?
为SQL Agent添加自定义工具的正确实现步骤
确保自定义工具符合LangChain标准
自定义工具必须遵循LangChain的BaseTool规范,不能直接传入普通函数。推荐两种实现方式:from langchain.tools import BaseTool, tool # 方式1:使用@tool装饰器快速定义 @tool def custom_sql_preprocessor(query: str) -> str: """对SQL查询语句进行预处理,比如替换特殊占位符、校验语法""" # 这里编写你的工具逻辑 processed_query = query.replace("{{USER_INPUT}}", "valid_value") return processed_query # 方式2:继承BaseTool类实现更复杂的工具 class CustomDataAnalyzer(BaseTool): name = "custom_data_analyzer" description = "用于分析SQL查询返回的结果,生成统计摘要或可视化描述" def _run(self, result_data: str) -> str: # 核心执行逻辑 return f"数据统计摘要:共{len(result_data.split())}条记录" async def _arun(self, result_data: str) -> str: # 异步执行逻辑(可选,若不需要可省略) return self._run(result_data) # 组装工具列表 custom_tool_list = [custom_sql_preprocessor, CustomDataAnalyzer()]校验agent_type与参数的兼容性
你使用的AgentType.OPENAI_FUNCTIONS要求工具适配OpenAI函数调用规范:- 工具的
name必须是英文小写,不含特殊字符 description要清晰说明工具的用途和适用场景,帮助LLM判断何时调用- 函数参数的注释要明确,LangChain会自动生成符合JSON Schema的参数定义
- 工具的
优化suffix引导Agent使用工具
自定义suffix需要明确告知Agent可以调用额外工具,示例:custom_suffix = """ 当遇到需要预处理SQL语句或分析查询结果的需求时,你可以调用提供的custom_sql_preprocessor或custom_data_analyzer工具。 最终回答用户的问题前,确保已完成必要的工具调用。 """验证工具加载状态
创建Agent后,打印工具列表确认自定义工具是否被正确加载:print([tool.name for tool in agent.tools])如果自定义工具未出现在列表中,检查工具定义是否符合
BaseTool规范。通过日志排查调用问题
开启verbose=True后,观察控制台输出:- 若Agent未调用自定义工具,说明工具的
description不够精准,或prompt未明确引导,需优化描述或调整prompt内容 - 若调用工具时报错,检查工具的输入参数是否与Agent传递的参数匹配
- 若Agent未调用自定义工具,说明工具的
内容的提问来源于stack exchange,提问作者lauther27
相关产品推荐
相关产品推荐

