67-Agent工具定义与调用-搜索引擎-数据库-代码执行器集成

发布时间:2026/7/18 2:14:53
67-Agent工具定义与调用-搜索引擎-数据库-代码执行器集成 文章目录【67.PythonAI】Agent工具定义与调用搜索引擎、数据库、代码执行器集成实战导入语1 ~ 工具的定义规范1.1 一个标准 Tool 的结构1.2 工具描述的黄金法则2 ~ 工具一搜索引擎集成2.1 使用 Tavily Search API2.2 免费替代方案3 ~ 工具二数据库查询3.1 让 Agent 安全地查数据库3.2 带着表结构描述的 Tool4 ~ 工具三Python 代码执行器4.1 为什么要让 Agent 执行代码4.2 沙箱式代码执行5 ~ 三合一 Agent 实战5.1 架构5.2 完整代码5.3 执行过程思考 总结结尾【67.PythonAI】Agent工具定义与调用搜索引擎、数据库、代码执行器集成实战文章简介本文聚焦Agent开发中最关键的环节——工具Tool的定义与集成。文章从一个好的工具描述长什么样开始拆解Tool的四大要素名称、描述、参数schema、执行函数然后逐一讲解三种最常用工具的集成方式搜索引擎Tavily API、数据库查询SQLite 安全检查、Python代码执行器沙箱模式。最后给出一个三合一Agent的完整代码——能上网搜索、能查数据库、能写代码计算配上Mermaid架构图展示工具调度流程。适合正在写ReAct Agent、需要给Agent扩充能力的开发者。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语Agent 的智能从哪里来一半来自 LLM 的推理能力另一半来自它能调用的工具的广度——能搜到多少信息、能操作多少系统、能执行多少命令。一个只有搜索工具的Agent就是个加了联网功能的ChatGPT。但如果你的Agent能搜网页、能查数据库、能执行Python代码——它突然就有了手和脚能干真正的活了。这篇文章就聚焦这个关键环节怎么定义工具才能被LLM准确调用、三种最常用工具怎么集成、以及它们组合起来能解决什么问题。看完全文你会得到一个可复用的三合一工具集直接嵌入你的ReAct Agent。1 ~ 工具的定义规范1.1 一个标准 Tool 的结构frompydanticimportBaseModel,FieldclassTool:标准工具定义def__init__(self,name:str,description:str,func,args_schemaNone):self.namename self.descriptiondescription self.funcfunc self.args_schemaargs_schemadefexecute(self,**kwargs):returnself.func(**kwargs)1.2 工具描述的黄金法则法则好的描述坏的描述说清楚做什么“输入公司名称返回该公司最新股价”“查股票”说清楚输入格式“参数 keyword: 搜索关键词多个词用空格分隔”“搜索”说清楚输出格式“返回JSON{price, change, volume}”无描述写典型使用场景“当你需要获取实时信息时使用此工具”无# ✅ 好LLM能准确理解什么时候该用、怎么用search_toolTool(nameweb_search,description在互联网上搜索实时信息。当你需要最新资讯、事实核查时使用。参数 query: 搜索关键词尽量精简。返回前5条结果的标题和摘要。,funcweb_search,)# ❌ 差LLM不知道什么时候该调用bad_toolTool(names,descriptionsearch,funcweb_search,)2 ~ 工具一搜索引擎集成2.1 使用 Tavily Search APITavily 是为 AI Agent 设计的搜索引擎 API返回结构化的搜索结果importrequestsdefweb_search(query:str)-str:调用Tavily搜索APIapi_keyyour-tavily-api-keyresponserequests.post(https://api.tavily.com/search,json{api_key:api_key,query:query,search_depth:basic,max_results:5,})dataresponse.json()# 格式化搜索结果results[]forrindata.get(results,[]):results.append(f标题:{r[title]}\n内容:{r[content]}\n链接:{r[url]})return\n\n---\n\n.join(results)search_toolTool(nameweb_search,description搜索互联网获取实时信息。参数 query: 搜索关键词。,funcweb_search,)2.2 免费替代方案如果不想用付费API可以考虑 DuckDuckGo 的免费搜索# 使用 duckduckgo_search 库fromduckduckgo_searchimportDDGSdeffree_search(query:str)-str:withDDGS()asddgs:resultslist(ddgs.text(query,max_results5))return\n.join(f{r[title]}:{r[body]}forrinresults)3 ~ 工具二数据库查询3.1 让 Agent 安全地查数据库直接让LLM写SQL很危险——一条DROP TABLE就灾难了。需要用读写分离 SQL白名单做安全控制importsqlite3classSafeDatabase:安全的数据库工具——只读查询 SQL白名单ALLOWED_KEYWORDS{SELECT,FROM,WHERE,JOIN,GROUP,ORDER,LIMIT,COUNT,AVG,SUM,MAX,MIN}def__init__(self,db_path:str):self.db_pathdb_pathdefquery(self,sql:str)-str:# 安全检查sql_uppersql.strip().upper()# 只允许 SELECT 语句ifnotsql_upper.startswith(SELECT):return错误只允许 SELECT 查询# 检查危险关键词dangerous{DROP,DELETE,UPDATE,INSERT,ALTER,CREATE}ifany(kwinsql_upperforkwindangerous):return错误不允许修改数据的操作# 执行查询try:connsqlite3.connect(self.db_path)cursorconn.cursor()cursor.execute(sql)columns[desc[0]fordescincursor.description]rowscursor.fetchall()conn.close()# 格式化输出result | .join(columns)\n-*40\nforrowinrows[:20]:# 最多返回20行result | .join(str(v)forvinrow)\nreturnresultifrowselse查询无结果exceptExceptionase:returnf查询错误:{e}db_toolTool(namedatabase_query,description查询SQLite数据库。参数 sql: 合法的SELECT语句。表结构: users(id, name, department, salary), orders(id, user_id, amount, date),funcSafeDatabase(company.db).query,)3.2 带着表结构描述的 ToolLLM 需要知道表结构才能写出正确的 SQL。所以在 Tool 描述中要写明表名和字段DATABASE_SCHEMA 数据库包含以下表 - employees: id, name, department, salary, hire_date - departments: id, name, manager_id - projects: id, name, budget, status 4 ~ 工具三Python 代码执行器4.1 为什么要让 Agent 执行代码有些任务LLM推理做不了——比如这组数据的标准差是多少、“把这个JSON排序”。让Agent直接写代码执行比让它算准确得多。4.2 沙箱式代码执行importsysfromioimportStringIOdefexecute_python(code:str)-str:在受限环境中执行Python代码捕获输出# 禁止危险操作forbidden[os.,subprocess,shutil,__import__,open(,eval(,exec(]forwordinforbidden:ifwordincode:returnf安全限制代码中不允许使用 {word}# 重定向stdoutold_stdoutsys.stdout sys.stdoutcapturedStringIO()try:exec(code,{__builtins__:{print:print,len:len,range:range,int:int,float:float,str:str,list:list,dict:dict,sum:sum,max:max,min:min,sorted:sorted,abs:abs,round:round,zip:zip,}})outputcaptured.getvalue()returnoutputifoutputelse代码执行成功无输出exceptExceptionase:returnf执行错误:{type(e).__name__}:{e}finally:sys.stdoutold_stdout code_toolTool(namepython_executor,description执行Python代码进行数学计算或数据处理。参数 code: Python代码字符串。可用函数: print, len, range, int, float, str, list, dict, sum, max, min, sorted, abs, round, zip,funcexecute_python,)5 ~ 三合一 Agent 实战5.1 架构实时信息数据查询计算分析用户提问ReAct Agent需要什么类型的操作?web_searchTavily APIdatabase_querySQLitepython_executor沙箱执行生成最终回答5.2 完整代码tools{web_search:web_search,database_query:SafeDatabase(company.db).query,python_executor:execute_python,}# 提供给LLM的工具描述TOOLS_DESC - web_search[关键词]: 搜索互联网获取实时信息 - database_query[SQL]: 查询公司数据库只读SELECT - python_executor[代码]: 执行Python代码进行数学计算 数据库表: employees(id, name, dept, salary) agentReActAgent(llmChatOpenAI(modelgpt-4),toolstools,tools_promptTOOLS_DESC,max_steps10)# 复杂任务需要三个工具协同resultagent.run(查一下技术部的平均薪资然后搜索行业平均水平最后算算我们的薪资比行业高了多少百分比)5.3 执行过程Step1: Thought: 先查技术部平均薪资 → database_query[SELECT AVG(salary)FROM employees WHEREdept技术部]→ Observation:15000Step2: Thought: 搜索行业平均薪资 → web_search[Python开发工程师 平均薪资2024]→ Observation: 全国平均约12000元 Step3: Thought: 计算差距百分比 → python_executor[(15000-12000)/12000*100]→ Observation:25.0Final Answer: 技术部的平均薪资为15000元比行业平均水平12000元高出25%思考 总结工具描述是 Agent 准确调用的第一道关口花时间把每个Tool的description写清楚——做什么、输入什么、返回什么、什么时候该用它。这比代码实现更重要。搜索引擎让 Agent 突破了知识截止日的限制不用微调、不用RAG一个搜索API就能让Agent拥有实时信息获取能力。数据库查询必须加安全层你绝对不会想让LLM直接执行它生成的SQL。读写分离 关键词白名单 行数限制三保险。代码执行器需要沙箱限制可用的builtins函数、禁止文件操作和系统调用、超时控制——否则你的服务器就是一颗定时炸弹。工具的组合是 Agent 价值的放大器单个工具能解决的问题有限三个工具组合起来就能处理搜索→分析→计算的完整数据链路。工具多了Agent才真正有了手和脚。下次别人问你Agent能做什么的时候把这三个工具的运行记录给他看——比说一百句都管用。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏把核心知识点存好在需要时随时查、随时用评论分享你的经验或疑问评论区一起交流避坑一键四连不要忘记给博主一键四连哦️寄语技术之路难免有困惑但同行的人会让前进更有方向结语给Agent装工具就像给程序员配开发环境——工具越全能做的事情就越多。本文的三个工具是你Agent工具箱的起点之后你可以继续加邮件发送、文件操作、API调用……Agent的能力边界只受限于你的想象力。不要忘记给博主一键四连哦