大語言模型(LLM)結合外部工具和資料儲存,能執行更複雜的任務。函式呼叫允許開發者定義特定功能,讓 LLM 根據使用者查詢執行對應操作,例如查詢天氣、預訂餐廳等。資料儲存則讓 LLM 能夠存取外部資料函式庫或檔案,擴充套件其知識函式庫,無需重新訓練模型即可處理動態資料。透過向量資料函式庫嵌入技術,LLM 可以有效地檢索和利用儲存的資訊。文章將以 Python 程式碼和 LangChain 框架為例,示範如何實作函式呼叫和資料儲存,並探討如何利用 RAG 架構增強 LLM 的推理能力,並最終建構出具備規劃和執行能力的生成式 AI 代理。
函式呼叫與資料儲存:擴充套件語言模型的能力
函式呼叫的應用與優勢
函式呼叫(Function Calling)為開發者提供了一種有效的方式,使語言模型能夠與外部系統互動,執行特定的任務。透過定義函式並將其註冊到模型中,開發者可以讓模型根據使用者的查詢生成適當的函式呼叫請求,從而實作更複雜的功能。
程式碼範例:定義與呼叫函式
from vertexai.generative_models import GenerativeModel, Tool, FunctionDeclaration
from typing import Optional
def display_cities(cities: list[str], preferences: Optional[str] = None):
"""根據使用者的搜尋查詢和偏好提供城市列表。
Args:
preferences (str): 使用者的偏好,例如滑雪、海灘、餐廳、燒烤等。
cities (list[str]): 推薦給使用者的城市列表。
Returns:
list[str]: 推薦給使用者的城市列表。
"""
return cities
# 建立模型並註冊函式
model = GenerativeModel("gemini-1.5-flash-001")
display_cities_function = FunctionDeclaration.from_func(display_cities)
tool = Tool(function_declarations=[display_cities_function])
# 使用者查詢
message = "我希望和家人一起去滑雪旅行,但不知道該去哪裡。"
res = model.generate_content(message, tools=[tool])
# 輸出函式呼叫結果
print(f"函式名稱: {res.candidates[0].content.parts[0].function_call.name}")
print(f"函式引數: {res.candidates[0].content.parts[0].function_call.args}")
內容解密:
display_cities函式定義:此函式接受兩個引數:cities(城市列表)和preferences(使用者偏好)。它傳回推薦的城市列表。- 模型與函式註冊:透過
GenerativeModel和FunctionDeclaration,將display_cities函式註冊到模型中,使其能夠根據使用者的查詢生成相應的函式呼叫。 - 使用者查詢處理:當使用者輸入查詢時,模型會根據註冊的函式生成一個函式呼叫請求,包括函式名稱和引數。
- 輸出結果:最終輸出函式的名稱和引數,例如
display_cities和{'preferences': 'skiing', 'cities': ['Aspen', 'Vail', 'Park City']}。
資料儲存:擴充套件模型的知識與動態資料存取
資料儲存(Data Stores)允許開發者將額外的資料以原始格式提供給代理(Agent),無需進行耗時的資料轉換、模型重新訓練或微調。資料儲存將輸入的檔案轉換為向量資料函式庫嵌入(vector database embeddings),代理可以使用這些嵌入提取所需的資訊,以補充其下一步操作或對使用者的回應。
資料儲存的實作與應用
在生成式 AI 代理的上下文中,資料儲存通常被實作為向量資料函式庫,開發者希望代理在執行時能夠存取這些資料函式庫。向量資料函式庫以向量嵌入(vector embeddings)的形式儲存資料,這是一種高維向量或資料的數學表示。
常見應用場景:
- 網站內容
- 結構化資料:如 PDF、Word 檔案、CSV、試算表等格式。
- 非結構化資料:如 HTML、PDF、TXT 等格式。
RAG(檢索增強生成)架構
RAG 是一種擴充套件模型知識廣度和深度的方法,透過讓模型存取各種格式的資料。RAG 的流程如下:
- 使用者查詢被送到嵌入模型以生成查詢的嵌入向量。
- 查詢嵌入向量與向量資料函式庫中的內容進行比對。
- 比對的內容以文字格式從向量資料函式庫中檢索出來,並送回代理。
- 代理接收使用者查詢和檢索到的內容,然後制定回應或行動。
- 最終回應被送給使用者。
範例互動:RAG 與 ReAct 推理/規劃
在 RAG 架構下,代理可以根據使用者的查詢比對已知的資料儲存,檢索原始內容,並將其提供給協調層和模型進行進一步處理。接下來的動作可能是向使用者提供最終答案,或執行額外的向量搜尋以進一步細化結果。
使用 LangChain 快速建立代理程式(Agent Quick Start with LangChain)
為了提供實際可執行的代理程式範例,我們將使用 LangChain 和 LangGraph 函式庫建立一個快速原型。這些流行的開放原始碼函式庫允許使用者透過「連結」邏輯、推理和工具呼叫來建立自定義代理程式,以回答使用者的查詢。
建立代理程式的步驟
首先,我們需要匯入必要的函式庫並設定 API 金鑰。然後,我們將定義兩個工具:SerpAPI(用於 Google 搜尋)和 Google Places API(用於查詢地點資訊)。
from langgraph.prebuilt import create_react_agent
from langchain_core.tools import tool
from langchain_community.utilities import SerpAPIWrapper
from langchain_community.tools import GooglePlacesTool
import os
# 設定 API 金鑰
os.environ["SERPAPI_API_KEY"] = "XXXXX"
os.environ["GPLACES_API_KEY"] = "XXXXX"
# 定義搜尋工具
@tool
def search(query: str):
"""使用 SerpAPI 執行 Google 搜尋"""
search = SerpAPIWrapper()
return search.run(query)
# 定義地點查詢工具
@tool
def places(query: str):
"""使用 Google Places API 執行地點查詢"""
places = GooglePlacesTool()
return places.run(query)
# 初始化模型和工具
model = ChatVertexAI(model="gemini-1.5-flash-001")
tools = [search, places]
# 定義查詢問題
query = "德州大學長角牛隊上週與誰進行了橄欖球比賽?對方的體育場地址是什麼?"
# 建立代理程式
agent = create_react_agent(model, tools)
input = {"messages": [("human", query)]}
# 執行代理程式並輸出結果
for s in agent.stream(input, stream_mode="values"):
message = s["messages"][-1]
if isinstance(message, tuple):
print(message)
else:
message.pretty_print()
內容解密:
- 匯入必要的函式庫:我們匯入了
langgraph.prebuilt、langchain_core.tools、langchain_community.utilities和langchain_community.tools中的必要模組。 - 設定 API 金鑰:透過
os.environ設定 SerpAPI 和 Google Places API 的金鑰。 - 定義工具:使用
@tool裝飾器定義了兩個工具函式:search和places,分別用於執行 Google 搜尋和地點查詢。 search函式:使用SerpAPIWrapper執行 Google 搜尋查詢。places函式:使用GooglePlacesTool執行地點查詢。- 初始化模型和工具:建立了一個
ChatVertexAI例項,並將定義的工具新增到列表中。 - 定義查詢問題:提出了一個多階段查詢問題,要求代理程式找出德州大學長角牛隊上週的對手並查詢對方體育場的地址。
- 建立代理程式:使用
create_react_agent函式建立了一個反應式代理程式,將模型和工具傳入其中。 - 執行代理程式:透過
agent.stream方法執行代理程式,並輸出結果。
生成式AI代理的未來發展與應用
在探討生成式AI代理(Generative AI Agents)的過程中,我們發現這些代理能夠透過結合大語言模型(LLMs)與外部工具,實作複雜任務的自主執行。本文將深入分析生成式AI代理的核心組成、運作機制及其在實際應用中的潛力。
生成式AI代理的核心組成
- 大語言模型(LLMs):作為生成式AI代理的基礎,LLMs提供了自然語言理解與生成的核心能力。
- 工具(Tools):包括API呼叫、資料儲存和函式呼叫等,使代理能夠與外部系統互動,取得實時資訊並執行具體操作。
- 協調層(Orchestration Layer):負責結構化推理、規劃和決策,引導代理的行為。
運作機制
生成式AI代理透過協調層整合LLMs與工具,實作以下功能:
- 推理與規劃:利用ReAct、Chain-of-Thought和Tree-of-Thoughts等技術進行複雜問題的推理與規劃。
- 任務執行:透過工具呼叫外部API或執行本地函式,完成特定任務。
- 資料驅動決策:藉助資料儲存,代理能夠存取結構化或非結構化資料,進行資料驅動的決策。
實際應用與未來發展
1. 生產級應用
利用Google的Vertex AI平台,開發者可以快速構建和佈署生產級的生成式AI代理。該平台提供了自然語言介面,用於定義代理的目標、任務指令和工具,並包含測試、評估和除錯工具,簡化了開發流程。
2. 代理鏈(Agent Chaining)
透過組合專門的代理,形成「代理專家混合體」,能夠在多個領域和問題上提供卓越的解決方案。這種策略預計將在未來獲得更多關注。
重點摘錄
- 擴充套件語言模型的能力:生成式AI代理透過工具存取實時資訊,建議現實世界的操作,並自主規劃和執行複雜任務。
- 協調層的重要性:協調層結構化推理、規劃和決策,引導代理的行為。
- 工具的多樣性:包括Extensions、Functions和Data Stores,使代理能夠與外部系統互動並存取超出訓練資料的知識。
隨著生成式AI代理技術的不斷進步,我們可以預見其在各個行業中的廣泛應用。透過不斷的實驗和改進,開發者將能夠構建出更為複雜和高效的代理架構,推動現實世界的價值創造。
程式碼範例
import requests
def get_texas_longhorns_schedule():
url = "https://api.example.com/texas-longhorns/schedule"
response = requests.get(url)
return response.json()
def get_opponent_stadium_address(opponent):
url = f"https://api.example.com/teams/{opponent}/stadium"
response = requests.get(url)
return response.json()
# 使用範例
schedule = get_texas_longhorns_schedule()
opponent = schedule['opponent']
stadium_address = get_opponent_stadium_address(opponent)
print(f"The Texas Longhorns played {opponent} last week.")
print(f"The address of {opponent}'s stadium is {stadium_address['address']}.")
內容解密:
此程式碼範例展示瞭如何使用API取得德州大學長角牛隊(Texas Longhorns)的賽程以及對手的體育場地址。首先,get_texas_longhorns_schedule函式透過API呼叫取得賽程資訊。接著,get_opponent_stadium_address函式根據對手球隊名稱取得其體育場的地址。最後,程式輸出相關資訊。
get_texas_longhorns_schedule函式:負責呼叫API取得德州大學長角牛隊的最新賽程。get_opponent_stadium_address函式:根據對手球隊名稱,呼叫API取得其體育場的詳細地址。- 輸出結果:程式根據取得的資訊,輸出德州大學長角牛隊上週對手以及對手體育場的地址。
這段程式碼展示瞭如何利用API實作資料驅動的應用,為生成式AI代理提供了實時資訊取得的能力。
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333
title 內容解密:
rectangle "played against" as node1
rectangle "stadium" as node2
rectangle "address" as node3
node1 --> node2
node2 --> node3
@enduml
此圖示展示了德州大學長角牛隊與喬治亞鬥牛犬隊的比賽關係,以及喬治亞鬥牛犬隊的主場——桑福德體育場的地址。
圖示解說:
- 節點A(Texas Longhorns):代表德州大學長角牛隊。
- 節點B(Georgia Bulldogs):代表喬治亞鬥牛犬隊,是德州大學長角牛隊的對手。
- 節點C(Sanford Stadium):代表喬治亞鬥牛犬隊的主場桑福德體育場。
- 節點D(100 Sanford Dr, Athens, GA 30602):代表桑福德體育場的地址。
此圖清晰地展示了比賽雙方與體育場地址之間的關係,有助於理解相關資訊。