如何让大模型自动思考问题自动调用工具反思迭代几次输出结果?
比如我要搜集最新的1500-2000范围的手机的品牌和参数等数据,并形成一个可视化的报告,工具有代码运行器、搜索api、pdf生成等工具,然后让大模型思考一步一步解决问题,最终给出一个pdf报告。
网友回复
设计一个通用的Python框架,使大模型API能够自动思考问题、调用工具、反思迭代,并最终输出满足用户需求的结果。
框架设计思路
这个框架需要实现以下核心功能:
问题分析:理解用户输入的问题步骤规划:将问题分解为可执行的步骤工具调用:根据需要调用适当的工具反思评估:评估当前进展是否满足用户需求迭代优化:如果不满足需求,继续思考下一步
框架实现代码
下面是一个完整的Python框架实现:
import os import json import time import requests from typing import Dict, List, Any, Optional, Union, Callable class Tool: """工具基类,所有工具都应继承此类""" def __init__(self, name: str, description: str): self.name = name self.description = description def execute(self, **kwargs) -> Dict[str, Any]: """执行工具功能,需要在子类中实现""" raise NotImplementedError("Tool子类必须实现execute方法") def to_dict(self) -> Dict[str, Any]: """返回工具的描述信息,用于API调用""" return { "name": self.name, "description": self.description } class SearchTool(Tool): """搜索工具,用于获取互联网信息""" def __init__(self, api_key: str = None): super().__init__( name="search", description="搜索互联网获取信息,参数:query (搜索查询字符串)" ) self.api_key = api_key def execute(self, query: str) -> Dict[str, Any]: """执行搜索操作""" print(f"正在搜索: {query}") # 这里应该是实际的搜索API调用 # 为了演示,返回模拟数据 return { "status": "success", "results": [ { "title": f"搜索结果 - {query}", "content": f"这是关于 {query} 的搜索结果示例。在实际应用中,这里应该返回真实的搜索结果。" } ] } class CodeRunnerTool(Tool): """代码运行工具,用于执行Python代码""" def __init__(self): super().__init__( name="run_code", description="运行Python代码,参数:code (要执行的Python代码字符串)" ) def execute(self, code: str) -> Dict[str, Any]: """执行Python代码""" print("正在运行代码...") try: # 创建一个安全的本地环境来执行代码 local_vars = {} # 注意:在实际应用中,应该使用更安全的沙箱环境 exec(code, {}, local_vars) return { "status": "success", "result": str(local_vars.get('result', '代码执行成功,但没有返回值')) } except Exception as e: return { "status": "error", "error": str(e) } class PDFGeneratorTool(Tool): """PDF生成工具,用于创建PDF报告""" def __init__(self, output_dir: str = "output"): super().__init__( name="generate_pdf", description="生成PDF报告,参数:content (报告内容), title (报告标题), charts (可选,图表文件路径列表)" ) self.output_dir = output_dir if not os.path.exists(output_dir): os.makedirs(output_dir) def execute(self, content: str, title: str = "自动生成报告", charts: List[str] = None) -> Dict[str, Any]: """生成PDF报告""" print("正在生成PDF报告...") # 这里应该是实际的PDF生成代码 # 为了演示,只返回成功信息 filename = f"report_{int(time.time())}.pdf" filepath = os.path.join(self.output_dir, filename) # 模拟PDF生成 with open(filepath, 'w') as f: f.write(f"标题: {title}\n\n") f.write(content) if charts: f.write("\n\n图表列表:\n") for chart in charts: f.write(f"- {chart}\n") return { "status": "success", "filename": filename, "filepath": filepath } class AutoAgent: """自动代理类,负责协调大模型API和工具调用""" def __init__(self, api_key: str, model: str = "gpt-4", max_iterations: int = 10): self.api_key = api_key self.model = model self.max_iterations = max_iterations self.conversation_history = [] self.tools = {} self.tool_descriptions = [] def register_tool(self, tool: Tool) -> None: """注册工具""" self.tools[tool.name] = tool self.tool_descriptions.append(tool.to_dict()) def add_message(self, role: str, content: Union[str, Dict[str, Any]]) -> None: """添加消息到对话历史""" self.conversation_history.append({"role": role, "content": content}) def call_llm_api(self, messages: List[Dict[str, Any]], functions: List[Dict[str, Any]] = None) -> Dict[str, Any]: """调用大模型API""" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {self.api_key}" } payload = { "model": self.model, "messages": messages, "temperature": 0.7 } if functions: payload["functions"] = functions payload["function_call"] = "auto" try: response = requests.post( "https://api.openai.com/v1/chat/completions", headers=headers, json=payload ) return response.json() except Exception as e: print(f"API调用错误: {e}") return None def execute_tool(self, tool_name: str, params: Dict[str, Any]) -> Dict[str, Any]: """执行指定的工具""" if tool_name in self.tools: return self.tools[tool_name].execute(**params) else: return {"status": "error", "error": f"未知工具: {tool_name}"} def solve_problem(self, problem: str) -> Dict[str, Any]: """解决问题的主要流程""" print(f"开始解决问题: {problem}") # 初始化对话 self.conversation_history = [] # 设置系统提示 self.add_message("system", """ 你是一个自动解决问题的AI助手。你需要: 1. 分析问题并制定解...
点击查看剩余70%
腾讯混元模型广场里都是混元模型的垂直小模型,如何api调用?
为啥所有的照片分辨率提升工具都会修改照片上的图案细节?
js如何在浏览器中将webm视频的声音分离为单独音频?
微信小程序如何播放第三方域名url的mp4视频?
ai多模态大模型能实时识别视频中的手语为文字吗?
如何远程调试别人的chrome浏览器获取调试信息?
为啥js打开新网页window.open设置窗口宽高无效?
浏览器中js的navigator.mediaDevices.getDisplayMedia屏幕录像无法录制SpeechSynthesisUtterance产生的说话声音?
js中mediaRecorder如何录制window.speechSynthesis声音音频并下载?
python如何直接获取抖音短视频的音频文件url?