語言模型的應用不僅限於程式碼生成和補全,結合LangChain框架,我們可以建立能夠「像演算法一樣思考」的人工智慧代理,解決更複雜的問題。
初始化Python代理
首先,我們需要設定一個Python代理,它將利用Python REPL(Read-Eval-Print Loop)工具執行Python命令:
import os
from dotenv import load_dotenv
from langchain.agents.agent_types import AgentType
from langchain.chat_models import ChatOpenAI
from langchain_experimental.agents.agent_toolkits.python.base import create_python_agent
from langchain_experimental.tools import PythonREPLTool
load_dotenv()
openai_api_key = os.environ['OPENAI_API_KEY']
model = ChatOpenAI(temperature=0, model="gpt-3.5-turbo-0613")
agent_executor = create_python_agent(
llm=model,
tool=PythonREPLTool(),
verbose=True,
agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
)
這段程式碼設定了一個Python代理,它將使用OpenAI的GPT-3.5-turbo模型和Python REPL工具。關鍵元件包括:
load_dotenv()
- 載入環境變數,包括API金鑰ChatOpenAI
- 初始化OpenAI聊天模型,溫度設為0以獲得確定性輸出create_python_agent
- 建立一個能夠執行Python程式碼的代理PythonREPLTool()
- 提供Python直譯器功能的工具AgentType.ZERO_SHOT_REACT_DESCRIPTION
- 設定代理的行為模式,使其能夠根據描述做出反應
這個設定允許模型不僅理解問題,還能編寫和執行Python程式碼來解決這些問題。
檢查代理的提示範本
在使用代理之前,瞭解其預設提示範本是很有價值的:
print(agent_executor.agent.llm_chain.prompt.template)
這會顯示代理使用的預設提示範本,幫助我們理解它的工作方式和能力範圍。
使用Python代理解決實際問題
讓我們看這個Python代理如何解決各種型別的問題。
資料視覺化範例
首先,讓我們要求代理根據籃球運動員的資料建立一個散點圖:
query = """
在一場籃球比賽中,我們有以下球員資料:
- 球員A:38分,10個籃板,7次助攻
- 球員B:28分,9個籃板,6次助攻
- 球員C:19分,6個籃板,3次助攻
- 球員D:12分,4個籃板,2次助攻
- 球員E:7分,2個籃板,1次助攻
請使用Seaborn的talk模式建立一個散點圖,其中y軸代表得分,x軸代表籃板數,使用'o'作為標記。
另外,請用球員名稱標記每個點,並將標題設定為"Team Players"。
"""
agent_executor.run(query)
代理會生成並執行以下Python程式碼:
import seaborn as sns
import matplotlib.pyplot as plt
# 球員資料
players = ['球員A', '球員B', '球員C', '球員D', '球員E']
points = [38, 28, 19, 12, 7]
rebounds = [10, 9, 6, 4, 2]
# 建立散點圖
sns.scatterplot(x=rebounds, y=points, marker='o')
# 用球員名稱標記每個點
for i, player in enumerate(players):
plt.text(rebounds[i], points[i], player, ha='center', va='bottom')
# 設定標題
plt.title('Team Players')
# 顯示圖表
plt.show()
這段程式碼展示了代理如何處理資料視覺化任務:
- 首先匯入必要的函式庫(seaborn和matplotlib)
- 定義球員資料(名稱、得分和籃板)
- 使用seaborn的scatterplot函式建立散點圖
- 透過遍歷球員列表,為每個資料點增加文字標籤
- 設定圖表標題並顯示結果
這個例子展示了代理能夠理解自然語言請求,並將其轉換為完整的Python程式碼來建立視覺化。
機器學習模型訓練與預測
接下來,讓我們看一個更複雜的例子,要求代理設計並訓練一個迴歸模型來預測房價:
query = """
我想根據以下訊息預測房屋價格:
- 房間數量
- 浴室數量
- 房屋面積(平方米)
請設計並訓練一個迴歸模型來預測房屋價格。生成並使用合成資料來訓練模型。
模型訓練完成後,請告訴我具有以下特徵的房屋價格:
- 2個房間
- 1個浴室
- 100平方米
"""
agent_executor.run(query)
代理會生成並執行以下程式碼:
import numpy as np
from sklearn.linear_model import LinearRegression
# 生成合成資料
np.random.seed(0)
X = np.random.rand(100, 3) # 100個房屋,3個特徵:房間、浴室、面積
y = 100000 * X[:, 0] + 200000 * X[:, 1] + 300000 * X[:, 2] + 50000 # 價格 = 10萬*房間 + 20萬*浴室 + 30萬*面積 + 5萬
# 訓練迴歸模型
model = LinearRegression()
model.fit(X, y)
# 預測給定特徵的房屋價格
features = np.array([[2, 1, 100]])
predicted_price = model.predict(features)
predicted_price
執行後,代理會告訴我們:「具有2個房間、1個浴室和100平方米的房屋價格約為$550,000。」
這個例子展示了代理如何處理機器學習任務:
- 匯入必要的函式庫(numpy和sklearn)
- 生成合成訓練資料,其中X包含三個特徵(房間數、浴室數和麵積),y是目標價格
- 定義價格計算公式:10萬房間 + 20萬浴室 + 30萬*面積 + 5萬基礎價格
- 初始化並訓練LinearRegression模型
- 使用訓練好的模型預測指定特徵的房屋價格
這個例子展示了代理不僅能夠理解機器學習概念,還能夠實際實作並應用這些概念來解決預測問題。
解決最佳化問題:智慧建築HVAC系統設定最佳化
讓我們看一個更複雜的最佳化問題,涉及智慧建築中的HVAC(暖通空調)系統設定點最佳化:
query = """
**問題**:
你的任務是最佳化智慧建築中的HVAC設定點,以最小化能源成本,同時確保居住者舒適。該建築有三個區域,你可以調整每個區域的溫度設定點。每個區域的能源消耗成本函式定義如下:
- 區域1:能源成本 = 每小時每度$0.05
- 區域2:能源成本 = 每小時每度$0.07
- 區域3:能源成本 = 每小時每度$0.06
你需要找到三個區域的最佳溫度設定點組合,以最小化能源成本,同時保持舒適溫度。各區域的初始溫度如下:
- 區域1:72°F
- 區域2:75°F
- 區域3:70°F
各區域的舒適溫度範圍如下:
- 區域1:70°F至74°F
- 區域2:73°F至77°F
- 區域3:68°F至72°F
**問題**:
透過在各自舒適範圍內調整三個區域的溫度設定點,你能達到的最低總能源成本(每小時美元)是多少?
"""
這個問題要求代理找出在三個區域的舒適溫度範圍內,能夠最小化總能源成本的溫度設定組合。
面對這樣的最佳化問題,代理會使用Python的最佳化工具來尋找解決方案。例如,它可能會使用線性規劃或約束最佳化方法來找到滿足所有條件的最優解。
在這種情況下,代理需要:
- 瞭解問題中的變數(每個區域的溫度設定)
- 理解約束條件(溫度必須在舒適範圍內)
- 構建目標函式(最小化總能源成本)
- 使用適當的最佳化演算法求解
這種複雜的最佳化問題展示了LLM結合Python執行環境的強大能力。透過Python REPL工具,代理可以使用scipy、pulp等專業最佳化函式庫來解決這類別問題,而不僅限於簡單的程式碼生成。
LLM作為開發者的人工智慧助手
透過以上例子,我們可以看到大模型語言和LangChain框架如何成為開發者的強大助手。這些工具不僅能夠生成和補全程式碼,還能夠理解複雜問題並提供解決方案。
在我的開發實踐中,我發現這些工具特別適合以下場景:
- 快速原型開發 - 迅速生成初始程式碼框架,加速開發過程
- 學習新技術 - 透過生成範例程式碼和解釋來學習不熟悉的函式庫或框架
- 解決複雜問題 - 利用LLM的推理能力和Python執行環境解決最佳化、資料分析等複雜問題
- 程式碼重構和改進 - 取得重構建議或改進現有程式碼的方法
雖然這些工具極為強大,但我仍然建議開發者保持批判思考,審核和理解生成的程式碼,並在必要時進行修改和最佳化。AI生成的程式碼應該作為起點或輔
AI程式碼執行器:從理論到實踐
在AI代理的世界裡,能夠自動執行程式碼的功能已成為革命性的進步。透過結合大模型語言與程式碼執行環境,我們現在能夠建立可以理解需求、編寫程式碼並執行它的AI助手。這種技術不僅大幅提升了開發者的工作效率,也為非技術人員提供了一個強大的工具來處理複雜的資料分析任務。
在這篇文章中,我將探討兩種主要的程式碼執行工具:Python REPL代理和程式碼直譯器API。這兩種工具各有特色,適用於不同的場景,但都在AI輔助程式開發領域展現出強大的潛力。
Python REPL代理的最佳化問題解決能力
讓我們先看一個使用Python REPL代理解決最佳化問題的例子。在這個例子中,AI代理被要求解決一個人工智慧建築的溫度最佳化問題:
import scipy.optimize as opt
# 定義成本函式
def cost_function(x):
zone1_temp = x[0]
zone2_temp = x[1]
zone3_temp = x[2]
# 計算每個區域的能源成本
zone1_cost = 0.05 * abs(zone1_temp - 72)
zone2_cost = 0.07 * abs(zone2_temp - 75)
zone3_cost = 0.06 * abs(zone3_temp - 70)
# 計算總成本
total_cost = zone1_cost + zone2_cost + zone3_cost
return total_cost
# 定義約束條件
# 溫度範圍限制
bounds = [(68, 76), (70, 78), (65, 72)]
# 使用最小化函式找出最佳溫度設定
result = opt.minimize(cost_function, [72, 75, 70], bounds=bounds)
# 輸出結果
print("最佳溫度設定:")
print(f"區域1: {result.x[0]:.1f}°F")
print(f"區域2: {result.x[1]:.1f}°F")
print(f"區域3: {result.x[2]:.1f}°F")
print(f"最低每小時能源成本: ${cost_function(result.x):.2f}")
這段程式碼展示瞭如何使用scipy.optimize
模組解決一個多變數最佳化問題。這裡的情境是最佳化三個不同區域的溫度設定,以最小化總能源成本。
- 首先定義了一個
cost_function
函式,它接收三個溫度值作為輸入。 - 對每個區域,成本是根據實際溫度與理想溫度的差異計算的,每個區域有不同的成本係數(0.05, 0.07, 0.06)。
- 使用
bounds
引數設定每個區域溫度的允許範圍。 - 透過
opt.minimize
函式尋找最小化總成本的溫度組合。 - 最終輸出最佳溫度設定和對應的最低能源成本。
這種方法在實際應用中非常有價值,例如在人工智慧建築管理系統中,可以根據不同區域的需求和能源價格動態調整溫度,達到最佳的舒適度與成本平衡。
AI代理成功地解決了這個最佳化問題,找出了在特定約束條件下的最低能源成本:每小時$0.15。這個結果顯示了AI代理能夠有效地應用數學最佳化技術來解決實際問題。
最佳化問題的廣泛應用場景
這種最佳化方法不僅限於溫度控制,還可以應用於許多其他領域:
供應鏈最佳化:最小化運輸成本,減少庫存,確保及時交付。
投資組合最佳化:構建能最大化回報同時管理風險的投資組合。
路線規劃:為物流車輛、緊急服務或共乘平台規劃最佳路線,減少行駛時間和燃油消耗。
製造流程最佳化:最佳化製造流程以減少浪費、能源消耗和生產成本,同時維持產品質。
醫療資源分配:在疫情或其他醫療危機期間高效分配醫院床位、醫護人員和裝置。
在處理這些最佳化問題時,我發現關鍵在於正確定義目標函式和約束條件。一個精心設計的目標函式能夠準確捕捉問題的本質,而合理的約束條件則確保解決方案在現實中可行。
Python REPL代理的侷限性
雖然Python REPL代理功能強大,但它也有一些侷限性:
- 它不允許進行檔案輸入輸出操作,無法讀寫本地檔案系統。
- 每次執行後變數會被遺忘,無法在模型回應後追蹤已初始化的變數。
這些限制在某些複雜的應用場景中可能會造成困擾。例如,當需要處理大型資料集或需要持續追蹤狀態變化時,這些限制就會變得明顯。為了克服這些限制,我們可以轉向根據LangChain代理構建的開放原始碼專案:程式碼直譯器API。
程式碼直譯器API的強大功能
“程式碼直譯器"這個名稱最初由OpenAI提出,指的是為ChatGPT開發的外掛。這個外掛允許ChatGPT編寫和執行各種程式語言的程式碼,從而能夠執行計算、資料分析和生成視覺化圖表。
雖然OpenAI的程式碼直譯器目前仍未提供API,但已有一些開放原始碼專案採用了這一概念。這裡我們將使用Shroominic開發的codeinterpreterapi
,可透過pip安裝:
pip install codeinterpreterapi
程式碼直譯器API的核心特點
程式碼直譯器API建立在LangChain的OpenAIFunctionsAgent
之上。這種代理能夠使用支援OpenAI函式的模型來回應使用者提示,並可以使用一系列工具與使用者互動。
與Python REPL工具相比,程式碼直譯器API最大的區別在於它可以實際執行它生成的程式碼。當一個程式碼直譯器工作階段啟動時,會在你的裝置上啟動一個微型的Jupyter Kernel,這要歸功於名為CodeBox的底層Python執行環境。
實際應用案例:COVID-19資料視覺化
讓我們透過一個例項來瞭解程式碼直譯器API的功能。以下是如何使用它生成COVID-19案例在特定時間範圍內的
from codeinterpreterapi import CodeInterpreterSession
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.environ['OPENAI_API_KEY']
# 建立工作階段
async with CodeInterpreterSession() as session:
# 根據使用者輸入生成回應
response = await session.generate_response(
"生成2020年3月至6月COVID-19演變的圖表,從網路取得資料。"
)
# 輸出回應
print("AI: ", response.content)
for file in response.files:
file.show_image()
這段程式碼展示瞭如何使用codeinterpreterapi
來執行資料分析和視覺化任務:
- 首先匯入必要的函式庫並設定環境變數,取得OpenAI API金鑰。
- 使用非同步上下文管理器建立一個
CodeInterpreterSession
工作階段。 - 透過
session.generate_response()
方法提交一個自然語言請求,要求生成COVID-19資料的圖表。 - 列印AI的文字回應,並顯示生成的影像檔案。
這個過程的強大之處在於使用者只需提供自然語言指令,不需要編寫任何資料取得、處理或視覺化的程式碼。AI代理會自動執行所有這些步驟,從網路取得資料,處理資料,並生成視覺化圖表。
在實際測試中,AI生成了一個顯示2020年3月至6月全球COVID-19確診病例數量的折線圖,並附帶瞭解釋性文字。這種功能非常適合非技術人員或資料分析師快速生成資料視覺化。
實時資料分析:股市指數圖表
程式碼直譯器API的另一個強大功能是能夠搜尋和分析實時資料。以下是如何生成S&P 500指數最近5天價格走勢的
async with CodeInterpreterSession() as session:
# 根據使用者輸入生成回應
response = await session.generate_response(
"生成過去5天S&P500指數價格的圖表。"
)
# 輸出回應
print("AI: ", response.content)
for file in response.files:
file.show_image()
這段程式碼與前一個例子類別似,但任務不同 - 這次我們要求AI取得並視覺化最近的股市資料:
- 使用相同的
CodeInterpreterSession
框架。 - 提交一個自然語言請求,要求生成S&P500指數最近5天的價格圖表。
- 輸出AI的回應並顯示生成的圖表。
這個例子展示了AI代理能夠取得實時金融資料並進行視覺化的能力。對於需要快速瞭解市場趨勢的投資者或分析師來說,這是一個非常有用的工具。
處理本地檔案:泰坦尼克號資料分析
程式碼直譯器API還可以處理本地檔案,使其能夠對特定資料執行分析。例如,可以使用從Kaggle下載的泰坦尼克號資料集進行分析。
泰坦尼克號資料集是機器學習領域的經典資料集,描述了泰坦尼克號上個別乘客的生存狀態。它包含乘客的年齡、性別、票價、艙位等級等訊息,是練習資料分析和預測模型的理想資料集。
透過將本地檔案提供給程式碼直譯器,我們可以要求它執行各種分析,從基本的探索性資料分析到複雜的機器學習模型訓練。
選擇合適的工具:Python REPL vs 程式碼直譯器API
在決定使用Python REPL還是程式碼直譯器API時,需要考慮以下幾點:
任務複雜性:對於簡單的計算或不需要持久化狀態的任務,Python REPL可能已經足夠。而對於需要處理檔案、儲存狀態或進行複雜分析的任務,程式碼直譯器API是更好的選擇。
資源需求:程式碼直譯器API需要更多的資源,因為它在後台執行一個完整的Jupyter Kernel。如果資源有限,Python REPL可能是更輕量級的選擇。
持久化需求:如果需要在多個查詢之間保持變數狀態或處理檔案,程式碼直譯器API是唯一的選擇。
視覺化需求:程式碼直譯器API在生成視覺化方面有明顯優勢,能夠直接生成和顯示圖表。
我在實際應用中發現,對於快速原型設計和探索性分析,程式碼直譯器API通常是更好的選擇,而Python REPL則更適合整合到更大的應用程式中,作為執行特定計算的工具。
深入理解OpenAIFunctionsAgent
程式碼直譯器API的核心是OpenAIFunctionsAgent,這是一種可以使用OpenAI函式能力來回應使用者提示的代理。這種代理由支援OpenAI函式的模型驅動,並可以存取一組工具來與使用者互動。
OpenAIFunctionsAgent還可以整合自定義函式。例如,你可以定義自定義函式來取得當前股票價格或使用Yahoo Finance取得股票表現。這種代理可以使用ReAct框
多模態應用:擴充套件 LLM 的感知邊界
在過去幾年中,大模型語言(LLM)徹底改變了我們與AI互動的方式。然而,儘管它們在處理和生成文字方面表現出色,但人類世界是多感官的——我們同時處理視覺、聽覺和文字訊息。這就是為什麼多模態AI系統成為下一個重要發展方向。
當我開始研究多模態應用時,發現這不僅是技術整合的問題,更是關於如何讓AI以更全面的方式理解和回應我們的世界。在本文中,我將分享如何構建能夠處理不同資料型別的多模態應用,並探討這一領域的前沿發展。
多模態與大型多模態模型(LMM)概述
多模態AI系統能夠處理和生成多種資料形式,包括文字、影像、語音和影片。這種能力使AI更接近人類的感知方式,也大擴充套件了其應用範圍。
從單模態到多模態的演進
傳統的AI模型通常專注於單一資料型別。例如:
- 語言模型處理文字
- 電腦視覺模型處理影像
- 語音處理模型分析音訊
大型多模態模型(LMM)則將這些能力整合在單一系統中。這不僅是簡單的模型組合,而是創造出能夠跨模態理解和推理的系統。
多模態的核心優勢
更自然的人機互動:使用者可以透過語音、影像或文字與系統交流,就像與人類交流一樣。
更全面的訊息處理:多模態系統能夠從不同資料源提取訊息,獲得更完整的理解。
應用場景擴充套件:從無障礙技術到內容分析,多模態系統能夠解決單模態系統難以處理的問題。
當我在設計多模態系統時,發現最大的挑戰不是技術本身,而是如何讓不同模態的訊息無縫融合。文字理解和影像識別是兩種完全不同的認知過程,如何讓它們協同工作是關鍵。
大型多模態模型(LMM)的新發展
多模態AI領域發展迅速,各大科技公司和研究機構都推出了自己的多模態模型。以下是一些值得關注的代表性模型:
GPT-4V (Vision)
OpenAI的GPT-4V將強大的語言理解能力與視覺處理相結合,能夠分析影像並提供根據影像內容的詳細回應。這使得使用者可以上載圖片並詢問相關問題,模型能夠「看到」影像並理解其中的內容。
GPT-4V的應用場景非常廣泛,從輔助視障人士描述影像,到幫助分析圖表資料,甚至能夠理解和解釋複雜的視覺笑話。
Claude 3 Opus
Anthropic的Claude 3 Opus是另一個強大的多模態模型,能夠處理文字和影像。它在視覺理解測試中表現優異,能夠從複雜圖表中提取資料,理解影像中的細節,甚至能夠分析和解釋手寫筆記。
Claude 3的視覺處理能力特別適合處理檔案、圖表和技術影像,使其在商業和研究應用中非常有價值。
Gemini (前身為Bard)
Google的Gemini是一個從設計之初就考慮多模態的大型模型。它能夠同時處理文字、影像、音訊和影片,並在這些不同模態間進行推理。
Gemini的一個獨特之處在於其「多模態推理」能力,即它不僅能夠處理不同型別的資料,還能夠在這些資料之間建立關聯和進行推理。例如,它可以看到一張照片,聽到相關的聲音,然後綜合這些訊息提供答案。
LLaVA (Large Language and Vision Assistant)
LLaVA是一個開放原始碼的多模態模型,結合了大模型語言與視覺處理能力。它的開放原始碼性質使得研究人員和開發者可以自由地調整和改進模型,推動了多模態AI的民主化。
LLaVA的架構相對簡單但功能強大,它使用視覺編碼器處理影像,然後將視覺特徵轉換為語言模型可以理解的形式。這種方法使得模型能夠有效地將視覺訊息與語言理解結合起來。
使用 LangChain 構建多模態代理
雖然專門設計的多模態模型功能強大,但我們同樣可以透過整合多個單模態模型來構建自己的多模態應用。在這一部分,我將展示如何使用 LangChain 框架來建立一個能夠處理文字、影像和音訊的多模態代理。
多模態代理的基本架構
多模態代理的核心理念是將不同的專業模型(每個專注於特定型別的資料)整合在一個統一的框架下,由一個中央控制器(通常是LLM)協調它們的工作。
這種架構有幾個關鍵元件:
- 中央控制器:通常是一個大模型語言,負責理解使用者意圖並協調其他模型的工作。
- 專業模型:處理特定型別資料的模型,如影像識別模型、語音轉文字模型等。
- 工具和API:提供額外功能的外部服務或工具。
- 整合框架:將所有元件連線在一起的系統,如LangChain。
實作示範:YouTube內容多模態分析
讓我們構建一個實際的多模態代理,能夠分析YouTube影片的內容。這個代理將能夠:
- 搜尋YouTube影片
- 下載影片的音訊
- 將語音轉換為文字
- 提取影片的關鍵幀
- 分析影像內容
- 綜合所有訊息提供全面分析
步驟1:設定環境與依賴
首先,我們需要安裝必要的Python套件:
# 安裝必要的套件
# pip install langchain python-dotenv huggingface_hub streamlit pytube openai youtube_search
然後,設定環境變數和API金鑰:
import os
from dotenv import load_dotenv
# 載入環境變數
load_dotenv()
# 設定API金鑰
os.environ['OPENAI_API_KEY'] = os.getenv('OPENAI_API_KEY')
os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.getenv('HUGGINGFACEHUB_API_TOKEN')
這段程式碼首先匯入必要的函式庫,包括Python的標準os模組和用於載入環境變數的dotenv函式庫。load_dotenv()
函式會從專案中的.env檔案讀取環境變數。接著,我們將OpenAI和Hugging Face的API金鑰設定為環境變數,這樣我們的應用就能使用這些服務。將API金鑰儲存在環境變數中是一種安全實踐,避免直接將敏感訊息硬編碼在原始碼中。
步驟2:設定YouTube搜尋和下載工具
接下來,我們建立用於搜尋和下載YouTube影片的工具:
from langchain.tools import BaseTool
from youtube_search import YoutubeSearch
from pytube import YouTube
import json
class YouTubeSearchTool(BaseTool):
name = "youtube_search"
description = "搜尋YouTube影片並回傳結果列表"
def _run(self, query: str) -> str:
results = YoutubeSearch(query, max_results=5).to_json()
return results
def _arun(self, query: str) -> str:
raise NotImplementedError("暫不支援非同步執行")
class YouTubeDownloadTool(BaseTool):
name = "youtube_download"
description = "下載指定YouTube影片的音訊"
def _run(self, url: str) -> str:
try:
# 建立YouTube物件
yt = YouTube(url)
# 取得音訊流
audio_stream = yt.streams.filter(only_audio=True).first()
# 下載音訊
output_file = audio_stream.download(output_path="./downloads/")
return f"成功下載音訊: {output_file}"
except Exception as e:
return f"下載失敗: {str(e)}"
def _arun(self, url: str) -> str:
raise NotImplementedError("暫不支援非同步執行")
這段程式碼定義了兩個自定義工具類別,都繼承自LangChain的BaseTool
:
YouTubeSearchTool
: 使用youtube_search函式庫在YouTube上搜尋影片。它接收查詢字元串,回傳包含最多5個結果的JSON格式資料。每個結果包含影片標題、URL、縮圖等訊息。YouTubeDownloadTool
: 使用pytube函式庫下載YouTube影片的音訊部分。它接收影片URL,建立YouTube物件,選擇僅音訊的流,然後下載到本地的downloads目錄。成功時回傳下載檔案路徑,失敗時回傳錯誤訊息。
兩個工具都定義了_run
方法用於同步執行,但都沒有實作_arun
方法(非同步執行),而是丟擲NotImplementedError異常。這些工具將作為我們多模態代理的能力元件,使其能夠搜尋和取得YouTube內容。
步驟3:設定語音轉文字和影像分析工具
現在,我們增加處理音訊和影像的工具:
import openai
from PIL import Image
class SpeechToTextTool(BaseTool):
name = "speech_to_text"
description = "將音訊檔案轉換為文字"
def _run(self, audio_file_path: str) -> str:
try:
with open(audio_file_path, "rb") as audio_file:
transcript = openai.Audio.transcribe(
model="whisper-1",
file=audio_file
)
return transcript["text"]
except Exception as e:
return f"轉錄失敗: {str(e)}"
def _arun(self, audio_file_path: str) -> str:
raise NotImplementedError("暫不支援非同步執行")
class ImageAnalysisTool(BaseTool):
name = "image_analysis"
description = "分析影像內容並提供描述"
def _run(self, image_path: str) -> str:
try:
# 載入影像
image = Image.open(image_path)
# 使用OpenAI的DALL-E模型分析影像
response = openai.Image.create_variation(
image=open(image_path, "rb"),
n=1,
size="1024x1024"
)
# 回傳影像URL和分析結果
return f"影像分析結果: {response['data'][0]['url']}"
except Exception as e:
return f"影像分析失敗: {str(e)}"
def _arun(self, image_path: str) -> str:
raise NotImplementedError("暫不支援非同步執行")
這段程式碼定義了兩個處理多媒體內容的工具:
SpeechToTextTool
: 使用OpenAI的Whisper模型將音訊檔案轉換為文字。它接收音訊檔案路徑,開啟檔案,呼叫OpenAI的Audio.transcribe API,然後回傳轉錄的文字。如果過程中發生錯誤,會回傳錯誤訊息。ImageAnalysisTool
: 使用OpenAI的影像處理能力分析影像內容。它接收影像檔案路徑,開啟影像,然後使用OpenAI的Image.create_variation API建立變體並取得分析結果。這個例子中使用的是建立變體的API,在實際應用中,可能需要使用更適合影像分析的API。
這兩個工具擴充套件了我們代理的能力,使其能夠處理音訊和影像資料。與之前的工具一樣,它們也只實作了同步執行方法。在真實應用中,可能需要根據實際API和需求調整這些工具的具體
多模態AI系統的發展與實作策略
在AI領域中,能夠處理多種資料格式的系統一直是研究的重點。現今的AI發展路徑已經從單一模態(如純文書處理)逐漸走向多模態整合。多模態AI系統能夠同時處理文字、影像、語音等多種資料格式,大幅提升AI與人類互動的自然度與實用性。
從AGI到多模態AI的演進
人工通用人工智慧(AGI)作為AI研究的重要目標,仍然存在許多爭議。研究者對於實作AGI的時間點有著截然不同的看法—有人認為數年或數十年內可能實作,有人則認為可能需要一世紀甚至更長時間,或者永遠無法實作。
值得注意的是,AGI並非AI發展的終極里程碑。近期AI領域出現了另一個定義:強人工智慧(Strong AI)或超級人工智慧(Super AI),指的是能力超越人類的AI系統。
目前,如GPT-4 Turbo with Vision等大型多模態模型(LMM)已經問世,但這並非實作多模態的唯一途徑。本文將探討如何整合多個AI系統,開發真正的多模態AI助手。
多模態AI的核心架構
實作多模態AI的一種有效方法是組合多個單模態模型,每個模型專注處理一種資料格式,再使用大模型語言(LLM)作為"大腦”,讓它能以動態方式與這些模型(作為工具)互動。
一個典型的多模態應用可能如下運作:
- 使用影像分析技術檢檢視片
- 使用文字生成技術建立描述圖片內容的文字
- 使用語音合成技術將文字透過語音傳達給使用者
在這個架構中,LLM扮演"推理引擎"的角色,根據使用者的查詢呼叫適當的工具。
使用LangChain構建多模態代理
LangChain提供了豐富的元件(如鏈式操作、代理、工具等)可用於構建多模態代理。實作多模態AI助手主要有三種方法:
1. 現成的代理工具箱方法
這種方法利用Azure AI服務工具箱,它提供了一系列可透過API使用的AI模型,涵蓋影像、音訊、OCR等多種領域。這些服務都已與LangChain整合,使用起來相對簡單。
2. 自定義代理方法
這種方法需要自行選擇單一模型和工具(包括自定義工具),並將它們串聯為一個能夠利用所有這些工具的代理。這種方法提供更大的靈活性。
3. 硬編碼方法
這種方法需要構建獨立的鏈,然後將它們組合成一個順序鏈。這種方法對於特定任務可能更高效,但靈活性較低。
Azure AI服務工具箱:快速實作多模態功能
Azure AI服務(前身為Azure認知服務)是微軟開發的一系列雲端API和AI服務,能夠讓開發人員和資料科學家為應用增加認知能力。這些服務涵蓋了語音、自然語言、視覺和決策等AI領域。
Azure AI服務的特點
Azure AI服務提供兩種使用模式:
- 直接使用功能強大的預建模型
- 使用自定義資料來定製預建模型,使其更符合特定需求
如果由LLM作為推理引擎適當協調,這些服務可以實作多模態功能,而LangChain正好提供了這樣的框架。
AzureCognitiveServicesToolkit入門
LangChain原生整合了名為AzureCognitiveServicesToolkit的Azure AI服務。這個工具箱可以作為代理的引數傳入,從而利用這些模型的多模態能力。
目前,該整合支援以下工具:
- AzureCogsImageAnalysisTool:用於分析和提取影像中的中繼資料
- AzureCogsSpeech2TextTool:用於將語音轉換為文字
- AzureCogsText2SpeechTool:用於使用神經網路語音合成將文字轉換為語音
- AzureCogsFormRecognizerTool:用於執行光學字元識別(OCR)
光學字元識別(OCR)技術
OCR是一種將各種型別的檔案(如掃描的紙質檔案、PDF或數位相機捕捉的影像)轉換為可編輯和可搜尋資料的技術。OCR可以透過自動化資料輸入和儲存過程節省時間、成本和資源。它還能夠實作對歷史、法律或其他型別檔案的原始內容的存取和編輯。
工具箱設定步驟
要開始使用Azure AI服務工具箱,需要遵循以下步驟:
首先在Azure中建立一個多服務例項的Azure AI服務
多服務資源允許使用單一金鑰和端點存取多個AI服務,這些將作為環境變數傳遞給LangChain。可以在資源面板的"金鑰和端點"選項卡下找到這些資訊
資源設定完成後,我們需要設定AI服務環境變數來設定工具箱。在.env檔案中儲存以下變數:
AZURE_COGS_KEY = "你的API金鑰" AZURE_COGS_ENDPOINT = "你的端點" AZURE_COGS_REGION = "你的區域"
然後,與其他環境變數一起載入這些變數:
import os
from dotenv import load_dotenv
load_dotenv()
azure_cogs_key = os.environ["AZURE_COGS_KEY"]
azure_cogs_endpoint = os.environ["AZURE_COGS_ENDPOINT"]
azure_cogs_region = os.environ["AZURE_COGS_REGION"]
openai_api_key = os.environ['OPENAI_API_KEY']
- 現在可以設定工具箱並檢視有哪些工具及其描述:
from langchain.agents.agent_toolkits import AzureCognitiveServicesToolkit
toolkit = AzureCognitiveServicesToolkit()
[(tool.name, tool.description) for tool in toolkit.get_tools()]
輸出結果會顯示所有可用工具及其功能描述:
[('azure_cognitive_services_form_recognizer',
'Azure認知服務表單識別器的包裝器。當你需要從檔案中提取文字、表格和鍵值對時很有用。輸入應該是檔案的URL。'),
('azure_cognitive_services_speech2text',
'Azure認知服務語音轉文字的包裝器。當你需要將音訊轉錄為文字時很有用。輸入應該是音訊檔案的URL。'),
('azure_cognitive_services_text2speech',
'Azure認知服務文字轉語音的包裝器。當你需要將文字轉換為語音時很有用。'),
('azure_cognitive_services_image_analysis',
'Azure認知服務影像分析的包裝器。當你需要分析影像時很有用。輸入應該是影像的URL。')]
- 現在是時候初始化代理了。在這裡,我們使用STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION代理,它允許多工具輸入,因為我們後續還會增加其他工具:
from langchain.agents import initialize_agent, AgentType
from langchain import OpenAI
llm = OpenAI()
model = ChatOpenAI()
agent = initialize_agent(
tools=toolkit.get_tools(),
llm=llm,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
)
這段程式碼設定了一個能夠使用Azure認知服務工具箱的代理。首先匯入必要的類別,然後初始化OpenAI語言模型。initialize_agent
函式建立一個能夠使用我們之前設定的工具箱中所有工具的代理。AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
指定了代理的型別,這種型別的代理能夠接受結構化輸入並生成結構化輸出,同時支援多工具輸入。verbose=True
引數讓代理在執行時顯示詳細的步驟,便於除錯和理解代理的決策過程。
多模態代理的實際應用案例
使用上述設定的多模態代理,我們可以實作許多先前難以實作的複雜任務。例如,如果使用者詢問"我可以用這些食材做什麼?“並提供一張雞蛋和麵粉的圖片,代理可以:
- 使用Azure AI服務的影像分析工具提取圖片中的物體和標籤
- 識別出圖片中的食材(雞蛋和麵粉)
- 使用LLM推理出可以用這些食材製作的食譜
- 向使用者提供食譜建議
這種能力展示了多模態AI系統的強大之處——它能夠無縫地在不同資料型別之間轉換和推理,提供更自然、更有用的互動體驗。
從單一模態到多模態的轉變
傳統上,AI系統大多專注於單一型別的資料處理。例如,文書處理模型擅長處理語言,但無法理解影像;影像識別模型可以分析圖片,但無法處理語音。這種單一模態的侷限性大限制了AI系統的應用範圍和互動自然度。
多模態AI系統透過整合不同的專業模型,突破了這些限制。當LLM作為中央協調器時,這種架構可以:
- 根據輸入型別選擇合適的專業模型
- 在不同模態之間轉換訊息
- 整合多種模態的分析結果
- 生成綜合了各種訊息的回應
這種方法不僅提高了AI系統的靈活性和能力範圍,還為使用者提供了更直觀、更自然的互動體驗。
多模態系統
隨著GPT-4 Vision等多模態大型模型的出現,我們看到了一種趨勢:從多個專業模型的組合向單一多模態模型的發展。然而,這兩種方法各有優劣:
- 單一多模態模型(如GPT-4 Vision):整合度高,使用簡便,但可能在某些專業任務上表現不如專門模型
- 多專業模型組合(如我們的方法):靈活性高,可以根據需要選擇最佳工具,但整合和維護成本較高
在可預見的未來,這兩種方法可能會並存發展,並根據不同的應用場景選擇最適合的方案。
構建自己的多模態應用
透過本文介紹的方法,開發者可以開始構建自己的多模態AI應用。無論是使用現成的Azure AI服務工具箱,還是自定義代理方法,或者硬編碼方法,關鍵在於理解多模態系統的核心架構和工作原理。
在實際應用中,我發現最重要的是明確應用的需求和使用場景,然後選擇最適合的方法。對於需要高度靈活性和定製化的場景,自定義代理方法可能更合適;而對於快速原型開發或標準任務,現成的工具箱方法則更為便捷。
多模態AI正在改變我們與技術互動的方式,使互動變得更自然、更直觀。透過整合多種資料處理能力,AI系統正在逐步接近人類的感知和理解能力,為未來的人工智慧應用開闢了廣闊的可能性。
擴充套件AI能力:透過工具開發真正的多模態體驗
在人工智慧領域,大模型語言(LLMs)已經展現了驚人的文書處理能力,但單靠模型本身往往難以處理影像識別、語音合成等多模態任務。透過工具整合,我們可以大幅擴充套件LLM的能力邊界,開發真正的多模態應用體驗。
在這篇文章中,玄貓將帶領各位探索如何利用工具來強化AI代理的能力,從單一工具的使用到多工具協同,開發能夠「看」見影像並「說」出故事的人工智慧系統。
單一工具的力量:影像分析例項
讓我們從一個簡單的例子開始,使用單一工具來處理影像分析任務。以下是一段程式碼,展示如何讓AI代理描述一張彈弓的圖片:
description = agent.run(" what shows the following image? :"
" https://www.stylo24.it/wp-content/uploads/2020/03/fionda.jpg" )
print(description)
這段程式碼使用了預先設定好的AI代理,並向其提供了一個包含影像URL的問題。agent.run()
方法會執行代理的推理過程,並回傳最終結果。這裡我們只需提供問題和影像URL,代理會自動選擇合適的工具來處理這個任務。
執行後,代理的處理流程如下:
> Entering new AgentExecutor chain...
Action:
{
"action": "azure_cognitive_services_image_analysis",
"action_input": "https://www.stylo24.it/wp-content/uploads/2020/03/fionda.jpg"
}
Observation: Caption: a person holding a slingshot Tags: person, tool, nail, hand, holding, needle
Thought: I know what the image is.
Action:
{
"action": "Final Answer",
"action_input": "The image is of a person holding a slingshot."
}
> Finished chain.
The image is of a person holding a slingshot.
在這個流程中,代理首先識別出需要使用azure_cognitive_services_image_analysis
工具來分析影像。工具回傳了影像的說明(Caption)和標籤(Tags),代理根據這些訊息得出結論:影像中是一個人持有彈弓。整個過程完全自動化,代理自行決定使用適當的工具來回答問題。
挑戰常識推理能力
簡單的描述任務已經完成,接下來讓我們提出一個更具挑戰性的問題,測試代理的常識推理能力:
agent.run("what happens if the person lets the slingshot go? :"
"https://www.stylo24.it/wp-content/uploads/2020/03/fionda.jpg")
執行後,代理給出了以下回應:
> Entering new AgentExecutor chain...
Action:
{
"action": "azure_cognitive_services_image_analysis",
"action_input": "https://www.stylo24.it/wp-content/uploads/2020/03/fionda.jpg"
}
Observation: Caption: a person holding a slingshot Tags: person, tool, nail, hand, holding, needle
Thought: I know what to respond
Action:
{
"action": "Final Answer",
"action_input": "If the person lets the slingshot go, it will fly through the air."
}
> Finished chain.
'If the person lets go of the slingshot, the object being launched by it would be released and propelled forward by the tension of the stretched rubber bands.'
這個案例顯示了代理的常識推理能力。它不僅能夠識別影像中的物體(彈弓),還能根據對物理世界的理解推斷出可能的結果。代理解了彈弓的工作原理——當拉伸的橡皮筋被釋放時,會將物體向前彈射。這種推理能力接近GPT-4在處理視覺輸入時展現的能力,能夠從靜態影像中理解潛在的動作和結果。
雖然問題看似簡單,但背後涉及複雜的常識推理:代理需要理解彈弓的物理特性、拉伸與釋放的機制,以及這些動作的後果。這種常識推理能力是多模態AI系統的重要基礎。
組合多種工具:從影像到故事再到語音
接下來,讓我們挑戰一個更複雜的任務:根據影像講述一個故事,並將故事轉換為語音。這需要代理協調使用多個工具:
agent.run("Tell me a story related to the following picture and read the story aloud to me: https://i.redd.it/diawvlriobq11.jpg")
執行結果如下:
Thought: The human requested a story related to the picture. I will use the Azure Cognitive Services Image Analysis tool to analyze the picture and come up with a story.
Action:
{
"action": "azure_cognitive_services_image_analysis",
"action_input": {
"query": "https://i.redd.it/diawvlriobq11.jpg"
}
}
Observation: Caption: a dog standing on a snowy hill
Objects: dog
Tags: outdoor, animal, mammal, snow, freezing, dog breed, dog, mountain, covered, winter
Thought: Based on the Azure Cognitive Services Image Analysis tool's analysis of the picture, I will come up with a story involving a dog in a snowy winter wonderland.
Action:
{
"action": "azure_cognitive_services_text2speech",
"action_input": {
"query": "Once upon a time, in a snowy winter wonderland, there lived a brave little dog named Snowy. Snowy loved to explore the vast snowy hills and mountains surrounding his home. One day, Snowy stumbled upon a group of lost animals who were stranded in the snow. They were cold, hungry, and scared. Without hesitation, Snowy stepped up to help. He led the group to a nearby shelter and found food and warmth for everyone. Snowy's bravery and kindness earned him a reputation as a hero in the winter wonderland. From then on, he became known as Snowy the Savior of the Snow."
}
}
Observation: C:\Users\vaalt\AppData\Local\Temp\tmp_cecwqht.wav
Thought: The story involving a dog in a snowy winter wonderland seems to have satisfied the human's request for a story related to the picture. I will finalize the response by providing a closing statement.
Action:
{
"action": "Final Answer",
"action_input": "I hope you enjoyed the story of Snowy the Savior of the Snow, the brave little dog who helped rescue a group of lost animals in the snowy winter wonderland. Thank you for the opportunity to share this tale with you."
}
在這個複雜任務中,代理展現了工具組合的能力:
- 首先使用
azure_cognitive_services_image_analysis
工具分析影像,識別出圖中是一隻站在雪山上的狗 - 根據影像分析結果,創作了一個關於雪地狗的故事
- 然後使用
azure_cognitive_services_text2speech
工具將故事轉換為語音 - 最後提供了一個總結性的回應
這個過程展示了多模態AI系統的強大潛力:代理能夠「看」(影像分析)、「思考」(故事創作)、「說」(語音合成),實作了真正的多模態互動體驗。
如果想直接播放生成的音訊,可以使用以下程式碼:
from IPython import display
audio = agent.run("Tell me a story related to the following picture and read the story aloud to me: https://i.redd.it/diawvlriobq11.jpg")
display.display(audio)
這段程式碼會執行相同的代理任務,但會直接在Jupyter環境中播放生成的音訊。IPython.display
模組允許在筆記本環境中顯示各種媒體型別,包括音訊。
自定義代理提示範本
在實際應用中,我們可能需要根據特定需求自定義代理的行為。檢視當前代理使用的提示範本是第一步:
print(agent.agent.llm_chain.prompt.messages[0].prompt.template)
執行後會得到類別似下面的提示範本:
Respond to the human as helpfully and accurately as possible. You have access to the following tools:
{tools}
Use a json blob to specify a tool by providing an action key (tool name) and an action_input key (tool input).
Valid "action" values: "Final Answer" or youtube_search, CustomeYTTranscribe
Provide only ONE action per $JSON_BLOB, as shown:
{{ “action”: $TOOL_NAME, “action_input”: $INPUT }}
Follow this format:
Question: input question to answer
Thought: consider previous and subsequent steps
Action:
這個提示範本定義了代理的行為方式。它指導代理如何使用可用工具、如何格式化工具呼叫(使用JSON格式),以及整體推理流程的結構。透過修改這個範本,我們可以自定義代理的行為,例如改變其回應風格、調整推理步驟的可見性,或者增加特定領域的知識或指導。
多模態工具的實際應用場景
在實際應用中,多模態工具的組合可以解決各種複雜問題。以下是一些潛在的應用場景:
視覺內容分析與理解
透過影像分析工具,AI系統可以識別影像中的物體、場景、人物表情等元素,並進行內容分析。這在內容審核、產品視覺搜尋、安全監控等領域有廣泛應用。
玄貓在實作視覺理解系統時發現,結合影像分析與上下文推理能力,可以讓AI系統不僅"看見"影像,還能理解影像中隱含的情境和可能的後續發展。
多媒體內容生成
如同我們在故事生成例子中看到的,結合影像理解和語音合成工具,可以建立能夠根據視覺輸入生成多媒體內容的系統。這類別系統可用於自動化內容創作、教育輔助工具、互動式故事體驗等。
輔助技術應用
多模態工具組合對於開發輔助技術特別有價值。例如,為視障人士開發的系統可以分析周圍環境的影像,並透過語音描述環境情況;為聽障人士開發的應用可以轉錄語音為文字,並可能結合影像理解提供更豐富的上下文訊息。
客戶服務與互動體驗
在客戶服務領域,多模態AI可以處理客戶上載的產品圖片,識別產品型別或問題,並提供語音或文字回應。這種互動方式比純文字交流更自然、更有效率。
構建多模態系統的關鍵考量
在實際開發多模態AI系統時,有幾個關鍵因素需要考慮:
工具選擇與整合
選擇適合的工具是系統成功的關鍵。需要考慮工具的準確性、延遲、成本以及API限制。在我的實踐中,發現Azure認知服務提供了不錯的影像分析和語音合成能力,但在特定領域可能需要考慮更專業的工具。
錯誤處理與優雅降級
多工具系統增加了潛在失敗點,必須實作健壯的錯誤處理機制。例如,當影像分析工具無法處理特定影像時,系統應該能夠優雅地退化,而不是完全失敗。
隱私與資料安全
多模態系統往往處理更敏感的資料(如使用者影像、語音等)。確保系統符合隱私法規,並採取適當的資料保護措施至關重要。
使用者經驗設計
多模態系統提供了更豐富的互動可能性,但也帶來了使用者經驗設計的挑戰。系統需要清晰地傳達其能力邊界,並提供直觀的互動方式。