在 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
獲取演示