在 LangChain,我们已经在市场、销售和工程团队内部构建了内部智能体(agents),它们彻底改变了这些团队的工作方式。但要把它们做对并不容易。我们花了大量时间解决“多人协作 harness”带来的问题,最终每个团队都收敛到了同样的几个核心原语(primitives):
- 它存在于人们已经在工作的地方(对我们来说就是 Slack)
- 它知道是谁在提问,并针对某些服务以“代表该用户”(on-behalf-of,OBO)的方式行动,而对另一些服务则使用自己的身份
- 它拥有记忆,可以作用域设在全局和/或用户级别
- 代码在沙箱中运行,并且可以向需要鉴权的服务发起请求
- 它很大比例的运行是定时调度而非由某人显式触发(也就是“环境智能体”,ambient agents)
(感谢 @caspar_br 对本文的帮助。)
LangChain 内部智能体
为了给讨论提供具体背景,先简要介绍我们在 LangChain 的三个主要智能体:
- GTM Agent:一个主动的、常驻运行的智能体,协助 GTM(go-to-market)相关工作。它会监控并回复邮件、处理新的合格线索、发送每日简报、回答关于客户账户的问题,并能执行外呼动作。
- OpenSWE:我们的工程智能体,可以处理并起草 PR,同时也会对所有 PR 运行代码审查。
- Content Studio:我们的市场智能体,可以按照我们的风格、并基于对我们定位的了解来起草素材(博客、图片、PowerPoint、视频)。
这三个智能体都以相同的方式构建。我们认为这是一套构建“公司 harness”的通用配方。
问题:用户体验
我们的所有智能体都存在于人们已经在工作的地方,也就是 Slack。每个智能体都有自己的 Slack 应用,可以被私信(DM),也可以在频道中被 @ 提及。在频道里与这些智能体协作的一个好处是,其他人可以看到别人是怎么使用它们的。
我们增加的一个不错的功能是,在 Slack 中“拆分”(breaking out)对话的概念。常常会出现这样的情况:一场很好的对话正在进行,你想把智能体拉进来征求它的意见,或者让它做点事情。但如果它直接在那个线程里运行,就会污染人类的对话并造成干扰。因此我们增加了一种简单的方式,让智能体可以“拆分”到该频道中自己独立的线程里。
有些用户体验最好不要在 Slack 里完成。例如,当 GTM Agent 想让我审阅待发送的邮件时,在 Slack 里一次性处理是没问题的;但如果积压了很多,从 Slack 消息里逐一跟进就完全不是愉快的体验。对于这类体验,我们最终确实构建了自定义 UI。
问题:身份
我们处理过的最棘手、最微妙的问题是身份,具体来说:当这些智能体采取行动时,它们代表谁行动?
业界主要有两种处理方式:
- 代表用户(on-behalf-of):智能体代表调用它的用户行动
- 固定凭据(fixed credentials):无论谁调用,智能体都使用一组固定凭据(例如某个服务账号)
以下是我们为每个智能体处理身份的方式(相关文档:为托管 Deep Agents 添加身份、管理连接):
OpenSWE:
- 当你给它发消息时,它代表你行动(例如用你的 GitHub 账号打开 PR)
- 当它在后台运行(例如作为代码审查智能体)时,它以自己的身份(GitHub app)行动
GTM Agent:
- 它有一些工具(例如 Salesforce 访问)使用固定身份,这样不是每个人都必须登录
- 它有一些工具(例如邮件)代表调用该智能体的用户行动。这些工具只在私信(DM)中可用;在共享频道中不可用
Content Studio:
- 它有一些工具(例如 Notion)代表调用该智能体的用户行动
- 它有一些工具(例如 Twitter)使用一组固定凭据,在这里是我们公司 Twitter 账号的凭据。但只有白名单中的用户才能触发某些操作。例如不是每个人都能发推文(他们可能只能读取/起草)
问题:记忆
所有智能体都有两层记忆:
- 全局记忆:适用于所有用户的记忆
- 用户记忆:只适用于特定用户的记忆
智能体自行决定要把哪些事实记到哪一层记忆。这大概是目前探索最少的一个领域——我们在这方面还有很多工作想做!
问题:代码执行
我们三个智能体都能编写并执行代码,而且为了完成任务经常需要这样做。它们都遵循同样的模式:在沙箱之外运行,但连接到沙箱并在其中执行代码。它们各自的基础镜像略有不同,依赖项也不同。OpenSWE(与编码关系最密切的智能体)会智能地决定启动哪个基础镜像(根据频道/用户而不同)。它们都利用了 LangSmith Sandboxes 上的 secret proxy(另见:为托管 Deep Agents 添加沙箱),让智能体能够在沙箱内部以安全可靠的方式连接到各项服务。
问题:定时运行
很大比例的运行是被调度或由后台事件触发的,而不是由用户直接发起的。
其中一些是由智能体的开发者设置的。例如:OpenSWE 监听 PR,当有新 PR 创建时就会对其进行审查。
另一些则是由用户要求智能体这样做的。例如:我让 GTM agent 每天给我发一份简报,它就自己创建了一个 cron 任务来做这件事。
全部构建于托管 Deep Agents 之上
所有这些智能体都构建在托管 Deep Agents(Managed Deep Agents)之上,而它又构建于开源的 Deep Agents harness 之上。它提供了解决上述所有问题的基础设施(频道、cron 定时任务、沙箱、记忆、身份),同时提供了足够的灵活性,以便按需定制智能体的行为。今天就通过快速入门试用吧!
看看你的智能体到底在做什么
LangSmith 是我们的智能体工程平台,帮助开发者调试每一个智能体决策、评估变更,并一键部署。
试用 LangSmith
获取演示