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

agent开发小结

agent初步开发小结新奇的agent一开始让人觉得是很高大上的东西但其实了解和开发agent并不是太复杂。一.agent的原理agent的本质就是APItoolsAPI使得大模型可以在本地使用但是也仅限于chatbot一样的聊天功能让它去访问和修改本地是做不到的相当于只有大脑没有手脚。tools的本质是函数列表函数可以做到读取和修改本地以及其他AI做不到的事如果把API和tools结合让大模型调用函数就能实现包括但不限于在电脑上干活相当于大脑装上了手脚。比如我这里把专门用于websearch的函数设置为tools,当回答和执行prompt需要进行上网搜索时API就会调用它。下图是agent的基本架构二.如何写一个简单的agent写agent的语言可以用python的Langchain框架java原生态的golang等最主流最方便的就是Langchain框架(后续agent部署需要实现云原生的话用go语言开发最佳)从Langchain入手写一个简单的agent.1)准备api并初始化大模型langchain为大多数官方供应商都定制了框架下面是常见的初始化大模型一条龙**OpenAI **这是目前生态支持最好的模型系列。需要安装pip install langchain-openai环境变量OPENAI_API_KEY也可以通过os.environ[“OPENAI_API_KEY”]临时设置Pythonfromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelgpt-4o,temperature0,max_tokensNone,timeoutNone,max_retries2,)Google Gemini适合处理超长文本和多模态任务。需要安装pip install langchain-google-genai环境变量GOOGLE_API_KEYPythonfromlangchain_google_genaiimportChatGoogleGenerativeAI llmChatGoogleGenerativeAI(modelgemini-1.5-pro,temperature0,)**Anthropic **目前在写代码和复杂逻辑推理上Claude是公认的顶流。需要安装pip install langchain-anthropic环境变量ANTHROPIC_API_KEYPythonfromlangchain_anthropicimportChatAnthropic llmChatAnthropic(modelclaude-3-5-sonnet-20241022,temperature0)本地开源模型 (使用 Ollama)如果条件不错有自己的本地模型搭配 Ollama 是最简单的方案。需要安装pip install langchain-ollama前提条件后台需要保持 Ollama 软件运行。Pythonfromlangchain_ollamaimportChatOllama llmChatOllama(modelllama3.1,# 需要先在终端运行过 ollama run llama3.1temperature0,)OpenAI 兼容每个供应商都有自己的框架各自为政不太方便最推荐的方式是OpenAI 兼容把base_url填对就能指向供应商了供应商也可以是中转站。fromlangchain_openaiimportChatOpenAI llmChatOpenAI(model模型ID,# 模型名称api_keyyour-api-key,# 填入Keybase_urlbase_url,#base_urltemperature0)从用户使用的角度来讲开发agent时用模型自框架用于初始化时用户直接对现有provider进行connect用OpenAI 兼容则允许用户自定义provider。2写tools和定义tools框架有常用的内置toolsfromlangchain_community.toolsimportDuckDuckGoSearchRun search_toolDuckDuckGoSearchRun()#这个websearch的tool很有必要由于训练的周期许多大模型本身的弱项就是消息实时性tools本质是带上tool装饰器的函数我们也可以自己写tooltooldefget_word_length(word:str)-int:返回一个单词的长度。当你需要计算单词字母数量时使用此工具。returnlen(word)和正常的函数区别是1.tool装饰器2.带三引号的提示词告诉模型什么时候需要调用这个tool最后把tool组合起来定义toolstools[search_tool,get_word_length]3初始化和简单使用agent模型API和tools二要素具备初始化agent最后可以为agent补一个全局提示词agent_executorcreate_agent(modelllm,toolstools,system_prompt你是一个聪明的 AI 助手。请尽量使用工具来解答用户的问题。,)简单的使用agentprint(\n 测试 1调用搜索工具 )# 返回一个字典其中包含一个键 messages其值是一个列表列表中的每个元素都是一个元组元组的第一个元素是消息的发送者如 user 或 agentresponse1agent_executor.invoke({messages:[(user,科比·布莱恩特的名言是什么)]})print(最终回答:,response1[messages][-1].content)response1返回的是一个字典其中messages键对应的值是一个由元组组成的数组每一个元组都是带发送者和内容的message数组的最后一个元组就是AI的回答这是要返回给用户的。伪代码结构如下{messages:[# 1. 你的原始输入 (人类消息)HumanMessage(content2024年巴黎奥运会中国队拿了多少枚金牌,additional_kwargs{},response_metadata{}),# 2. 模型的第一次思考 (AI消息决定调用工具)AIMessage(content,# 此时通常没有文本输出tool_calls[{name:duckduckgo_search,args:{query:2024年巴黎奥运会中国队金牌数量},id:call_aB3dE5# 每次调用的唯一ID}],additional_kwargs{},response_metadata{finish_reason:tool_calls,...}),# 3. 工具执行的结果 (工具消息)ToolMessage(content2024年巴黎奥运会中国体育代表团共收获40枚金牌、27枚银牌、24枚铜牌...,nameduckduckgo_search,tool_call_idcall_aB3dE5# 与上面 AI 调用的 ID 一一对应),# 4. 最终回答 (AI消息根据搜索结果生成的最终文本)AIMessage(content2024年巴黎奥运会中国队总共拿了40枚金牌。,additional_kwargs{},response_metadata{finish_reason:stop,...})]}最后是全部代码importosfromlangchain_core.toolsimporttoolfromlangchain_community.toolsimportDuckDuckGoSearchRunfromlangchain_deepseekimportChatDeepSeekfromlangchain.agentsimportcreate_agent# 1. 设置 API Keyos.environ[DEEPSEEK_API_KEY]yourkey# 2. 定义工具search_toolDuckDuckGoSearchRun()tooldefget_word_length(word:str)-int:返回一个单词的长度。当你需要计算单词字母数量时使用此工具。returnlen(word)tools[search_tool,get_word_length]# 3. 初始化 DeepSeek 模型llmChatDeepSeek(modeldeepseek-chat,temperature0)# 4. 创建 Agent 大脑# 【修改点 2】使用最新的 create_agent 函数# 【修改点 3】系统提示词的参数名由 state_modifier 变成了更易懂的 system_promptagent_executorcreate_agent(modelllm,toolstools,system_prompt你是一个聪明的 AI 助手。请尽量使用工具来解答用户的问题。,)# 5. 测试运行if__name____main__:print(\n 测试 1调用搜索工具 )# 返回一个字典其中包含一个键 messages其值是一个列表列表中的每个元素都是一个元组元组的第一个元素是消息的发送者如 user 或 agentresponse1agent_executor.invoke({messages:[(user,科比·布莱恩特的名言是什么)]})print(最终回答:,response1[messages][-1].content)print(\n 测试 2调用自定义工具 )response2agent_executor.invoke({messages:[(user,单词 Supercalifragilisticexpialidocious 有多少个字母)]})print(最终回答:,response2[messages][-1].content)三.agent实现多会话功能1添加记忆一个能用的agent至少是可以携带记忆一直对话的而不是单次问答。实现这个并不复杂只需要添加记忆储存器记忆储存器有三种MemorySaverSqliteSaverPostgresSaver 第一个内存储存基本用不到第二个是在当前目录储存把db文件直接放当前目录下第三个是PostgreSQL数据库储存 PostgreSQL 原生对 AI 和 Agent 非常友好。用SqliteSaver可以在本地玩玩更多的是用PostgresSaver符合企业的工业级多机分布式 Agent建立连接并利用连接实例化SqliteSaver# 1. 建立数据库连接connsqlite3.connect(agent_memory.db,check_same_threadFalse)# 2. 直接实例化 SqliteSavermemorySqliteSaver(conn)# 3. 如果是第一次运行需要调用 setup() 让框架自动建表memory.setup()这步如果是用PostgresSaver则是,# 1. 配置PostgreSQL 数据库连接字符串 (URI)# 格式: postgresql://账号:密码主机地址:端口/数据库名DB_URIpostgresql://postgres:123456localhost:5432/agent_db# 2. 建立数据库连接池 (ConnectionPool),更优雅的写法是with ConnectionPool() as pool:后续会给示例poolConnectionPool(conninfoDB_URI,max_size20# 生产环境根据服务器配置可调大)# 3. 实例化 PostgresSavermemoryPostgresSaver(pool)# 4. 关键如果是第一次运行让框架在你的 Postgres 库里自动创建必要的表memory.setup()然后把它添加为初始化agent的参数checkpointeragent_executorcreate_agent(modelllm,toolstools,system_prompt你是一个聪明的 AI 助手。请尽量使用工具来解答用户的问题。,checkpointermemory,)使用记忆储存器时要搭配thread_id使用调用API思考和查记忆库的进程是很轻量的这种进程会在后端一个服务成百上千个用户需要靠thread_id区分用户。方法是定义config再到invoke里加参# Agent 内部会自动根据 thread_id 去数据库里精准提取只属于这个人的记忆config{configurable:{thread_id:user_production_001}}print( 第一轮对话写入记忆 )response1agent_executor.invoke({messages:[(user,我叫林克最喜欢的水果是哈密瓜)]},configconfig)print(Agent 回答:,response1[messages][-1].content)print(\n 第二轮对话测试数据库读取 )response2agent_executor.invoke({messages:[(user,还记我叫什么吗)]},configconfig)print(Agent 回答:,response2[messages][-1].content)运行结果同时LangGraph 建了四张表记录对话里面的数据都是存为bytea二进制格式作为人暂时看不懂checkpoints存储记忆的检查点元数据 checkpoint_blobs存储具体的对话内容大对象 checkpoint_writes存储工具调用等写入记录 checkpoint_migrations记录数据库版本使用PostgresSaver的完整代码importosfromlangchain_core.toolsimporttoolfromlangchain_community.toolsimportDuckDuckGoSearchRunfromlangchain.agentsimportcreate_agentfromlangchain_openaiimportChatOpenAIfromlangchain_deepseekimportChatDeepSeek# 引入 PostgreSQL 相关的库frompsycopg_poolimportConnectionPoolfromlanggraph.checkpoint.postgresimportPostgresSaver search_toolDuckDuckGoSearchRun()tooldefget_word_length(word:str)-int:返回一个单词的长度。当你需要计算单词字母数量时使用此工具。returnlen(word)tools[search_tool,get_word_length]os.environ[DEEPSEEK_API_KEY]skllmChatDeepSeek(modeldeepseek-chat,temperature0) llm ChatOpenAI( model, base_url, api_key, temperature0, ) # 配置PostgreSQL 数据库连接字符串 (URI)DB_URIpostgresql://postgres:675563localhost:5432/agent_dbif__name____main__:# 使用 with 语句管理连接池确保程序结束时优雅关闭withConnectionPool(conninfoDB_URI,max_size20,kwargs{autocommit:True})aspool:# 实例化 PostgresSavermemoryPostgresSaver(pool)# 如果是第一次运行让框架在你的 Postgres 库里自动创建必要的表memory.setup()# 初始化Agentagent_executorcreate_agent(modelllm,toolstools,system_prompt你是一个聪明的 AI 助手。请尽量使用工具来解答用户的问题。,checkpointermemory,)print( 提示当前记忆已接入远端 PostgreSQL 数据库。)print(支持多进程、多服务器分布式读取\n)config{configurable:{thread_id:user_production_002}}whileTrue:response1agent_executor.invoke({messages:[(user,input(请输入问题))]},configconfig,)print(Agent 回答:,response1[messages][-1].content)2实现一个用户拥有多个独立对话Session刚才虽然区分了用户但是一个用户只有一个对话很不现实。实现这个也很简单再绑一个session_id,即可config{configurable:{thread_id:session_id,user_id:current_user_id}}改进后的代码伪代码importuuid# 引入生成唯一 ID 的库# ... (前面的引用、tool定义、初始化llm和 PostgreSQL 连接初始化代码完全保持不变) ...if__name____main__:# 使用 with 语句管理连接池确保程序结束时优雅关闭withConnectionPool(conninfoDB_URI,max_size20,kwargs{autocommit:True})aspool:# 实例化 PostgresSavermemoryPostgresSaver(pool)# 如果是第一次运行让框架在你的 Postgres 库里自动创建必要的表memory.setup()# 初始化Agentagent_executorcreate_agent(modelllm,toolstools,system_prompt你是一个聪明的 AI 助手。请尽量使用工具来解答用户的问题。,checkpointermemory,)# 假设当前登录的用户是 002current_user_iduser_production_002print(f\n‍ 欢迎回来用户{current_user_id})# 改进点 1让用户选择是新建对话还是继续历史对话print(1. 新建一个空白对话)print(2. 继续之前的历史对话)choiceinput(请选择 (1或2): )ifchoice1:# 生成一个全新的、绝不重复的 UUID 作为会话 IDsession_idstr(uuid.uuid4())print(f✨ 已开启新对话当前对话专属 ID:{session_id})else:# 从业务数据库里拉取该用户的历史 Session 列表(可以给agent配个tool让它自己拉取)供他点击。再传到后端session_id用户选择的session# 改进点 2组装进阶版 Config# thread_id 绑定为具体的会话同时把 user_id 存入配置中方便日后数据审计和权限隔离config{configurable:{thread_id:session_id,user_id:current_user_id}}print(\n 提示输入 q 可以退出当前对话。\n)whileTrue:user_msginput(请输入问题)ifuser_msg.strip().lower()q:print( 对话结束。)breakresponse1agent_executor.invoke({messages:[(user,user_msg)]},configconfig,)print(Agent 回答:,response1[messages][-1].content)四.更多的toollangchain_community.tools是 LangChain 生态中最庞大、最活跃的社区贡献tools库。常用且高效的tool都已经写好了甚至还有专攻某类任务而一条龙集成tools的Toolkit官方文档https://docs.langchain.com/oss/python/integrations/tools1常见tool搜索引擎与知识库查询 (最常用)这类工具让 Agent 能够突破模型预训练数据的限制获取实时信息或专业文献。DuckDuckGo (DuckDuckGoSearchRun)免费、无需注册的网页搜索你已经用过了。Google Search / Serper (GoogleSearchRun,GoogleSerperRun)商业级 Google 搜索需要 API Key返回结果更结构化。Tavily (TavilySearchResults)专为 AI Agent 设计的搜索引擎直接返回清洗好的无广告正文目前业界极力推荐。Wikipedia (WikipediaQueryRun)直接检索维基百科的词条和摘要。学术与科研 (ArxivQueryRun,PubMedQueryRun)专用于搜索 Arxiv 论文和 PubMed 医学文献。系统执行与代码工具文件管理 (FileManagementToolkit)包含一整套工具如ReadFileTool,WriteFileTool,CopyFileTool,DeleteFileTool。它内置了安全目录隔离只能在指定的 Root 目录内操作。Shell 终端 (ShellTool)允许 Agent 执行 Bash/CMD 命令。Python 交互环境 (PythonREPLTool)允许 Agent 生成 Python 代码并在沙盒或当前环境中执行这是实现复杂数学计算或数据分析如 Pandas 操作的核心工具。网络爬虫与 API 交互当标准的搜索引擎无法满足需求Agent 需要亲自去“逛”网页或调用外部接口时使用。Requests (RequestsGetTool,RequestsPostTool)最基础的 HTTP 请求工具Agent 可以用它自行构造 API 调用。Playwright / Selenium 浏览器工具让 Agent 可以真正启动一个无头浏览器Headless Browser进行点击按钮、填写表单、提取动态渲染的网页内容等自动化测试级别的操作。数据库与数据分析让 Agent 化身为数据分析师直接用自然语言查询你的公司数据库。SQL 数据库 (SQLDatabaseToolkit)这是一个超级工具包。只要给它一个数据库连接URIAgent 就能自动查看表结构Schema、编写 SQL、执行查询并根据结果回答问题。Spark SQL (SparkSQLToolkit)用于处理大数据场景下的 Spark 集群交互。SaaS 平台与办公协同企业级 Agent 落地最多的场景让 AI 帮你打工。研发协作GitHub提 PR、查 Issue、Review 代码、GitLab、Jira。日常办公Gmail读写邮件、Office365、GoogleCalendar安排日程、Slack/Discord自动回复消息。2)tool的进阶用法函数被tool装饰成tool后可以调用invoke方法进行简单测试fromlangchain_community.toolsimportDuckDuckGoSearchRun# 1. 初始化searchDuckDuckGoSearchRun()# 2. 单独测试这个工具不经过大模型print(正在执行搜索测试...)resultsearch.invoke(DeepSeek V3 发布日期)# 3. 打印工具真正的返回结果print(result)有的tool初始化是直接加()#Python 代码执行沙盒fromlangchain_experimental.toolsimportPythonREPLTool python_toolPythonREPLTool()tools[search_tool,wiki_tool,python_tool]另一种是需配置 API Key 或参数进行初始化以 AI 专用搜索引擎Tavily为例importosfromlangchain_community.tools.tavily_searchimportTavilySearchResults# 必须先设置对应的环境变量 (去 tavily.com 免费申请)os.environ[TAVILY_API_KEY]tvly-your-api-key-here# 初始化时可以传入特定的参数比如控制只返回 3 条结果tavily_toolTavilySearchResults(max_results3)tools[tavily_tool]集成tools的工具包toolkit)用法如下:先初始化工具包再获取其中toolsfromlangchain_community.agent_toolkitsimportSQLDatabaseToolkitfromlangchain_community.utilitiesimportSQLDatabasefromlangchain_deepseekimportChatDeepSeek# 1. 初始化你的 LLM (Toolkit 里的工具需要大脑来帮忙写 SQL)llmChatDeepSeek(modeldeepseek-chat,temperature0)# 2. 初始化你的数据库连接 (假设就是你刚才建的 agent_db)dbSQLDatabase.from_uri(postgresql://postgres:675563localhost:5432/agent_db)# 3. 初始化 Toolkit (把数据库和 LLM 喂给它)toolkitSQLDatabaseToolkit(dbdb,llmllm)# 4. 关键点Toolkit 不能直接塞给 Agent必须调用 get_tools() 解包成工具列表newtoolstoolkit.get_tools()tools.extend(newtools)# 现在你可以把 tools 交给 create_agent 了因使用opencode而对agent萌生兴趣就想着试试agent开发。写这篇文章时我也只是一个初次接触agent的小白这么简单的文章写了好久且没有什么技术含量当然这也只是第一步未来还要接触复杂工作流编排 (Workflow Orchestration)、多智能体协作 (Multi-Agent System)、本地知识库的挂载 (RAG 检索增强)、**生产环境部署与基建 (Production Deployment)**这些高阶开发希望这不仅仅只是我的一腔热血而是一件命运的齿轮。
http://www.zskr.cn/news/1353594.html

相关文章:

  • 人员定位系统技术方案:主流定位技术对比与选型到架构方案
  • 2026曲靖市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • 从钻孔记录到三维模型:Grapher与Surfer应用实践
  • 2026淮南市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • 已存在9年的 Linux Kernel 漏洞可导致执行 root 命令
  • 2026衢州市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • 元器件选型太难?解锁硬件工程师参数高效对比技巧
  • 边缘计算中的RSNN语音识别加速器设计与优化
  • Serverless多事件触发器:提升FaaS效率的关键技术
  • RTX166任务调度:K_IVL与K_TMO事件机制详解
  • ReAct 循环的 50 行 Go 实现,逐行拆解
  • 厂二代接班创业和继承怎么选择
  • 关于人工智能应用工程师认证的价值分析与职业发展建议
  • 2026贵港市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • 2026年AI编程工具综合对比:主流工具横评
  • Intercom2 正式发布!预测需求、实时预警、全量质检一次升级
  • 别再重复造轮子了!这个开源论坛小程序(Java+Uniapp)一套代码搞定 App/小程序/H5/PC,私域流量神器
  • 1688代采系统开发避坑指南:经验之谈
  • AI模型运行时鲁棒性与公平性监测技术解析
  • 用 TLA+ 形式化验证 Harness 的并发安全性
  • 2026黄石市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • 客易云打造ai大模型聚合平台以开放共享理念重塑AI时代商业新生态
  • 2026桂林市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • 2026三门峡市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • LED显示屏回收测评:高新区狮山迅龙经营部价格合理流程便捷
  • 糖尿病风险预测系统:机器学习算法对比与区块链边缘计算架构实践
  • C 语言自定义类型:结构体、位段、联合体、枚举
  • Antigravity更新报错问题
  • 2026海口市最新黄金 白银 铂金 彩金回收收门店实力排行榜及联系方式推荐 - 大熊猫898989
  • 如何使用注解