当前位置: 首页 > news >正文

agent tool 代码修复

1. 原始代码

https://github.com/datawhalechina/hello-agents/blob/main/docs/chapter4/%E7%AC%AC%E5%9B%9B%E7%AB%A0%20%E6%99%BA%E8%83%BD%E4%BD%93%E7%BB%8F%E5%85%B8%E8%8C%83%E5%BC%8F%E6%9E%84%E5%BB%BA.md

2. 代码修改

查看接口函数:

import serpapi print(dir(serpapi))

['APIKeyNotProvided', 'Client', 'HTTPClient', 'HTTPConnectionError', 'HTTPError', 'SearchIDNotProvided', 'SerpApiError', 'SerpResults', 'TimeoutError', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', 'account', 'core', 'exceptions', 'http', 'locations', 'models', 'requests', 'search', 'search_archive', 'textui']

修改1:

from serpapi import SerpApiClient

改为:

from serpapi import search

整个代码修改后:

from dotenv import load_dotenv # 加载 .env 文件中的环境变量 load_dotenv() import os from serpapi import search from typing import Dict, Any def web_search(query: str) -> str: """ 一个基于SerpApi的实战网页搜索引擎工具。 它会智能地解析搜索结果,优先返回直接答案或知识图谱信息。 """ print(f"🔍 正在执行 [SerpApi] 网页搜索: {query}") try: api_key = os.getenv("SERPAPI_API_KEY") if not api_key: return "错误:SERPAPI_API_KEY 未在 .env 文件中配置。" params = { "engine": "google", "q": query, "api_key": api_key, "gl": "cn", # 国家代码 "hl": "zh-cn", # 语言代码 } results = search(params) # results = client.get_dict() # print("result:",results[:500]) # 只打印前 500 字符 # 智能解析:优先寻找最直接的答案 if "answer_box_list" in results: return "\n".join(results["answer_box_list"]) if "answer_box" in results and "answer" in results["answer_box"]: return results["answer_box"]["answer"] if "knowledge_graph" in results and "description" in results["knowledge_graph"]: return results["knowledge_graph"]["description"] if "organic_results" in results and results["organic_results"]: # 如果没有直接答案,则返回前三个有机结果的摘要 snippets = [ f"[{i+1}] {res.get('title', '')}\n{res.get('snippet', '')}" for i, res in enumerate(results["organic_results"][:3]) ] return "\n\n".join(snippets) return f"对不起,没有找到关于 '{query}' 的信息。" except Exception as e: return f"搜索时发生错误: {e}" from typing import Dict, Any class ToolExecutor: """ 一个工具执行器,负责管理和执行工具。 """ def __init__(self): self.tools: Dict[str, Dict[str, Any]] = {} def registerTool(self, name: str, description: str, func: callable): """ 向工具箱中注册一个新工具。 """ if name in self.tools: print(f"警告:工具 '{name}' 已存在,将被覆盖。") self.tools[name] = {"description": description, "func": func} print(f"工具 '{name}' 已注册。") def getTool(self, name: str) -> callable: """ 根据名称获取一个工具的执行函数。 """ return self.tools.get(name, {}).get("func") def getAvailableTools(self) -> str: """ 获取所有可用工具的格式化描述字符串。 """ return "\n".join([ f"- {name}: {info['description']}" for name, info in self.tools.items() ]) # --- 工具初始化与使用示例 --- if __name__ == '__main__': # 1. 初始化工具执行器 toolExecutor = ToolExecutor() # 2. 注册我们的实战搜索工具 search_description = "一个网页搜索引擎。当你需要回答关于时事、事实以及在你的知识库中找不到的信息时,应使用此工具。" toolExecutor.registerTool("Search", search_description, web_search) # 3. 打印可用的工具 print("\n--- 可用的工具 ---") print(toolExecutor.getAvailableTools()) # 4. 智能体的Action调用,这次我们问一个实时性的问题 print("\n--- 执行 Action: Search['英伟达最新的GPU型号是什么'] ---") tool_name = "Search" tool_input = "英伟达最新的GPU型号是什么" tool_function = toolExecutor.getTool(tool_name) if tool_function: observation = tool_function(tool_input) print("--- 观察 (Observation) ---") print(observation) else: print(f"错误:未找到名为 '{tool_name}' 的工具。")

测试日志:

工具 'Search' 已注册。 --- 可用的工具 --- - Search: 一个网页搜索引擎。当你需要回答关于时事、事实以及在你的知识库中找不到的信息时,应使用此工具。 --- 执行 Action: Search['英伟达最新的GPU型号是什么'] --- 🔍 正在执行 [SerpApi] 网页搜索: 英伟达最新的GPU型号是什么 --- 观察 (Observation) --- [1] 比较GeForce 系列最新一代显卡和前代显卡| NVIDIA 比较最新一代RTX 30 系列显卡和前代的RTX 20 系列、GTX 10 和900 系列显卡。查看规格、功能、技术支持等内容。 [2] GeForce RTX 50 系列显卡 GeForce RTX™ 50 系列GPU 搭载NVIDIA Blackwell 架构,为游戏玩家和创作者带来全新玩法。RTX 50 系列具备强大的AI 算力,带来升级体验和更逼真的画面。 [3] NVIDIA H200 GPU NVIDIA H200 採用NVIDIA Hopper 架構,是第一款能以每秒4.8 TB 的速度提供141 GB HBM3e 記憶體的GPU,容量幾乎是NVIDIA H100 GPU 的兩倍,記憶體頻寬則提升1.4 倍。H200 更大 ...

3. 测试代码

from serpapi import search import os from dotenv import load_dotenv load_dotenv() def perform_search(query: str) -> dict: result = search({ "engine": "google", "q": query, "api_key": os.getenv("SERPAPI_API_KEY") }) return result # 使用示例 results = perform_search("Python type hints") # 只打印前几个搜索结果,避免输出过大 for idx, item in enumerate(results.get("organic_results", [])): if idx >= 5: break print(f"标题: {item.get('title')}") print(f"链接: {item.get('link')}") print("-" * 60)

日志:

标题: typing — Support for type hints 链接: https://docs.python.org/3/library/typing.html ------------------------------------------------------------ 标题: Why Type Hinting Sucks! : r/Python 链接: https://www.reddit.com/r/Python/comments/10zdidm/why_type_hinting_sucks/ ------------------------------------------------------------ 标题: Type Hints in Python 链接: https://www.geeksforgeeks.org/python/type-hints-in-python/ ------------------------------------------------------------ 标题: Python Types Intro 链接: https://fastapi.tiangolo.com/python-types/ ------------------------------------------------------------ 标题: Python Tutorial: Type Hints - From Basic Annotations to ... 链接: https://www.youtube.com/watch?v=RwH2UzC2rIo
http://www.jsqmd.com/news/896966/

相关文章:

  • 使用Python和OpenAI官方SDK快速接入Taotoken全模型
  • 淄博各区黄金回收门店全覆盖实测:张店淄川博山周村临淄桓台,六家正规店一文讲透 - 润富黄金珠宝行
  • webMAN MOD完整指南:PS3游戏加载与系统管理的终极解决方案
  • 从芯片逆向到驱动适配:水星MW150US在macOS上的重生之路
  • 2026年5月揭阳卖金,90%的人都踩过这6个坑|附6家靠谱门店实测排名 - 润富黄金珠宝行
  • 脉冲神经网络:从生物启感到边缘计算的工程实践
  • 2026 年杭州地区浪琴腕表表盘抛光服务价格标准及工艺规范公示(实地核验版) - 亨得利官方维修中心
  • 解锁PS3全部潜能:webMAN MOD多功能插件完整指南
  • ssm基于web的网络在线考试系统(10119)
  • Unity Recorder避坑指南:从安装到输出MP4,解决‘无法录制’和‘平台切换’的常见问题
  • libhv实战:构建一个高效UDP客户端通信模型
  • 荆州市全域黄金回收避坑长文——2026年5月高位金价下六大机构横向对比与变现指南 - 润富黄金珠宝行
  • 系统提示(System Prompt)的设计最佳实践是什么?
  • 靠谱的护栏悬挂花箱销售厂家 - GrowthUME
  • 3步解锁:用tchMaterial-parser将在线电子课本变为永久本地资源
  • 邯郸市2026年5月黄金回收避坑指南:高位金价下如何守住自己的钱袋子? - 润富黄金珠宝行
  • 基于故障可诊断性定量评估与多目标优化的传感器配置方法
  • AD9268 SPI配置实战:从寄存器映射到时序解析
  • 突破传统农业监控瓶颈:ESP32边缘计算实战指南
  • 基于FPGA的滑模观测器PMSM无传感器控制:原理、实现与工程实践
  • 2026年5月济南黄金回收市场解析 附正规变现渠道汇总 - 润富黄金珠宝行
  • 国家中小学智慧教育平台电子课本下载工具:一键获取官方教材PDF的终极指南
  • 济南全城黄金回收渠道梳理 2026年5月实时金价与变现须知 - 润富黄金珠宝行
  • 如何轻松探索本地大语言模型的无限可能:llama-cpp-python实践指南
  • 江门市黄金回收科普:2026年5月25日高位金价下,你的黄金该怎么卖? - 润富黄金珠宝行
  • 工业物联网通信架构选型:基于模型的MQTT、OPC UA与HTTP量化评估方法
  • Spring源码 第六篇:Spring 5 源码深度拆解:SpringMVC 全流程核心原理
  • 2026年10款论文降AIGC工具横评:从90%降至10%的硬核之选 - 降AI小能手
  • 为什么LiteIDE是Go开发者的终极效率工具?完整指南揭秘
  • Unity游戏里做个动态时钟UI?用C#的DateTime.Now和ToString(),5分钟搞定!