到 2025 年,代理商可以處理 90% 的工作流程,讓您和您的團隊專注於真正重要的事情。
今天,我們將深入研究 CoAgents ( CopilotKit ),這是一個用於建立使用者互動式代理程式和副駕駛的全端框架。
我們將探索與 LangGraph 和 CrewAI 等領先的代理框架的集成,討論工作流程自動化,並強調常見的陷阱和避免它們的最佳實踐。
您還將獲得帶有原始程式碼的真實自動化範例,以幫助您實施這些策略。
讓我們開始吧。
簡而言之,我們正在詳細介紹這些主題。
有核心元件的 CoAgents 是什麼?
與 CrewAI(Crews + Flows)整合。
工作流程自動化的含義以及常見的誤解。
一些帶有原始程式碼的真實範例。
涉及常見的陷阱和最佳實踐。
附註:Copilotkit(建構 AI Copilots 的框架)最近與 LangChain 和 CrewAI 合作推出了 CoAgents。這就是我們在此要討論的內容。
人工智慧代理就像是真正智能的助手。您只需告訴他們您需要什麼,他們就會想辦法完成它! !
LLM 是該系統的brain
。當人工智慧需要與外界溝通、取得資料或執行特定任務時,它可以利用工具,即外部資源或 API。
它是這樣的:Copilot + Agents = CoAgents(CopilotKit),用於將任務分解為更小的步驟,協調動作,並與人類一起工作(Human-in-the-loop)。
例如,假設銷售專業人員丹以錯誤的貨幣提交了差旅報銷,從而導致了重大錯誤。自動化的工作流程不允許流程中的任何人輕易糾正這個錯誤。 CoAgents 可以介入,在適當的時機請求手動輸入,並在問題變得更嚴重之前予以糾正。
感謝 Miraj Mohsin
CopilotKit是一個將 AI 副駕駛整合到產品的框架。它為 AI 聊天、生成式 UI 和自動完成提供 React 元件,以及根據使用者行為使用上下文、工具和技能來改進 AI 代理程式的執行時間。
開發人員可以使用LangGraph SDK
+ CoAgents (Copilotkit)
為任何垂直產業建構 CoAgents。只需建立一個適合您的工作流程的LangGraph agent
,然後使用CoAgents
整合自訂操作和產生的 UI 體驗。
您可以按照Agents 101:如何在 30 分鐘內建立您的第一個代理,這是一個逐步指南,可幫助您建立 CoAgents。
{% cta https://go.copilotkit.ai/copilotkit %}查看 CopilotKit 的 GitHub ⭐️ {% endcta %}
這是在一個乾淨的框架內完成的,用於管理應用程式內的 CoAgents(感謝 LangGraph)。
讓我們了解核心元件:
Shared State (Agent ↔ Application)
——AI 代理程式和應用程式之間的同步狀態,以確保兩者都能即時存取相同的資訊。這使得代理能夠了解應用程式的上下文,並且應用程式能夠監視代理的操作。const {state, setState} = useCoAgent("the agent name")
Agentic Generative UI
- 在聊天 UI 中呈現代理程式的即時狀態,以便使用者可以看到代理正在做什麼。useCoagentStateRender(
name: "research_agent",
node: "download_progress",
render: ({ state, nodeName, status }) => {
return Progress logs={state.logs} /;
});
Human-in-the-Loop
- 在代理流程中指定需要人工輸入或批准的斷點。這確保了更高的安全性以及更好的代理性能。useCopilotAction({
name: "ApprovePlan",
parameters: [
{ name: "planSteps", type: "string[]" }
],
renderAndWait: ({ args, handler }) => (
<ConfirmPlan
planSteps={args.planSteps}
onApprove={(approvedSteps) => handler({ ... })}
onDeny={() => handler({ ... })}
/>
);
Realtime frontend actions
- 在前端操作可用時將其傳送至 LangGraph 代理程式。這使得代理商能夠即時在應用程式的前端明確地採取行動,例如填寫表格。useCopilotAction({
name: "InsertItemInList",
parameters: [
{ name: "city", type: "string" },
{ name: "country", type: "string" }
],
handler: ({ args, status }) => {
// ...
}
});
根據文件,未來版本將包括代理指導,使最終用戶能夠重新調整錯誤的代理和子圖支援等。
您可以在copilotkit.ai/coagents上閱讀更多內容,其中還有說明圖表來幫助您理解。
如果您想快速了解,請觀看 Atai(Copilotkit 聯合創始人)的這段 2 分鐘影片!
{% 嵌入 https://youtu.be/tVjVYJE-Nic %}
CrewAI是一個用於協調角色扮演 AI 代理的框架。它允許開發人員建立一crew of AI agents
,每個代理都有特定的角色和職責,共同完成複雜的任務。
它模仿人類的組織結構,建立在多智能體系統的概念上。如果您剛開始,CrewAI 是最適合初學者的框架之一。
如果你不知道,CrewAI 提供了兩種不同的方法來管理 AI 工作流程:
⚡ Crews
-定義誰(一起工作的特務)。對於需要自主解決問題和創造性協作的任務,請選擇此專案。
⚡ Flows
-定義如何(他們遵循的流程)。選擇此專案可獲得確定性結果、結構化工作流程和安全執行。
CrewAI 還支援將兩者結合起來用於混合應用程式,其中 Flows 協調整個流程,而 Crews 處理需要自主的複雜子任務。您可以在文件中了解差異、它們如何協同工作以及更多內容。
Copilotkit 最近推出了與 CrewAI 的整合。您可以在幾分鐘內將 Flows and Crews 轉變為代理原生應用程式。
使用我們之前討論過的 CoAgents 元件非常簡單。下面我們來快速看一下整合的流程。
如果您之前建立過 CrewAI Crew 代理,則與 Copilotkit 整合很容易。
首先,在您的前端安裝 CopilotKit。
npm install @copilotkit/react-ui @copilotkit/react-core
記下您的 Crew API URL 和 Bearer 令牌,然後前往cloud.copilotkit.ai在 Copilot Cloud 註冊您的工作人員。
您將需要建立一個端點並設定 Copilotkit 提供者。
{% 嵌入 https://youtu.be/N0ju60Uxys0 %}
<CopilotKit>
元件必須包裝應用程式中支援 Copilot 的部分。大多數情況下,最好將其放置在整個應用程式周圍,例如在layout.tsx
中。
import "./globals.css";
import { ReactNode } from "react";
import { CopilotKit } from "@copilotkit/react-core";
export default function RootLayout({ children }: { children: ReactNode }) {
return (
<html lang="en">
<body>
{/* Use the public api key you got from Copilot Cloud */}
<CopilotKit
publicApiKey="<your-copilot-cloud-public-api-key>"
agent="sample_agent" // the name of the agent you want to use
>
{children}
</CopilotKit>
</body>
</html>
);
}
然後您需要設定您的 Copilot UI 來完成整合。
import { CopilotPopup } from "@copilotkit/react-ui";
export function YourApp() {
return (
<>
<YourMainContent />
<CopilotPopup
instructions={"You are assisting the user as best as you can. Answer in the best way possible given the data you have."}
labels={{
title: "Popup Assistant",
initial: "Need any help?",
}}
/>
</>
);
}
查看他們的Restaurant Finder Crew 演示和文件以了解完整流程。
最簡單的開始方式是從 Copilotkit 的 repo 中克隆crewAI crews 和 coagents模板。它包括一個帶有可立即使用的 UI 的範例 Python 代理程式。
如果您之前建立過 CrewAI Flow 代理,則與 Copilotkit 整合很容易。
安裝 Copilotkit 包,在本地啟動代理,並在 Copilotkit Cloud 上建立遠端端點以連接您的 CrewAI Flow。
接下來,設定 Copilotkit 提供者並建立聊天 UI,如前所述。
閱讀文件以獲得逐步整合指南。
最簡單的開始方式是從 Copilotkit 的 repo 中克隆crewAI 流程和 coagents模板。它包括一個帶有可立即使用的 UI 的範例 Python 代理程式。
順便說一句,如果你剛開始,那麼你應該從 AndrewNg(深度學習)的這門短期課程中學習如何使用 crewAI 建立多 AI 代理系統。
現在,是時候了解一些關於工作流程自動化的知識,並用一般術語來分解它。
Automation
就是讓任務自行運作。
從本質上講,它遵循一個簡單的規則:當某事發生時,採取具體行動。即使最複雜的自動化也可以分解為這個基本原理。
例如: When
您收到潛在客戶的新電子郵件時, Then
透過文字通訊管道通知我的銷售團隊。
Workflow
是應用程式內為實現結果而可重複的一組步驟。許多人將其與過程混淆,但你可以這樣思考:
process
-需要做什麼(發送發票)。
workflow
- 您將如何進行操作(在 PayPal 中建立發票 → 將其上傳至 DocuSign → 透過電子郵件發送以供簽署 → 跟進付款)
因此, Workflow automation
意味著在軟體中自動執行重複任務。您應該查看 Zapier 的這個工作流程自動化部落格。它有例子、想法和非常有用的解釋。
瑞安·哈欽森 (Ryan Hutchinson) 的個人生意有 90% 實現了自動化。這是 Whimsical 連結,您可以在其中分析流程圖。
關於自動化有許多誤解,所以讓我們澄清一下:
❌ It's just scripting
——現代自動化工具不僅僅是執行簡單的腳本。它們連接應用程式、處理複雜的工作流程,甚至適應情況。 CoAgents 則更進一步。
❌ Only developers can use it
——雖然有強大的開發人員框架,但像 Zapier 和 n8n 這樣的無程式碼工具可以幫助任何人實現自動化,而無需編碼技能。
❌ Expensive and complex
——許多自動化工具價格實惠且易於設置,即使對於小團隊也是如此。
YouTube 上有一個非常有趣的影片您可以觀看。它與 AI 代理相關,但您可以了解一個基本的了解。
{% 嵌入 https://www.youtube.com/watch?v=QFc7jXZ2pdE
%}在本節中,我們將探討一些潛在的應用想法並了解其是如何自動化的。
您可以查看快速入門指南,因為其中有安裝 Docker 和 LangGraph CLI 等先決條件。
這些範例涉及它們如何與技術解釋一起工作,如果令人困惑,請轉到每個點中提到的教程。
假設您需要一個研究代理,但讓它自主運作會有風險。主要是因為AI模型產生了幻覺,導致了不相關資料的產生。
這就是為什麼 CoAgents 採用不同的方法,它可以自動化 90% 的工作,同時讓您掌控一切。
您可以按照文件中的教程進行操作,該教程將其分為包括技術內容在內的簡單步驟。我無法涵蓋所有內容,否則它會太長。
🎯 它是如何運作的?
您提供提示,代理商會建議結構化的部分供您批准。
提交研究提示
從這裡,您可以在每個主題繼續前進之前approve
或reject
它。
一旦獲得批准,代理商將根據您批准的主題產生詳細內容。
在後台,我們使用useLangGraphInterrupt
鉤子來處理 UI 中的核准。它是一個 React hook,可讓您在使用 LangGraph interrupt
時自訂 UI。當觸發中斷事件時,鉤子就會執行,讓您能夠以您喜歡的使用者體驗收集使用者輸入。這是它的實現方式。
// ...
import { useLangGraphInterrupt } from "@copilotkit/react-core";
// ...
export default function HomePage() {
// ...
const { state: researchState, setResearchState } = useResearch()
const streamingSection = useStreamingContent(researchState);
useLangGraphInterrupt<Proposal>({
render: ({ resolve, event }) => {
return <ProposalViewer
proposal={event.value}
onSubmit={(approved, proposal) => resolve(
JSON.stringify({
...proposal,
approved,
})
)}
/>
}
})
// ...
}
一旦主題最終確定, useCoAgent
鉤子就會在代理狀態和 UI 之間維持雙向連接。
const { state, setState, run } = useCoAgent<ResearchState>({
name: 'agent',
initialState: {},
});
這實現了即時研究工作流程,用戶可以在聊天 UI 中追蹤進度並根據需要進行調整。
我們只需要在應用程式中新增生成 UI,以便我們可以在聊天 UI 中視覺化代理程式狀態。
根據批准生成回复
最後,如果您需要任何更改,您也可以選擇進一步編輯它。
預設情況下,CopilotKit 會根據上下文智慧地將請求路由到適當的代理程式。在這種情況下,我們只有一個代理,理想的做法是將所有請求鎖定到該代理。
您可以查看GitHub 儲存庫和現場演示。
假設您需要一家旅行社,它將根據您的喜好搜尋地點並規劃完整的行程。
如果不使用 CoAgents,它要么不準確,要么需要大量的手動工作。我們可以使用CopilotKit
、 LangGraph
和Google Maps API
來自動執行此操作。
您可以按照文件中的教程進行操作,該教程將其分為包括技術內容在內的簡單步驟。我無法涵蓋所有內容,否則它會太長。
🎯 它是如何運作的?
假設你問經紀人: Plan a trip to England but focus on filming set locations. Also, include a hotel near the area and some decent food. I will be there for 10 days.
代理商會建議旅行地點,您可以根據需要加入。
要將代理程式整合到此狀態,您需要設定一個遠端端點並使用useCoAgent
鉤子來連接它。安裝 LangGraph Studio 後,您可以執行並視覺化該 LangGraph 代理程式。
在後台,它使用useCoAgent
鉤子來允許 UI 和代理執行之間共用狀態。對於工作流程中的人機循環,請使用useCoAgentStateRender
掛鉤。
// ...
import { Trip, Place, AgentState, defaultTrips} from "@/lib/trips";
import { useCoAgent } from "@copilotkit/react-core";
export const TripsProvider = ({ children }: { children: ReactNode }) => {
const { state, setState } = useCoAgent<AgentState>({
name: "travel",
initialState: {
trips: defaultTrips,
selected_trip_id: defaultTrips[0].id,
},
});
// ...
您可以指定一個代表 LangGraph 代理程式狀態的類型。只要注意狀態類型與 LangGraph 代理的狀態相符即可。
串流搜尋進度
一旦您整合了 LangGraph 代理,您將需要即時向使用者傳輸搜尋進度。在 LangGraph 代理程式的search_node
中使用copilotkit_emit_state
CopilotKit SDK 函數。
使用 CoAgents,LangGraph 代理程式的狀態僅當節點發生變化(如遍歷邊)時才會更新。這意味著預設不會向使用者顯示正在進行的工作。但是,我們可以使用copilotkit_emit_state
函數手動發出狀態。
將自訂 CopilotKit 配置新增至「search_node」來描述我們將發出的中間狀態。
# ...
from copilotkit.langgraph import copilotkit_emit_state, copilotkit_customize_config
async def search_node(state: AgentState, config: RunnableConfig):
"""
The search node is responsible for searching for places.
"""
ai_message = cast(AIMessage, state["messages"][-1])
config = copilotkit_customize_config(
config,
emit_intermediate_state=[{
"state_key": "search_progress",
"tool": "search_for_places",
"tool_argument": "search_progress",
}],
)
# ...
現在我們可以呼叫copilotkit_emit_state
來在我們想要的任何地方發射中間狀態。在這種情況下,我們將在搜尋開始時和收到結果時發布其進度。
# ...
async def search_node(state: AgentState, config: RunnableConfig):
"""
The search node is responsible for searching for places.
"""
ai_message = cast(AIMessage, state["messages"][-1])
config = copilotkit_customize_config(
config,
emit_intermediate_state=[{
"state_key": "search_progress",
"tool": "search_for_places",
"tool_argument": "search_progress",
}],
)
# ^ Previous code
state["search_progress"] = state.get("search_progress", [])
queries = ai_message.tool_calls[0]["args"]["queries"]
for query in queries:
state["search_progress"].append({
"query": query,
"results": [],
"done": False
})
await copilotkit_emit_state(config, state)
# ...
我們的搜尋狀態將透過search_progress
鍵傳送給 CopilotKit。當我們收到搜尋結果時,我們可以新增此程式碼來更新此狀態。
# ...
places = []
for i, query in enumerate(queries):
response = gmaps.places(query)
for result in response.get("results", []):
place = {
"id": result.get("place_id", f"{result.get('name', '')}-{i}"),
"name": result.get("name", ""),
"address": result.get("formatted_address", ""),
"latitude": result.get("geometry", {}).get("location", {}).get("lat", 0),
"longitude": result.get("geometry", {}).get("location", {}).get("lng", 0),
"rating": result.get("rating", 0),
}
places.append(place)
state["search_progress"][i]["done"] = True
await copilotkit_emit_state(config, state)
state["search_progress"] = []
await copilotkit_emit_state(config, state)
# ...
現在,我們可以透過使用useCoAgentStateRender
鉤子顯示search_progress
來在 UI 中呈現此狀態。
// ...
import { useCoAgent } from "@copilotkit/react-core";
import { useCoAgent, useCoAgentStateRender } from "@copilotkit/react-core";
import { SearchProgress } from "@/components/SearchProgress";
export const TripsProvider = ({ children }: { children: ReactNode }) => {
// ...
const { state, setState } = useCoAgent<AgentState>({
name: "travel",
initialState: {
trips: defaultTrips,
selected_trip_id: defaultTrips[0].id,
},
});
useCoAgentStateRender<AgentState>({
name: "travel",
render: ({ state }) => {
if (state.search_progress) {
return <SearchProgress progress={state.search_progress} />
}
return null;
},
});
// ...
}
在循環中實現人類(這是最後一步)是使用Breakpoints
來實現的。它就像一個暫停按鈕,讓用戶在代理執行之前批准其操作。
這裡, trips_node
充當perform_trips_node
的代理。在trips_node
上新增斷點會暫停執行,直到使用者批准該操作。
# ...
graph = graph_builder.compile(
checkpointer=MemorySaver(),
interrupt_after=["trips_node"],
)
您必須更新perform_trips_node
來處理使用者的決定,然後發出工具呼叫,更新前端以顯示該決定,並將使用者的決定傳回代理。
您可以將useCopilotAction
鉤子與renderAndWait
一起用於每次工具呼叫。
按照指南可以使其更容易理解。
作為最終的輸出,您將獲得一份行程摘要。您可以直接在螢幕上顯示的 Google 地圖上查看位置。
您可以查看GitHub 儲存庫和現場演示。
{% 嵌入 https://www.youtube.com/watch?v=9v3kXiOY3vg
%}您也可以在 CopilotKit 儲存庫中的官方範例中找到其他一些內容。
自動化功能強大,但很容易出錯。以下是一些常見的陷阱:
❌ Automation overkill
-不要因為你可以就把所有事情都自動化。有時人性化的接觸才是真正的價值,想想自動化是否改善了體驗或使其感覺不那麼人性化。
記住, CoAgents 是隊友,而不是替代者。
讓我們舉一個現實世界房地產過度自動化的例子。
Zillow 的 iBuying 計畫依靠名為Zestimates
的人工智慧房屋估價來提出購買報價。但模型存在盲點:
a) 當人工智慧將價格定得太高時,它沒有考慮到地下室漏水等隱藏問題,賣家很快就接受了,而 Zillow 最終買下了難以轉售的高價房屋。
b) 當人工智慧低估房屋價值時,賣家會忽略 Zillow 並選擇其他買家的更好報價,從而減少優質購買量。
這導致了自我選擇偏差,最終迫使他們在 2021 年巨額財務損失後關閉了 iBuying 業務。
以下是 CNET 對Zillow 發生了什麼事的報導?一個備受青睞的房地產網站是如何在 iBuying 上失敗的。
❌ Don't set it and forget it
- 嘗試監控您的 Coagent 的性能並收集用戶的回饋。在大多數情況下,你會發現一些有用的東西來改善邏輯。
Maria on CIO 寫了一篇非常有趣的文章,介紹了自動化的最大陷阱以及如何避免這些陷阱。
✅ Keep humans in the loop
-過早地將人類從工作流程循環中移除總是有弊端的。
✅ 嘗試使用不同的已證實的方法來減少幻覺。一些新創公司也可以幫助您檢測準確的百分比。
底線是讓合作代理為您服務(而不是與您作對) 。
總而言之,時間大於一切,所以自動化可以幫助您節省時間。
我希望本指南能為你提供一些幫助。
如果您之前已經實現過工作流程自動化或建立過某些東西,請在評論中與我們分享。
祝你有美好的一天!直到下次:)
|您可以檢查
我在anmolbaranwal.com上工作。
感謝您的閱讀! 🥰 |
|
| --------- | -------- |
在Twitter上關注 CopilotKit 並打招呼,如果您想建立一些很酷的東西,請加入Discord社群。
{% 嵌入 https://dev.to/copilotkit %}
原文出處:https://dev.to/copilotkit/automate-90-of-your-work-with-ai-agents-real-examples-code-inside-46ke