AI智能体开发入门:从零到一搭建你的第一个智能体 说实话我一开始接触AI智能体开发的时候脑子里全是问号。做什么叫为智能体? 它跟平常的AI程序存在啥区别? 我要怎样去开始? 这些问题我查阅了好多资料才弄清楚。今天就将这些经验分享出来, 期望能够帮到同一个状态困惑的您。什么是AI智能体简单来讲, AI智能体是这样一种程序, 它能够自主地去感知周围环境, 进而通过做出合适决策, 然后实施行动过程。它可不是如同那种你问什么它就回答什么的聊天机器人, 而是可以主动展开一系列任务的“数字员工”。仿佛你吩咐它“帮我梳理这周的工作邮件”, 它会自行去读取邮件, 将其分类, 概括重点, 甚至主动回复一些简短问题。整段进程不依靠你逐步去指挥。开发前的准备工作硬件和软件环境对于开发AI智能体而言, 实际上并不需要那种多高端的设备。我个人所使用的开发机属于2022年购置的笔记本, 其具备16GB内存, 配备i7处理器, 运行起来完全满足所需。系统操作方面呢建议采用Linux, 在这其中 22.04 LTS可算是一个不错的供以选择的对象。当然啦针对以及macOS而言同样也是行得通的, 只是呢存在着一些情况就是有些类库的得以安装这方面表现会麻烦那么一点儿。核心编程语言作为AI智能体开发所沿用的主力语言, 不存在其他可与之相提并论的情况。其缘由极为明晰: 在于其生态简直强大到超乎想象。你得对的基础语法有所熟悉, 尤其是异步编程, 也就是, 还有装饰器, 这两者在智能体开发里频繁被运用到。我起始之时, 异步编程学习欠佳, 致使所写智能体总会停滞于等待某API响应, 进而整个流程崩断。其后补足此块知识, 问题方得解决。关键库和框架这里列几个我实际用过的, 是极为流行的智能体框架当中的一个, 它给出了许多现成的组件。应用程序编程接口, 是用于调用大语言模型的主要接口。, 是那种轻量级的, 用于存储智能体记忆的向量数据库。搭建智能体的API服务搭建第一个智能体一个自动邮件助手我下定决心, 从一个最为简单的场景开始着手, 这个场景就是自动邮件助手, 它要具备读取新邮件的能力, 还要能够判断邮件的类型, 并且可以自动进行回复或者标记为待处理。第一步设计智能体的结构智能体一般包含这几个核心模块1. 感知模块, 用于接收外部信息, 比如说新邮件通知。2. 决策模块, 会调用那些大语言模型, 去对信息展开分析, 进而决定接下来的动作。3. 执行模块, 它具体执行的是动作, 诸如发送回复这个动作, 又或者是标记邮件之类的这种动作。4. 能存储历史交互信息的记忆模块, 可便于后续进行参考使用。我耗费了一整个下午来绘制流程图, 将每个模块的输入都清晰标识出来, 把各个模块的输出同样明确标注清楚。有这么一步是有着特别重大的意义的, 因为在随后进行写代码的时候, 你会发觉已然需要自己持续性地回头去查看这个设计完成的图。第二步搭建感知模块负责监听邮件的是感知模块, 我采用的是IMAP协议, 并会每隔30秒对收件箱予以检查。email from email. def (): mail .() mail.login(, ) mail.(inbox) , mail.(None, ) [0].split() [] for e_id in [-5:]: # 只处理最近5封未读邮件 , mail.fetch(e_id, ()) msg email.([0][1]) (msg[])[0][0] if (, bytes): .() body if msg.(): for part in msg.walk(): if part.() text/plain: body part.(True).() break else: body msg.(True).() .({ id: e_id.(), : , from: msg[From], body: body[:500] # 只取前500字符 }) mail.()是这段代码, 我调试它差不多用了两个小时的样子。主要出现的问题是关于中文编码, 在那一步, 卡顿了好长一段时间。要是你也碰到类似性质的问题, 记住要去检查邮件头的编码格式哦。第三步构建决策模块担当智能体“大脑”角色的, 是决策模块。我借助去构建此模块, 鉴于它给出了极为便捷的链式调用接口。from .llms from . from . llm (0.3, gpt-3.5-turbo) ( [, body, ], 你是一个邮件助手请分析以下邮件并决定如何处理 发件人{} 主题{} 内容{body} 请从以下选项中选择一个动作 1. 自动回复 - 如果邮件是常见问题或确认类邮件 2. 标记为待处理 - 如果邮件需要人工介入 3. 归档 - 如果邮件是通知类且无需回复 请输出你的决定和理由。 ) chain (llmllm, ) def (): chain.run({ : [], body: [body], : [from] })这里将设定为0.3, 目的在于使得模型的输出更为稳定, 防止每次分析的结果都存在差异。要是你期望智能体更具“创意”, 那么能够调高此值, 但邮件处理场景仍是维持稳定较好。第四步实现执行模块运转的模块依据判定的结果切实去开展工作, 比如说要是确定作出“自动回复”的决定, 那么便会调用SMTP来传送邮件。from email.mime.text def (, ): msg (感谢您的邮件。我已经收到您的信息会尽快处理。\n\n此邮件由AI智能体自动回复。) msg[] fRe: {} msg[From] msg[To] with .(, 465) as : .login(, ) .(msg) def (): # 这里可以连接到你的任务管理系统API print(f邮件 {} 已标记为待处理)这一模块看上去简易, 然而其中的问题亦不算少。举例来讲, SMTP的端口号是什么情况呢, Gmail所采用的是465SSL这个端口号, 而有些邮箱运用的是587TLS这个端口号。一旦弄错便无法连接成功。第五步添加记忆模块没有留存记忆的智能体宛如金鱼一般每次与之展开的对话全然都是崭新的, 而我运用了去储存智能体的“记忆”。from .utils .() .( name, .ion() ) def (, ): .add( [f{[]} {[body][:200]}], [{: , : [from]}], ids[[id]] ) def s(query, 3): .query( [query], )记忆模块具备这样的好处, 即当存在同一个发件人, 且该发件人反复发送类似邮件时, 智能体能够迅速去参考之前的处理方式, 进而保持一致性。整合所有模块把所有模块拼在一起形成一个完整的循环time async def (): while True: () for in : # 先查记忆看有没有类似案例 s([]) # 决策 () # 执行 if 自动回复 in : ([from], []) elif 标记为待处理 in : ([id]) # 记录记忆 (, ) await .sleep(30) # 每30秒检查一次 if : .run(())到这里一个基础的AI智能体就搭建完成了。遇到的问题和解决方案开发过程中我踩了不少坑说几个印象深的问题1API调用超时关于大语言模型的应用程序编程接口, 有时其做出响应呈现出速度迟缓的状况, 致使整个循环处于停滞状态。解决该问题的办法是, 为应用程序编程接口的调用增添超时设定以及重试机制。time from wraps def (3, delay2): def (func): wraps(func) def (args,): for in range(): try: func(args,, 10) as e: if - 1: raise time.sleep(delay) None问题2记忆污染倘若智能体处理了一封垃圾邮件, 它会将此次“错误经验”记录下来, 进而影响后续的判断。之后我增添了一个人工审核机制, 针对标记为“待处理”的邮件, 其处理结果不会自动被存入记忆。问题3成本控制每一回进行大模型API的调用, 均是要花费钱财的。我增添了一项简易的过滤规章: 假设邮件的主题当中涵盖有“自动回复”或者“系统通知”这类等关键词, 那么便会直接予以归档, 同时不会展开对大模型的调用。进阶方向邮件助手仅为 AI 智能体极为微小且可不甚明显的一部分, 你能够朝着这些方面进行拓展:多个智能体展开协作, 使得它们进行分工来合作, 像其中一个承担邮件相关事务, 一个负责日程方面事务, 一个负责文件管理方面事务。让智能体去学会运用日历 API, 让智能体去掌握使用文档编辑 API 等这般一些外部工具, 此举措称之为工具调用。对于持续学习而言, 要按照用户所给出的反馈, 持续不断地去优化决策逻辑。我近来在试着使智能体掌握“拒绝”, 当它对该如何去做不确定之时, 主动向用户询问 , 并非自行作主。此功能讲起来简易 , 达成起来却颇为繁杂 , 还挺复杂的。最后说几句其实, AI智能体开发这件事上的门槛不在那些像人们想象当中所认为的那样高。你并非一定得是算法方面的专家, 并且也并不需要那种对深度学习原理的熟知。只要你会, 还能理解基本的异步编程方面的内容, 那么你就能够着手开始做这件事了句号。要知道关键之处在于动手去做, 而不是仅仅只看着教程, 要去打开这个编辑器, 开始去写起始于最简单的邮件读取项目, 一旦碰到问题就要去查找文档, 还要借助查往并找寻社区里的相关内容, 如此这般慢慢地就能够搭建起相关东西来了。当我的首个智能体开始运行起来之际, 目睹着它自行处理了十几封不同的邮件, 彼时所产生的那种成就感着实是美妙得很, 真心期望着你也能够亲身去体会一番。