
如何快速實現(xiàn)REST API集成以優(yōu)化業(yè)務(wù)流程
1. 任務(wù):Agent的起點是一個任務(wù),如一個用戶查詢、一個目標(biāo)或一個需要解決的特定問題。
2. 大模型:任務(wù)被輸入大模型中。大模型使用訓(xùn)練好的模型進行推理。這個過程涉及理解任務(wù)、生成解決方案的步驟或其他推理活動。
3.?工具:大模型可能會決定使用一系列的工具來輔助完成任務(wù)。這些工具可能是API調(diào)用、數(shù)據(jù)庫查詢或者任何可以提供額外信息和執(zhí)行能力的資源。
4. 行動:Agent根據(jù)大模型的推理結(jié)果采取行動。例如與環(huán)境直接交互、發(fā)送請求、操作物理設(shè)備或更改數(shù)據(jù)等。
5. 環(huán)境:行動會影響環(huán)境,而環(huán)境將以某種形式響應(yīng)這些行動。這個響應(yīng)被稱為結(jié)果,它可能是任務(wù)的完成、一個新的數(shù)據(jù)點或其他類型的輸出。
6. 結(jié)果:將行動導(dǎo)致的結(jié)果反饋給Agent。這個結(jié)果可能會影響Agent未來的行為,因為Agent執(zhí)行任務(wù)是一個不斷學(xué)習(xí)和適應(yīng)的過程,直至目標(biāo)任務(wù)完全解決。
LangChain強調(diào),大模型的推理能力加上工具的功能,形成了Agent的能力內(nèi)核。在Agent內(nèi)部,大模型被用作推理引擎以確定采取哪些操作以及按什么順序執(zhí)行這些操作。
這也體現(xiàn)了大模型應(yīng)用開發(fā)的核心理念:操作的序列并非硬編碼在代碼中,而是使用大模型來選擇執(zhí)行的操作序列。這凸顯了大模型作為AI自主決定應(yīng)用程序邏輯這個編程新范式的價值。
空談?wù)`國,實干興邦。下面通過開源AI應(yīng)用開發(fā)框架LangChain,用不到50行代碼來實現(xiàn)一個會自主搜索并總結(jié)目前Agent科研領(lǐng)域最新進展的Agent。
這里說一下,因為黃佳老師在國外,用OPENAI的API_KEY比較方便,我們在國內(nèi)使用為了免除科學(xué)上網(wǎng)和OPENAI充值的麻煩,這里選擇了用KIMI的API_KEY代替,所用的接口基本一樣。
在開始之前,我們需要做一些準(zhǔn)備工作。首先在KIMI官網(wǎng)和SerpApi網(wǎng)站分別注冊賬號,并獲取KIMI_API_KEY和SERPAPI_API_KEY(此處需要科學(xué)上網(wǎng))。
然后需要安裝好以下這些依賴庫:
pip install langchain
pip install langchainhub
pip install langchain-openai
pip install OpenAI
pip install google-search-results
接下來,我們先給出完整的代碼,再分步拆解一下:
import os
# 設(shè)置API_KEY
os.environ['KIMI_API_KEY'] = '您的KIMI的API_KEY或者其他公司的API_KEY也行'
os.environ['SERPAPI_API_KEY'] = '您的serpapi的API_KEY'
# 導(dǎo)入LangChain Hub
from langchain import hub
# 從LangChain Hub中獲取ReAct的提示
prompt = hub.pull("hwchase17/react")
print(prompt)
from langchain_openai import ChatOpenAI # 修改導(dǎo)入語句
llm = ChatOpenAI(
model_name="moonshot-v1-8k", # KIMI的模型名稱
api_key=os.getenv('KIMI_API_KEY'), # 使用環(huán)境變量獲取API_KEY
base_url="https://api.moonshot.cn/v1", # 修復(fù)了base_url字符串的引號問題
temperature=0.7
)
# 導(dǎo)入SerpAPIWrapper即工具包
from langchain_community.utilities import SerpAPIWrapper
from langchain.agents import Tool
# 實例化SerpAPIWrapper,不要傳遞 api_key 參數(shù)
search = SerpAPIWrapper()
# 準(zhǔn)備工具列表
tools = [
Tool(
name="Search",
func=search.run,
description="當(dāng)大模型沒有相關(guān)知識時,用于搜索知識"
),
]
# 導(dǎo)入create_react_agent功能
from langchain.agents import create_react_agent
# 構(gòu)建ReAct Agent
agent = create_react_agent(llm, tools, prompt)
# 導(dǎo)入AgentExecutor
from langchain.agents import AgentExecutor
# 創(chuàng)建Agent執(zhí)行器并傳入Agent和工具
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 調(diào)用AgentExecutor
agent_executor.invoke({"input": "當(dāng)前Agent最新研究進展是什么?"})
通過以上的一個小例子,已經(jīng)可以跑通啦。那么接下來,再來拆解一下其中的核心。
模型的輸出質(zhì)量與提供給它的輸入信息的質(zhì)量和結(jié)構(gòu)密切相關(guān)。我們先來看看這段代碼是如何導(dǎo)入提示的——正是這個提示指導(dǎo)大模型遵循ReAct框架。
(提示就是你輸入大模型的信息,可以是語言、代碼,可以是圖像、語音等多媒體信息,也可以是人類讀不懂的編碼(只要大模型能理解就行))
這里,我們的大模型之所以遵從ReAct框架去思考并行動,主要取決于提示的準(zhǔn)確性。
接下來我們對上述代碼做一個分解:
from langchain import hub
prompt = hub.pull("hwchase17/react")
print(prompt)
上面的代碼中,我們從LangChain的Hub(可以理解成一個社區(qū))中直接將hwchase17這個大佬設(shè)計好的ReAct提示導(dǎo)入進來。
> 這里這個langchain hub有點類似于下載開源大模型的那個huggingface hub,感興趣的朋友可以科學(xué)上網(wǎng)去探索一下。
運行上述代碼會形成如下的輸出:
PromptTemplate(
input_variables=['agent_scratchpad', 'input', 'tool_names', 'tools'],
template='Answer the following questions as best you can.
You have access to the following tools:\n\n{tools}\n\n
Use the following format:\n\n
Question: the input question you must answer\n
Thought: you should always think about what to do\n
Action: the action to take, should be one of [{tool_names}]\n
Action Input: the input to the action\n
Observation: the result of the action\n...
(this Thought/Action/Action Input/Observation can repeat N times)\n
Thought: I now know the final answer\n
Final Answer: the final answer to the original input question\n\nBegin!\n\n
Question: {input}\n
Thought:{agent_scratchpad}')
PromptTemplate類是一個帶有輸入變量和模板字符串的結(jié)構(gòu),用于生成文本提示。相關(guān)參數(shù)介紹如下:
1. input_variables:是一個變量名的列表,這些變量名會在提示中被實際數(shù)據(jù)替換。
2. template:是定義提示格式的字符串,其中包含多個占位符,這些占位符會被input_variables中對應(yīng)的數(shù)據(jù)替換。
在實例化過程中,這個提示會引導(dǎo)一個大模型或Agent使用特定的格式來回答問題。這個過程包括思考、行動、行動輸入、觀察,并根據(jù)需要重復(fù)這個過程直到得出最終答案。
書中把這一過程翻譯成如下的形式,以便更好的理解:
盡你所能回答以下問題。你可以訪問以下工具:
{工具}
請使用以下格式回答
問題:你必須回答的輸入問題
思考:你每次都應(yīng)該思考接下來怎么做
行動:要采取的行動,應(yīng)該是[{工具名稱}]中的一個
行動輸入:行動的輸入
觀察:行動的結(jié)果
……(這個思考—行動—行動輸入—觀察過程可以重復(fù)N次)
思考:我現(xiàn)在知道最終答案了
最終答案:原始輸入問題的最終答案
開始!
問題:{輸入}
思考:{Agent記事本}
這個提示就是Agent的規(guī)劃和決策指南,也就是我們所謂的提示工程的價值所在。沒有這個提示,大模型將隨意輸出。
from langchain_openai import ChatOpenAI # 修改導(dǎo)入語句
llm = ChatOpenAI(
model_name="moonshot-v1-8k", # KIMI的模型名稱
api_key=os.getenv('KIMI_API_KEY'), # 使用環(huán)境變量獲取API_KEY
base_url="https://api.moonshot.cn/v1",
temperature=0.7
)
在上述代碼中,首先從langchain_openai包(這個包含有各種各樣的大模型)中導(dǎo)入ChatOpenAI類。然后創(chuàng)建一個名為llm的ChatOpenAI類的實例。如果您使用的是OPENAI的API_KEY,您可以使用以下的代碼:
# 導(dǎo)入OpenAI
from langchain_openai import OpenAI
# 選擇要使用的大模型
llm = OpenAI()
接下來,需要配置一下工具Tools
# 導(dǎo)入SerpAPIWrapper即工具包
from langchain_community.utilities import SerpAPIWrapper
from langchain.agents import Tool
# 實例化SerpAPIWrapper
search = SerpAPIWrapper()
# 準(zhǔn)備工具列表
tools = [
Tool(
name="Search",
func=search.run,
description="當(dāng)大模型沒有相關(guān)知識時,用于搜索知識"
),
]
在上述代碼中,SerpAPIWrapper是一個包裝器,其中封裝了與SerpApi的交互,以便通過編程方式訪問SerpApi提供的搜索服務(wù)。SerpApi是一個服務(wù),它提供了對多個搜索引擎(如Google、Bing等)的查詢接口。
Tool類則是LangChain Agent可以使用的工具的基礎(chǔ)類。一個Tool實例代表Agent可以訪問的一個外部功能或服務(wù)。列表tools中包含Tool類的實例。列表中的每個元素都代表一個工具,Agent可以利用這些工具來執(zhí)行任務(wù)。
至此,大模型實例、工具的定義以及ReAct框架提示都已經(jīng)設(shè)置完成,接下來就是要構(gòu)建一個ReAct Agent的實例。
# 導(dǎo)入create_react_agent功能
from langchain.agents import create_react_agent
# 構(gòu)建ReAct Agent
agent = create_react_agent(llm, tools, prompt)
在上述代碼中,首先從langchain.agents模塊導(dǎo)入create_react_agent。然后通過create_react_agent函數(shù)創(chuàng)建一個ReAct Agent。
這個函數(shù)需要傳遞的參數(shù)包括:llm是之前實例化的大模型,tools是之前定義的SerpApi搜索工具,而prompt則是包含ReAct框架的提示,用來定義Agent的行為和任務(wù)。
最后,執(zhí)行執(zhí)行ReAct Agent:
# 導(dǎo)入AgentExecutor
from langchain.agents import AgentExecutor
# 創(chuàng)建Agent執(zhí)行器并傳入Agent和工具
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 調(diào)用AgentExecutor
agent_executor.invoke({"input": "當(dāng)前Agent最新研究進展是什么?"})
通過以上代碼,調(diào)用了agent_executor,輸出結(jié)果。以上就是我們已經(jīng)跟著書中的內(nèi)容,實現(xiàn)了一個簡單的Agent。
這里還有很多其他框架,方便大家使用,大家可以根據(jù)自身需求,慢慢探索:
函數(shù)調(diào)用(Function Calling):是由OpenAI公司提出的一種AI應(yīng)用開發(fā)框架。在這種框架中,大模型被用作調(diào)用預(yù)定義函數(shù)的引擎。這里的預(yù)定義函數(shù)可以用于API調(diào)用、數(shù)據(jù)庫查詢或其他程序化任務(wù)。對于需要與現(xiàn)有系統(tǒng)集成或執(zhí)行具體技術(shù)任務(wù)的應(yīng)用,如自動化腳本或數(shù)據(jù)分析,此框架非常合適。
計劃與執(zhí)行(Plan-and-Execute):側(cè)重于先規(guī)劃一系列的行動,然后執(zhí)行。這種框架使大模型能夠先綜合考慮任務(wù)的多個方面,然后按計劃行動。在復(fù)雜的項目管理或需要多步驟決策的場景中,這種處理方式尤為有效,如自動化工作流程管理。
自問自答(Self-Ask):允許大模型對自己提出問題并回答,以此來深化理解和提高回答質(zhì)量。這種框架在需要深入分析或創(chuàng)造性解決方案的應(yīng)用中非常有用,例如創(chuàng)意寫作或復(fù)雜查詢。
批判修正(Critique Revise):也叫作Self-Refection架構(gòu)。在人工智能和機器學(xué)習(xí)領(lǐng)域中,這種框架主要用于模擬和實現(xiàn)復(fù)雜決策過程。這種框架基于“批判”和“修正”兩個核心步驟,通過不斷迭代改進來提高系統(tǒng)的性能和決策質(zhì)量。
思維鏈(CoT):是指在解決問題過程中形成的一系列邏輯思考步驟。在AI領(lǐng)域,尤其是在自然語言處理和機器理解任務(wù)中,CoT通過模擬人類的思考過程來提高模型的理解和推理能力。通過明確展示解決問題的邏輯步驟,CoT有助于增強大模型的透明度和可解釋性。
思維樹(ToT):可以被視為CoT的升級版。在ToT中,問題解決過程被結(jié)構(gòu)化為一系列邏輯步驟。ToT通過樹搜索來增強大模型解決復(fù)雜問題的能力,旨在提高大模型在處理復(fù)雜任務(wù)時的效能,特別是那些需要探索或戰(zhàn)略性前瞻的任務(wù)。這種框架允許大模型自我評估中間思維對解決問題的貢獻,并通過有意識的推理過程來選擇下一步的方向。
本文章轉(zhuǎn)載微信公眾號@DA隨想隨筆