[Swarm] 上下文變量 | 接入function功能調用 | Mcp

第3章:上下文變量

歡迎回到swarm

在前兩章中,我們學習了作為對話指揮者的Swarm框架和具備指令與技能的專用AI角色智能體。(智能體就相當于是給用戶問題 已經寫好了的提示詞,在用戶提問時自動加入,以此來給用戶更好的體驗)

但若智能體需要記住用戶信息或對話狀態呢?

  • 例如用戶姓名、賬戶類型或之前提到的偏好。

  • AI模型本身不具備跨輪次完美記憶能力,將所有信息塞入對話歷史又會導致冗長混亂。

這正是**上下文變量(Context Variables)**的用武之地!

什么是上下文變量?

想象一個所有對話參與者都能查看和更新的共享白板——這正是swarm中上下文變量的本質。

它本質上是一個Python字典(dict),伴隨對話流程傳遞,可存儲當前交互相關的動態信息。

具體關系如下:

  • Swarm框架:對話指揮者,持有這塊白板
  • 智能體:演奏家,通過查看白板(讀取上下文)決定如何演奏(響應或使用工具)
  • 功能:演奏家的技能,執行時可讀取白板內容,也可寫入新信息(更新上下文)

這使得智能體和功能能夠共享并訪問重要信息,而無需將這些信息塞入主對話消息中。

( 有點類似于 操作系統對于線程的共享內存的設計

為何使用上下文變量?

上下文變量解決了跨AI輪次共享動態狀態的需求,確保swarm應用的不同組件(智能體與功能)能可靠訪問共享數據。

典型應用場景包括:

  • 用戶信息存儲:姓名、ID、登錄狀態、偏好設置等
  • 對話狀態追蹤:流程步驟完成狀態、當前主題、已收集信息(如天氣查詢地點)
  • 功能數據傳遞:為外部系統交互功能提供必要數據(賬戶ID或收集的詳細信息)

讓我們通過個性化問候示例演示基礎用法。

基礎應用:個性化問候

我們希望智能體輸出"你好,[用戶姓名]!"而非通用問候。通過上下文變量存儲姓名,并在智能體指令中動態引用。

首先定義接受context_variables參數的指令函數:

from swarm import Agent, Swarm# 使用上下文變量的指令函數
def instructions(context_variables):# 從上下文字典獲取姓名,默認值為"用戶"name = context_variables.get("name", "用戶")# 返回動態生成的指令return f"你是一位樂于助人的助手。請禮貌問候用戶,若知道姓名請使用。已知用戶姓名為{name}。"

該函數通過.get("name", "用戶")安全獲取姓名,未找到時使用默認值。隨后構建動態指令字符串。

創建智能體時傳入該函數:

# 創建使用動態指令的智能體
greeting_agent = Agent(name="問候智能體",instructions=instructions, # 傳入指令函數
)

運行Swarm.run()時提供初始上下文字典:

# 創建Swarm實例
client = Swarm()# 定義初始上下文(包含姓名)
user_context = {"name": "張三"}# 定義初始消息
messages = [{"role": "user", "content": "你好!"}]# 運行對話并傳遞上下文
response = client.run(agent=greeting_agent,messages=messages,context_variables=user_context # 傳遞上下文字典
)# 打印AI響應
print(response.messages[-1]['content'])

執行時,Swarmuser_context字典傳遞給指令函數,生成包含"已知用戶姓名為張三"的指令。AI接收該指令和用戶消息后,可能響應:

你好張三!今天有什么可以幫您的?

若未提供上下文或使用不同姓名,響應將相應變化,體現上下文的動態特性。

上下文變量與功能結合

上下文變量在功能調用中同樣關鍵。以下示例預覽功能如何利用上下文(功能細節將在第四章詳述):

假設存在需要user_idnameprint_account_details功能:

# 需要上下文變量的功能示例
def print_account_details(context_variables: dict):# 從上下文獲取用戶ID和姓名user_id = context_variables.get("user_id")name = context_variables.get("name")print(f"賬戶詳情:{name} (ID: {user_id})")# 功能應返回字符串或Result對象return "成功獲取賬戶詳情。"

注意該函數顯式接受context_variables參數。

將該功能加入智能體定義:

# 創建具備動態指令和功能的智能體
account_agent = Agent(name="賬戶智能體",instructions=instructions, # 可復用相同指令函數functions=[print_account_details], # 添加功能
)

當用戶請求"顯示我的賬戶詳情"時,AI可能調用該功能。Swarm執行時會自動傳遞當前上下文:

# 定義相同上下文
user_context = {"name": "李四", "user_id": 456}# 新用戶消息請求賬戶詳情
messages = [{"role": "user", "content": "顯示我的賬戶詳情!"}]# 攜帶上下文運行
response = client.run(messages=messages,agent=account_agent,context_variables=user_context, # 再次傳遞上下文
)# AI響應可能包含功能調用結果
print(response.messages[-1]["content"])

AI調用print_account_details時,Swarm檢測功能需要context_variables,自動傳遞包含"李四"和456的上下文字典,供功能使用。

運行機制:Swarm如何管理上下文

Swarm類負責在整個對話輪次中管理上下文字典。核心流程如下:

在這里插入圖片描述

從代碼層面看,swarm/core.py的關鍵處理邏輯如下:

Swarm.run方法初始化并傳遞上下文字典:

# File: swarm/core.py (簡化版run方法)
def run(...):active_agent = agentcontext_variables = copy.deepcopy(context_variables)  # 創建初始副本while ...:  # 對話循環completion = self.get_chat_completion(agent=active_agent,context_variables=context_variables,  # 傳遞上下文...)if message.tool_calls:# 處理功能調用時更新上下文context_variables.update(partial_response.context_variables)return Response(context_variables=context_variables)  # 返回最終上下文

get_chat_completion方法處理動態指令:

# File: swarm/core.py (簡化版get_chat_completion)
def get_chat_completion(...):if callable(agent.instructions):instructions = agent.instructions(context_variables)  # 動態生成指令...

handle_tool_calls方法執行功能時注入上下文:

# File: swarm/core.py (簡化版handle_tool_calls)
def handle_tool_calls(...):if __CTX_VARS_NAME__ in func.__code__.co_varnames:args[__CTX_VARS_NAME__] = context_variables  # 向功能注入上下文raw_result = func(**args)  # 執行功能

小結

上下文變量提供了跨輪次狀態維護動態信息共享的強大能力。

通過Swarm框架管理的字典結構,我們能夠:

  • 在運行Swarm時定義初始上下文
  • 創建基于上下文動態調整的智能體指令
  • 理解上下文如何傳遞給被調用的功能
  • 掌握Swarm內部傳遞和管理上下文的機制

現在我們已經掌握如何賦予智能體動態響應能力,接下來將深入探索智能體執行具體操作的**功能(Function)**機制!

第四章:功能


第4章:功能

至此我們已經了解:Swarm框架是對話指揮者(第1章),智能體是具備指令配置的AI角色(第2章),而上下文變量助力信息共享(第3章)。

但若智能體需要執行除對話外的實際操作呢

例如查詢天氣、獲取股價、發送郵件或訪問數據庫?AI模型本身無法直接完成這些操作。

這正是**功能(Function)**的用武之地!

前文傳送:MCP Servers

什么是swarm中的功能?

將智能體再次類比為樂手:他們遵循指令(Agent.instructions),同時具備演奏技能。在swarm中,這些"技能"即功能

  • swarm中的功能 本質上是用戶編寫的標準Python函數。將功能賦予智能體后,基于用戶請求和對話歷史,AI模型可自主決策*何時如何*調用這些Python函數。

  • swarm充當橋梁:將Python函數定義自動轉換為AI可理解的格式(JSON schema)。

  • 當AI決策"調用"功能時(實為請求swarm執行函數),swarm攔截請求,定位對應Python函數執行,并將結果反饋給AI。

這如同指揮家(Swarm框架)理解樂曲需要特定技法,指示樂手(智能體)執行技法(功能),并將產生的音效融入整體演奏。

為何使用功能?

功能賦予AI系統與現實世界交互的能力,突破純文本生成的局限。典型應用場景包括:

  • 獲取實時數據(天氣、股價、新聞)
  • 執行計算任務
  • 訪問或修改外部系統(數據庫、API、日歷)
  • 發送通信(郵件、消息)

以天氣查詢為例:未配備天氣功能的AI只能回應"無法獲取天氣信息";而具備該功能的AI可理解請求,調用功能獲取數據后提供真實天氣狀況。

如何定義swarm功能

功能定義與常規Python函數類似,但需注意以下swarm及AI模型關注要素:

  1. 名稱:函數名(get_current_weather)作為AI的調用標識
  2. 文檔字符串:函數說明("""獲取指定地點當前天氣...""")用于AI理解功能用途,需簡明扼要
  3. 參數:函數參數(location: str)定義所需信息,類型提示(: str)輔助生成正確schema。AI將嘗試從用戶請求提取必要信息(如地點)作為參數

天氣功能示例:

# 定義獲取天氣數據的Python函數
def get_current_weather(location: str):"""獲取指定地點的當前天氣"""# 實際應用中應調用天氣API# 本例返回靜態字符串print(f"(調用get_current_weather獲取{location}天氣)") # 可選:觀察調用時機if "london" in location.lower():return "倫敦當前為雨天"elif "paris" in location.lower():return "巴黎當前為晴天"else:return f"{location}天氣數據暫不可用"

該標準Python函數的關鍵要素為名稱、文檔字符串及參數。swarm通過function_to_json工具(自動調用,無需手動操作)將其轉換為AI可理解的格式。

為智能體添加功能

定義Python函數后,通過functions列表賦予智能體:

from swarm import Agent# 先定義功能(如上所示)
def get_current_weather(location: str):"""獲取指定地點的當前天氣"""print(f"(調用get_current_weather獲取{location}天氣)")if "london" in location.lower():return "倫敦當前為雨天"elif "paris" in location.lower():return "巴黎當前為晴天"else:return f"{location}天氣數據暫不可用"# 創建智能體并賦予功能
weather_agent = Agent(name="天氣智能體",instructions="您是專業的天氣助手,請使用工具查詢天氣",functions=[get_current_weather] # 添加至功能列表
)

現在weather_agent已具備get_current_weather功能。當swarm使用該智能體與AI交互時,將向AI模型通報此可用功能(基于Python函數生成的JSON schema)。

使用帶功能的智能體

完整示例如下,展示Swarm框架如何協調功能調用:

from swarm import Swarm, Agent# 1. 定義功能
def get_current_weather(location: str):"""獲取指定地點的當前天氣"""print(f"(調用get_current_weather獲取{location}天氣)")if "london" in location.lower():return "倫敦當前為雨天"elif "paris" in location.lower():return "巴黎當前為晴天"else:return f"{location}天氣數據暫不可用"# 2. 創建帶功能的智能體
weather_agent = Agent(name="天氣智能體",instructions="您是專業的天氣助手,請使用工具查詢天氣",functions=[get_current_weather]
)# 3. 創建Swarm實例
client = Swarm() # 需配置OPENAI_API_KEY環境變量# 4. 定義用戶消息
messages = [{"role": "user", "content": "巴黎天氣如何?"}]# 5. 運行對話
print("啟動Swarm...")
response = client.run(agent=weather_agent, messages=messages, debug=True) # 啟用調試模式查看內部流程# 6. 輸出最終響應
print("\nAI最終響應:")
print(response.messages[-1]['content'])

啟用debug=True時,內部流程如下:

  1. 調用client.run()
  2. Swarm框架啟動weather_agent對話輪次
  3. 向AI模型通報get_current_weather功能及其參數
  4. AI接收用戶消息(“巴黎天氣如何?”)及功能信息
  5. AI解析需調用get_current_weather功能,提取"巴黎"作為location參數
  6. AI返回"工具調用"特殊消息,請求執行get_current_weather并附帶{"location": "Paris"}
  7. Swarm框架接收工具調用請求
  8. 查找智能體對應的Python函數
  9. 執行get_current_weather(location="Paris"),可能看到控制臺打印(調用get_current_weather獲取Paris天氣)
  10. 函數返回"巴黎當前為晴天"
  11. Swarm框架將結果作為"工具結果"消息加入對話歷史
  12. AI接收工具結果并生成自然語言響應
  13. AI返回最終文本響應(“巴黎當前天氣晴朗”)
  14. Swarm框架將最終響應封裝為響應對象返回

啟用調試模式時輸出示例:

在這里插入圖片描述

該流程展示swarm如何將自定義Python代碼無縫集成至AI工作流。

功能與上下文變量

如第3章所述,功能可通過context_variables參數訪問共享狀態:

# 使用上下文變量的功能
def log_user_action(action: str, context_variables: dict):"""記錄用戶操作日志"""user_id = context_variables.get("user_id", "未知用戶")print(f"用戶{user_id}執行操作:{action}")return "操作已記錄"# 創建帶日志功能的智能體
agent_with_logger = Agent(name="日志智能體",instructions="記錄用戶請求日志",functions=[log_user_action]
)# 攜帶上下文運行
user_context = {"user_id": 456}
messages = [{"role": "user", "content": "我已更新個人資料"}]client = Swarm()
response = client.run(agent=agent_with_logger,messages=messages,context_variables=user_context, # 傳遞上下文debug=True
)
# 控制臺將輸出"用戶456執行操作:更新個人資料"

AI調用log_user_action時,swarm自動傳遞當前上下文。

注意:無需在功能描述中聲明context_variables參數,swarm在生成schema時會自動隱藏該參數。

功能還可通過返回結果對象更新上下文變量,該機制將在下一章詳解!

內部機制:功能調用流程

功能調用流程解析(聚焦swarm協調作用):

在這里插入圖片描述

Swarm類核心處理邏輯:

  1. 調用AI時生成功能schema:
# 摘自swarm/core.py(簡化)
def get_chat_completion(...):tools = [function_to_json(f) for f in agent.functions] # 生成JSON schemacreate_params = {"tools": tools or None, # 添加至API調用參數# ...其他參數...}return self.client.chat.completions.create(**create_params)
  1. 處理AI返回的工具調用請求:
# 摘自swarm/core.py(簡化run方法)
if message.tool_calls and execute_tools:partial_response = self.handle_tool_calls(...) # 調用處理器history.extend(partial_response.messages) # 添加工具結果context_variables.update(partial_response.context_variables) # 更新上下文
  1. 執行功能并處理結果:
# 摘自swarm/core.py(簡化handle_tool_calls方法)
def handle_tool_calls(...):func = function_map[name] # 定位Python函數if __CTX_VARS_NAME__ in func.__code__.co_varnames:args[__CTX_VARS_NAME__] = context_variables # 注入上下文raw_result = func(**args) # 執行用戶函數# 處理結果并更新響應partial_response.messages.append({"role": "tool","content": result.value,})

小結

  • 掌握功能是賦予智能體現實交互能力的核心。
  • 通過定義Python函數并添加至智能體的functions列表,可擴展AI的實用技能。
  • swarm框架自動處理AI通信,將Python代碼轉換為模型可理解的描述,并在AI決策調用時執行對應函數。

同時,我們了解到上下文變量如何賦能功能訪問共享狀態。但功能執行后如何反饋狀態更新?這正是結果對象的職責,將在下一章深入探討!

第5章:結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88061.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Unity開發】Unity實現第一人稱視角與第三人稱視角切換功能

一、效果展示 第三人稱視角:固定攝像機,無任何操作 第一人稱視角:用戶可以通過wsad進行前后左右移動,qe進行上升下降操作 不同視角之間切換會有一個過渡動畫,切換第一視角的初始位置始終為原點(0,0,0&am…

2025全球數字經濟大會—云智算安全論壇暨第三屆“SecGo論壇”成功召開!共筑安全新生態

2025年7月3日,由全球數字經濟大會組委會主辦,中國信息通信研究院、中國通信標準化協會承辦的全球數字經濟大會—云智算安全論壇暨第三屆“SecGo論壇”在京召開。北京市經濟和信息化局副局長顧瑾栩、中國通信標準化協會副理事長兼秘書長代曉慧、中國信通院…

KingbaseES聚焦產品上線:金倉數據庫在線體驗平臺上線,開啟數據庫實踐新征程

KingbaseES聚焦產品上線:金倉數據庫在線體驗平臺上線,開啟數據庫實踐新征程KingbaseES 在線體驗平臺是為數據庫使用者、開發者、架構師及 DBA 打造的輕量化實踐平臺,無需本地安裝數據庫環境,通過瀏覽器即可快速上手,降…

LLMs之DeepSeek:AI模型市場深度分析:DeepSeek的挑戰與機遇,模型市場份額、Token經濟學與未來發展

LLMs之DeepSeek:AI模型市場深度分析:DeepSeek的挑戰與機遇,模型市場份額、Token經濟學與未來發展 導讀:該文章主要分析了中國大語言模型DeepSeek R1發布150天后的市場表現、Token經濟學的影響以及AI模型市場的競爭格局。文章指出&…

服裝零售企業跨區域運營難題破解方案

在服裝零售行業,本地化業務系統因承載庫存、銷售等核心數據,成為眾多企業的選擇。然而對于門店分布廣、規模較大的服裝銷售商而言,總部系統與各地門店的遠程連接卻面臨挑戰:員工遠程辦公效率低、POS機數據同步滯后、跨區域監管難度…

- 思考小記

對于 分布式系統,我還是抱有敬畏之心的,因為其內容過于龐大;我在學習基礎編程的時候走過一個最大的彎路就是過度追求技術而忽視了基礎編碼能力,當時在學習springboot的時候,覺得那些新內容都是那么新奇高大上&#xff…

裝備制造數字孿生底座平臺

在《中國制造2025》和《“十四五”智能制造發展規劃》的推動下,數字孿生技術被7次重點提及,成為裝備制造業智能化升級的核心戰略。從航空航天到重型機械,從設計驗證到運維優化,數字孿生底座平臺正通過“虛實映射”與“實時交互”&…

Redis構建緩存服務器

環境信息: redis-master----192.168.12.135 redis-slave-1-----192.168.12.136 redis-slave-2-----192.168.12.137 單機版Redis 安裝Redis yum install -y gcc make jemalloc jemalloc-devel gcc-c wget tcl yum groupinstall -y "Development Tools" wge…

vscode python debugger關閉編輯器內的變量值自動顯示

vscode 的python debugger調試器的最新版本2025.8.0, 會默認把變量的值顯示出來, 如下圖所示關閉的方法: 打開vscode的settings.json, 左下角點擊齒輪按鈕, 選擇setting(設置), 然后在右上角三個按鈕最中間的那個(open setting json), 輸入 "debug.inlineValues": &q…

App爬蟲工具篇-appium配置

接著上篇文章App爬蟲工具篇-Appium安裝,安裝好了之后,還是不夠的,要讓其能夠驅動手機端,還需要配置。這節課就深入說說如何配置Appium。 安卓手機 如果我們要使用 Android 設備做 App 抓取的話,還需要下載和配置 Android SDK,這里推薦直接安裝 Android Studio,其下載地…

SpringAI系列 - 基于Spring AI 1.0.0 的AI助手實現示例

目錄 一、基于 Spring AI 1.0.0 的AI助手實現示例二、AI助手架構設計2.1 系統范圍與上下文 C12.2 容器圖 C22.3 AI助手組件圖 C3三、注意事項四、快速啟動五、如何啟用MCP一、基于 Spring AI 1.0.0 的AI助手實現示例 結合前文系列的介紹,本專欄提供了一個基于Spring AI 1.0.0…

電池預測 | 第33講 Matlab基于CNN-LSTM-Attention的鋰電池剩余壽命預測,附鋰電池最新文章匯集

電池預測 | 第33講 Matlab基于CNN-LSTM-Attention的鋰電池剩余壽命預測,附鋰電池最新文章匯集 目錄電池預測 | 第33講 Matlab基于CNN-LSTM-Attention的鋰電池剩余壽命預測,附鋰電池最新文章匯集預測效果基本描述程序設計參考資料源碼地址: 電…

軟考(軟件設計師)數據庫原理-SQL

一、SQL基本數據類型 SQL 數據類型速查表類別數據類型說明范圍/示例適用場景整數類型INT / INTEGER標準整數類型-2 到 2-1 (-2,147,483,648 到 2,147,483,647)ID、年齡、數量等SMALLINT小范圍整數-32,768 到 32,767小范圍數值BIGINT大范圍整數-2? 到 2?-1大額訂單號、時間戳T…

docker 安裝數據集成平臺 Apache SeaTunnel 服務

獲取官方鏡像 從 Docker Hub 上拉取最新的 Apache SeaTunnel 鏡像: docker pull apache/seatunnel:latest創建目錄 sudo mkdir -p /data/{conf,logs} # 需要 root 權限創建 /data 目錄 sudo chown -R $USER:$USER /data # 將目錄權限給當前用戶(可選&a…

數據結構:數組:線性查找(Linear Search)

目錄 什么是線性查找? 時間復雜度分析 🧠 線性查找的優化 方法一:Move to Front(哨兵) 方法二:Transportation(向前交換一步) 什么是線性查找? 我們先問&#xf…

石子入水波紋效果:UV擾動著色器實現

利用UV坐標擾動來模擬水面是一種常見且有效的技術手段,上述效果主要通過對水面紋理的UV坐標進行動態偏移或擾動,從而模擬水波的流動和波紋效果。資源下載具體實現和原理如下: 基本思路:通過對水面紋理的UV坐標加上時間相關的擾動函數(如正弦波、余弦波、噪聲函數等),使紋…

Java Lambda 類型推斷詳解:filter() 方法與 Predicate<? super T>

一、問題核心解析1. 代碼示例分析List<String> strings Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered strings.stream().filter(string -> !str…

XSS:xss.haozi.me靶場練習

超鏈接:alert(1) 知識點: html <&#xff01;--被注釋的內容--> <&#xff01;--被注釋的內容!--> php /*被注釋的內容*/ //被注釋的內容 javascript /*被注釋的內容*/ //被注釋的內容 MySQL …

ubuntu 20.04 安裝中文輸入法 (sougou pin yin)

安裝搜狗輸入法包 參照官方指南完成 如果提示沒有找到相關依賴&#xff0c;添加一下源&#xff1a; sudo add-apt-repository universe sudo apt update重啟。

(DETR)End-to-End Object Detection with Transformers論文精讀(逐段解析)

(DETR)End-to-End Object Detection with Transformers論文精讀&#xff08;逐段解析&#xff09; 論文地址&#xff1a;https://arxiv.org/abs/2005.12872 CVPR 2020 Facebook AI 發布 Abstract. We present a new method that views object detection as a direct set pred…