微信扫码
添加专属顾问
“ Agent通过大模型的推理和规划,使得大模型真正实现类似人类的能力”
AI Agent也就是AI智能体,是通过把大模型作为“大脑”,通过利用大模型的推理和规划能力,然后调用外部工具来完成复杂任务的一种方式。
简单来说,Agent就是一种让大模型自己思考和分析问题,选择合适的工具,最终解决问题的一种方法,其背后原理就来自于ReAct。
ReAct是Reasoning And Acting的缩写,意思是LLM可以根据逻辑推理(Reson),构建完整系列行动(Act),从而达到期望目标。
LLM的灵感来源于人类和推理之间的协同关系,人类根据这种协同关系学习新的知识,做出决策,然后执行。
什么是ReAct框架? https://developer.aliyun.com/article/1241363
从本质上来说,智能体的作用就是模仿人类的思维和处理复杂问题的方式。
基于LLM 和 Function Call实现Agent
ReAct的作用就是协同LLM和外部的信息获取,与其它功能交互,如果说LLM模型是大脑,那么ReAct框架就是这个大脑的手脚和五官。
下面我们就用代码来实现一个简单的具有自主规划功能的Agent,需要的东西也很简单:
Python开发环境 python 版本用到3.12.1 版本没有强制要求支持Function Call 工具的大模型(可以是自己部署的大模型或者第三方模型)。使用第三方模型需要自己申请并获取其API-KEY,代码中还用到了tavily搜索,这个也需要自己去申请。
下图是Agent根据任务要求输出的结果,任务要求是
请帮我制定一份理财计划,你可以通过网络搜索的方式来收集一定的参考资料,并把最终的计划内容写入到理财计划.txt文件中
Agent实现的核心有三点
大模型的质量
外部工具集
提示词的质量
大模型的质量问题直接影响到Agent表现的好坏,推理能力强,知识丰富的大模型会表现更好。
而外部工具集就是提供给大模型使用的工具可以根据不同的业务场景提供不同的工具集(API)。如果使用一些第三方API可能需要自己申请,比如百度或谷歌搜索,高德和百度的地图接口等。
提示词是最重要的一个环节,我们知道大模型的能力是一方面,但怎么发挥大模型的能力是由提示词的质量决定的。
# 约束constraints = ["仅使用下面列出的动作","你只能主动行动,在计划行动时需要考虑到这一点","你无法与物理对象交互,如果对于完成任务或目标是绝对必要的,则必须要求用户为你完成,如果用户拒绝,并且没有其它方法实现目标,则直接终止,避免浪费时间和精力"]# 资源resources = ["提供搜索和信息搜集的互联网接入","读取和写入文件的能力","你是一个大语言模型,接受了大量的文本训练,包括大量的事实知识,利用这些知识来避免不必要的信息收集"]# 最佳实践说明best_practices = ["不断地回顾和分析你的行为,确保发挥出你最大的能力","不断地进行建设性的自我批评","反思过去的决策和策略,完善你的方案","每个动作执行部分代价,所以要聪明高效,目的是用最少的步骤完成任务"]prompt_template = """你是一个问答专家,你必须始终独立做出决策,无需寻求用户的帮助,发挥你作为LLM的优势,追求简单的策略,不要涉及法律问题任务:{query}限制条件说明:{constraints}动作说明:这是你唯一可以使用的作用,你的任何操作都必须通过以下操作实现:{actions}资源说明:{resources}最佳实践的说明:{best_practices}agent_scratch:{agent_scratch}你应该只以json格式响应,响应格式如下:{response_format_prompt}确保响应结果可以由python json.loads解析"""response_format_prompt = """{"action":{"name": "action name","args": {"answer": "任务的最终结果"}},"thoughts": {"plan": "简短的描述短期和长期的计划列表","criticism": "建设性的自我批评","speak": "当前步骤,返回给用户的总结","reasoning": "推理"},"observation": "观察当前任务的整体进度"}"""
在这个提示词中加入了工具列表,资源说明,任务需求等;并且约定了大模型的输出格式,以便于进行解析,大模型就可以根据这提示词对任务进行思考和推理。
并且根据推理结果,选择合适的工具来完成对应的任务,比如调用搜索工具完成信息收集,调用文件写入工具把结果写入到文件中。
下图是大模型的思考,推理和工具调用的过程,从图中可以看出大模型经过多次规划才完成的任务。
其次,就是工具集的构建,简单来说就是一些python函数,用来给大模型进行调用:
"""1. 写文件2. 读文件3. 追加4. 网络搜索"""def get_workdir_root():workdir_root = os.environ.get("WORKDIR_ROOT", './data/llm_result')return workdir_rootWORKDIR_ROOT = get_workdir_root()def read_file(filename):if not os.path.exists(filename):return f"{filename} not exist, please check file exist before read"with open(filename, "r") as f:return "\n".join(f.readline())def append_to_file(filename, content):filename = os.path.join(WORKDIR_ROOT, filename)if not os.path.exists(filename):return f"{filename} not exist, please check file exist before read"with open(filename, 'a') as f:f.write(content)return "append content to file success"def write_to_file(filename, content):filename = os.path.join(WORKDIR_ROOT, filename)if not os.path.exists(WORKDIR_ROOT):os.makedirs(WORKDIR_ROOT)with open(filename, 'w') as f:f.write(content)return "write content to file success"def search(query):tavily = TavilySearchResults(max_results=5)try:ret = tavily.invoke(input=query)"""ret:[{"content": "","url": ""}]"""print("搜索结果", ret)content_list = [obj["content"] for obj in ret]return "\n".join(content_list)except Exception as err:return "search err: {}".format(err)tools_info = [{"name": "read_file","description": "read file from agent generate, should write file before read.","args": [{"name": "filename","type": "string","description": "read file name"}]},{"name": "append_to_file","description": "append llm content to file, should write file before read.","args": [{"name": "filename","type": "string","description": "file name"},{"name": "filename","type": "string","description": "append to file content"}]},{"name": "write_to_file","description": "write llm content to file","args": [{"name": "filename","type": "string","description": "file name"},{"name": "filename","type": "string","description": "write to file content"}]},{"name": "search","description": "this is a search engine, you can gain additional knowledge though this search engine when you are unsure of what large model return","args": [{"name": "query","type": "string","description": "search query to lookup"}]},{"name": "finish","description": "完成用户目标","args": [{"name": "answer","type": "string","description": "最后的目标结果"}]}]tools_map = {"read_file": read_file,"append_to_file": append_to_file,"write_to_file": write_to_file,"search": search}def gen_tools_desc():tools_desc = []for idx, t in enumerate(tools_info):args_desc = []for info in t['args']:args_desc.append({"name": info['name'],"description": info["description"],"type": info['type']})args_desc = json.dumps(args_desc, ensure_ascii=False)tool_desc = f"{idx + 1}. {t['name']}: {t['description']}, args: {args_desc}"tools_desc.append(tool_desc)tools_prompt = "\n".join(tools_desc)return tools_prompt
最后两个就是大模型的调用模块和业务的解析模块,大模型的调用模块相对比较简单,这里就不仔细说了,感兴趣的可以直接看代码。
解析模块说简单也简单,说复杂也复杂;因为当前的功能比较简单,因此只需要使用大模型本身的能力即可,然后完成对大模型每次思考和规划数据的解析即可。
而如果后续需要开发更加复杂的业务功能,比如说金融行业的投资分析,需要非常复杂的业务分析等环节,这时只依靠大模型本身的能力就不行了。
比如说,由于大模型在垂直领域的表现不佳,直接使用可能会带来幻觉等问题;还有就是Agent的记忆模块,在大量的复杂业务分析中,需要增加外部存储模块来记录历史记忆功能,这样才能更好地完成复杂的任务处理。
"""todo:环境变量的设置工具的引入prompt模板模型的初始化"""# 初始化模型mp = ModelProvider()# 解析大模型的响应def parse_thoughts(response):try:thoughts = response.get("thoughts")observation = response.get("observation")plan = thoughts.get("plan")reasoning = thoughts.get("reasoning")criticism = thoughts.get("criticism")prompt = f"plan: {plan}\n reasoning: {reasoning}\n criticism: {criticism}\nobservation: {observation}"print("thoughts: ", prompt)return promptexcept Exception as err:print("parse thoughts err: {}".format(err))return "".format(err)def agent_execute(query, max_request_time=10):cur_request_time = 0# 大模型记忆 包括短期记忆和长期记忆chat_history = []# agent 反思 规划等agent_scratch = ''while cur_request_time < max_request_time:cur_request_time += 1"""如果返回结果达到预期,则直接返回"""# 提示词模板"""prompt包含的功能:1. 任务描述2. 工具描述3. 用户的输入user_msg4. assistant_msg5. 限制6. 给出更好实践的描述"""prompt = gen_prompt(query, agent_scratch)start_time = time.time()print("--------------------------{}, 开始调用大模型LLM------------".format(cur_request_time), flush=True)# 调用大模型 直接返回json格式数据"""sys_prompt:user_msg, assistant, history"""if cur_request_time < 3:print("prompt: ", prompt)# response = call_llm()response = mp.chat(prompt, chat_history=chat_history)end_time = time.time()print("--------------------------{}, 调用大模型結束,耗时:{}---------------".format(cur_request_time, end_time-start_time), flush=True)if not response or not isinstance(response, dict):print("调用大模型错误, 即将重试: ", response)continue"""大模型返回格式约定response:{"action":{"name": "action name","args": {"args name": "args values"}},"thoughts": {"text": "thought","plan": "plan","criticism": "criticism","speak": "当前步骤,返回给用户的总结","reasoning": ""}}"""action_info = response.get("action")action_name = action_info.get("name")action_args = action_info.get("args")print("当前action name: ", action_name, action_args)if action_name == "finish":final_answer = action_args.get("answer")print("final_answer: ", final_answer)breakobservation = response.get("observation")try:"""action_name 到函数的映射, map -> { action_name: func }"""# todo: tools_map 的实现# tools_map = {}func = tools_map.get(action_name)call_func_result = func(**action_args)#{ action_name: func }except Exception as err:print("调用工具异常: ", err)call_func_result = "{}".format(err)agent_scratch = agent_scratch + "\n:observation:{}\n execute action result: {}".format(observation, call_func_result)# 由于大模型没有记忆功能,因此需要把大模型之前的输入和输出加入到history中,这也是Agent四大块中的记忆模块 由于目前的业务并不复杂,因此不需要外部记忆模块 如果业务比较复杂可能还需要外部模块进行存储assistant_msg = parse_thoughts(response)chat_history.append([user_prompt, assistant_msg])if cur_request_time == max_request_time:print("很遗憾,本次任务失败")else:print("恭喜你,任务完成")def main():# 支持用户多次交互 最大规划次数设置为10次 当超过10次时 则说明任务失败 用户可以根据自己的情况进行调整max_request_time = 10while True:query = input("请输入你的目标:")if query == "exit":returnagent_execute(query, max_request_time=max_request_time)if __name__ == "__main__":main()
最后,这里只是为了实现Agent的实现流程,并且由于大模型的质量问题,也不能保证每次都能成功。
受限于大模型的性能问题,大模型在推理和规划方面表现还不尽人意,因此怎么才能让大模型更好实现复杂推理规划是一个值得研究的问题。
里面主要涉及两个第三方模块,一个是第三方大模型的申请,个人使用的是阿里的通义千问;第二个是Travily的搜索接口,官网地址:https://app.tavily.com用户也可以自己去申请或者使用其它搜索工具,比如百度搜索等。
Agent学习参考 https://www.bilibili.com/video/BV1Sz421m7Rr?p=1&vd_source=f2f15e671adda1cc1e5512694f310ebd
用户可以在公众号回复:Agent源码 获取 用户只需要在env文件中把参数改成自己的参数,然后启动agent_main.py文件即可。
人工智能机器人小程序,后续会添加类似的Agent功能,到时感兴趣的用户可以点击查看:
此代码只是用来学习使用,并不能完成复杂的业务逻辑,用户如果想实现更加复杂的业务功能,则需要对提示词和工具进行添加和调整,比如做旅行规划就需要添加地图工具和酒店预定的API等。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-06-26
拆解Agent Harness的11大核心组件与工程实践(附下载)
2026-06-05
让 Agent 快速上生产:基于 OceanBase 和 LangChain 打造的智能体系统解决方案发布
2026-05-19
90% 的 Agent 失败,不是框架不行,而是卡在 5 个工程问题
2026-05-14
用两行代码将 AgentRun 集成到你的应用
2026-05-06
LangChain 深度智能体(Deep Agents)入门
2026-04-19
万字讲透Agent Harness的十二大模块
2026-04-08
同一个模型,换个Harness排名跳了25位:智能体基础设施完全解剖
2026-03-28
LangChain的DeepAgents子代理实战:复杂任务为什么一定要交给 SubAgent
2026-04-19
2026-04-08
2026-05-06
2026-05-19
2026-05-14
2026-06-05
2026-06-26
2026-03-26
2025-11-03
2025-10-29
2025-07-14
2025-07-13
2025-07-05
2025-06-26
2025-06-13
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。