进入2025年,我决定花一些时间探索代理这个话题。我开始阅读 Anthropic 的《构建有效代理》 ,然后是 Chip Huyen 的 《AI Engineering》 。我启动了使用代理的主要工作流程,并且我还决定进行某种个人实验。这是对构建该项目的一般评论。
我想要构建的是一个简单的聊天界面,我可以在其中编写提示、选择模型并让模型使用适当的工具。我的次要目标是使用 Cursor 构建它,并且通常尽可能避免直接编写代码,但我发现通常比在 emacs 中编写代码慢,同时依赖4o-mini
提供工作示例来提取。
同样,虽然我最初设想通过 Cursor 在全栈 TypeScript 中构建它,但我最终还是选择了一个我更舒服的堆栈,并最终使用 Python3、FastAPI、PostgreSQL 和 SQLAlchemy 以及异步 psycopg3 驱动程序。自从我开始一个全新的 Python 项目以来,已经有一段时间了,并利用这个项目作为一个机会来熟悉 Python3 的 async/await 机制以及 Python3 的打字和mypy 。最后,我也想尝试一下Tailwind ,最终使用TailwindUI 的组件来构建网站。
工作版本支持我想要的一切:与模型创建聊天,并允许这些模型使用函数调用来使用我提供的工具。这些模型可以调用任意数量的工具来解决它们正在解决的问题。工具的使用肯定是这里最有趣的部分。我创建的最简单的工具是get_temperature
工具,它为您的位置提供了假温度。这让我能够提出诸如“明天在加利福尼亚州旧金山我应该穿什么?”之类的问题。并得到有用的回应。
将此函数添加到我的项目中的代码非常简单,只需 3 行 Python 代码和 25 行元数据即可传递给 OpenAI API。
def tool_get_current_weather(位置:str|None=None,格式:str|None=None) -> str: “简单的概念验证工具。” temp = random.randint(40, 90) if format == '华氏温度' else random.randint(10, 25) return f“明天的温度为 {temp} 度 {format}。” FUNCTION_REGISTRY['get_current_weather'] = tool_get_current_weather TOOL_USAGE_REGISTRY['get_current_weather'] = { “类型”:“功能”, “功能”: { “名称”:“获取当前天气”, "description": "获取当前天气", “参数”: { “类型”:“对象”, “特性”: { “地点”: { “类型”:“字符串”, "description": "城市和州,例如加利福尼亚州旧金山", }, “格式”: { “类型”:“字符串”, “枚举”:[“摄氏度”,“华氏度”], "description": "要使用的温度单位。从用户位置推断出来。", }, }, “必需”:[“位置”,“格式”], }, } }
获得此工具后,我添加的下一个工具是一个简单的 URL 检索工具,它允许代理抓取 URL 并在其提示中使用该 URL 的内容。
该工具的实现同样非常简单。
def tool_get_url(url: str|None=None) -> str: 如果 url 为无: 返回 '' 网址=str(网址) 响应 = requests.get(url) soup = BeautifulSoup(response.content, 'html.parser') content = soup.find('main') 或 soup.find('article') 或 soup.body 如果没有内容: return str(响应.内容) markdown = markdownify(str(内容), header_style="ATX").strip() 返回str(降价) FUNCTION_REGISTRY['get_url'] = tool_get_url TOOL_USAGE_REGISTRY['get_url'] = { “类型”:“功能”, “功能”: { “名称”:“获取网址”, "description": "通过 URL 检索网站的内容。", “参数”: { “类型”:“对象”, “特性”: { “网址”:{ “类型”:“字符串”, "description": "完整的 URL,包括要检索的协议。例如:\"https://lethain.com\"", } }, “必需”:[“网址”], }, } }
令人惊奇的是,通过添加检索 URL 这样的小工具,您可以为代理添加强大的功能。您可以类似地想象添加用于检索和评论 Github 拉取请求等的工具,这可以让像这样的非常简单的代理工具变得非常有用。
从事这个项目让我对不久的将来有了一个相当引人注目的看法,大多数工程师都会运行这样的简单应用程序,他们可以将事件从各种系统(电子邮件、文本、Github 拉取请求、日历等)传输到其中,创建触发器将事件映射到输入提示的模板,并使用工具感知代理执行这些提示。
将其与其他代理向您注册并公开他们有权访问的工具(例如与工具所有者安排活动)的能力相结合,并且只需付出很少的努力就可以轻松访问许多有趣的事情:
- 您可以在两个忙碌的人的日历之间安排活动,就好像他们都有一个助手来管理他们的日历一样
- 使用新的博客文章回复您自己的拉取请求,提供有关拼写错误和语法问题的反馈
- 抓取您关心的网站并识别您可能感兴趣的帖子
- 要求模型使用lethain:systems生成系统模型,运行该模型,然后绘制响应图表
- 添加一个“规划工具”,允许模型生成计划来指导复杂任务中的后续步骤。 (例如获取我的日历、获取朋友的日历、建议我们可以见面的时间)
这些都不是完全救命的,但每一个都有一定的用处,而且我想,一旦你拥有必要的脚手架来使此类事情变得简单,就会有许多相当明显的想法变得容易。
总而言之,我认为在这一点上我确信智能体将使用当前的基础模型创造出许多非常有趣的体验,以小方式改善我们的日常生活,总的来说,这些体验是相当具有变革性的。我不太相信这是所有软件未来应该工作的方式,但随着时间的推移,我对此会有更多的想法。 (工作中发生了很多有趣的实验,但这些实验还处于早期阶段。)