鍵.png)
GraphRAG:基于PolarDB+通義千問api+LangChain的知識(shí)圖譜定制實(shí)踐
Models(模型)
這些模型是LangChain積木盒中的基礎(chǔ)積木。如同用樂高搭建房屋的地基,LLMs為構(gòu)建復(fù)雜的語(yǔ)言理解和生成任務(wù)提供了堅(jiān)實(shí)的基礎(chǔ)。
這些模型就像是為你的樂高小人制作對(duì)話能力。它們能夠讓應(yīng)用程序進(jìn)行流暢的對(duì)話,好比是給你的樂高積木人注入了會(huì)說話的靈魂。
如果說其他模型讓積木能夠理解和生成文本,文本嵌入模型則提供了理解文本深度含義的能力。它們就像是一種特殊的積木塊,可以幫助其他積木更好地理解每個(gè)塊應(yīng)該放在哪里。
Prompts(提示)
想象一下,你正在給樂高小人編寫劇本,告訴他們?cè)诓煌瑘?chǎng)景下應(yīng)該說什么。Prompt Templates就是這些劇本,它們指導(dǎo)模型如何回答問題或者生成文本。
Indexes(索引)
LangChain通過Indexs索引允許文檔結(jié)構(gòu)化,讓LLM更直接、更有效地與文檔互動(dòng)。
這些就像是一個(gè)個(gè)小倉(cāng)庫(kù),幫助你的樂高世界中的智能模型存儲(chǔ)和訪問信息。Document Loaders能夠?qū)⑽臋n加載到系統(tǒng)中,方便模型快速查找。
有時(shí)候你需要將一大塊樂高板分成幾個(gè)小塊來(lái)構(gòu)建更復(fù)雜的結(jié)構(gòu)。Text Splitters可以將長(zhǎng)篇文本拆分成易于處理的小塊。
這些是一種特殊的存儲(chǔ)設(shè)施,幫助你的樂高模型記住文本的數(shù)學(xué)表示(向量)。這就像是讓積木塊記住它們?cè)谡麄€(gè)結(jié)構(gòu)中的位置。
想象一下你需要從一堆積木中找到一個(gè)特定的小部件。Retrievers能夠快速在向量存儲(chǔ)中檢索和提取信息,就像是樂高世界里的搜索引擎。??
Memory(記憶):對(duì)話的連貫性
LangChain通過Memory工具類為Agent和Chain提供了記憶功能,讓智能應(yīng)用能夠記住前一次的交互,比如在聊天環(huán)境中這一點(diǎn)尤為重要。
最常見的一種對(duì)話內(nèi)容中的Memory類,這就好比是在你的樂高角色之間建立了一個(gè)記憶網(wǎng)絡(luò),使它們能夠記住過去的對(duì)話,這樣每次交流都能在之前的基礎(chǔ)上繼續(xù),使得智能積木人能夠在每次對(duì)話中保持連貫性。
Chains(鏈)
CHAIN模塊整合了大型語(yǔ)言模型、向量數(shù)據(jù)庫(kù)、記憶系統(tǒng)及提示,通過Agents的能力拓展至各種工具,形成一個(gè)能夠互相合作的獨(dú)立模塊網(wǎng)絡(luò)。它不僅比大模型API更加高效,還增強(qiáng)了模型的各種應(yīng)用,諸如問答、摘要編寫、表格分析和代碼理解等。
??
Chain是連接不同智能積木塊的基本方式,而LLM Chain是最簡(jiǎn)單的LLM+Prompts的一種chain,專門用于鏈接語(yǔ)言模型。Index-related Chains則將索引功能集成進(jìn)來(lái),確保信息的高效流動(dòng)。
Agents(代理)
在LangChain的世界里,Agent是一個(gè)智能代理,它的任務(wù)是聽取你的需求(用戶輸入)和分析當(dāng)前的情境(應(yīng)用場(chǎng)景),然后從它的工具箱(一系列可用工具)中選擇最合適的工具來(lái)執(zhí)行操作。這些工具箱里裝的是LangChain提供的各種積木,比如Models、Prompts、Indexes等。
如下圖所示,Agent接受一個(gè)任務(wù),使用LLM(大型語(yǔ)言模型)作為它的“大腦”或“思考工具”,通過這個(gè)大腦來(lái)決定為了達(dá)成目標(biāo)需要執(zhí)行什么操作。它就像是一個(gè)有戰(zhàn)略眼光的指揮官,不僅知道戰(zhàn)場(chǎng)上的每個(gè)小隊(duì)能做什么,還能指揮它們完成更復(fù)雜的任務(wù)。
LangChain中Agent組件的架構(gòu)圖如下,本質(zhì)上也是基于Chain實(shí)現(xiàn),但是它是一種特殊的Chain,這個(gè)Chain是對(duì)Action循環(huán)調(diào)用的過程,它使用的PromptTemplate主要是符合Agent Type要求的各種思考決策模版。Agent的核心思想在于使用LLM進(jìn)行決策,選擇一系列要執(zhí)行的動(dòng)作,并以此驅(qū)動(dòng)應(yīng)用程序的核心邏輯。通過Toolkits中的一組特定工具,用戶可以設(shè)計(jì)特定用例的應(yīng)用。
AgentExecuter負(fù)責(zé)迭代運(yùn)行代理,直至滿足設(shè)定的停止條件,這使得Agent能夠像生物一樣循環(huán)處理信息和任務(wù)。
觀察(Observation)
在這個(gè)階段,代理通過其輸入接口接收外部的觸發(fā),比如用戶的提問或系統(tǒng)發(fā)出的請(qǐng)求。代理對(duì)這些輸入進(jìn)行解析,提取關(guān)鍵信息作為處理的基礎(chǔ)。觀察結(jié)果通常包括用戶的原始輸入或預(yù)處理后的數(shù)據(jù)。
在思考階段,代理使用預(yù)先設(shè)定的規(guī)則、知識(shí)庫(kù)或者利用機(jī)器學(xué)習(xí)模型來(lái)分析觀察到的信息。這個(gè)階段的目的是確定如何響應(yīng)觀察到的情況。代理可能會(huì)評(píng)估不同的行動(dòng)方案,預(yù)測(cè)它們的結(jié)果,并選擇最合適的答案或行為。
在LangChain中,這個(gè)過程可能涉及以下幾個(gè)子步驟:
1.理解用戶意圖:使用NLP(自然語(yǔ)言處理)技術(shù)來(lái)理解用戶的問題是什么。
2.推斷所需工具:確定哪個(gè)工具(或工具組合)能解決用戶的問題。
3.提取參數(shù):提取所需工具運(yùn)行的必要參數(shù)。這可能涉及文本解析、關(guān)鍵信息提取和驗(yàn)證等過程。
根據(jù)思考階段的結(jié)果,代理將執(zhí)行特定的行動(dòng)。行動(dòng)可能是提供答案、執(zhí)行任務(wù)、調(diào)用工具或者與用戶進(jìn)行進(jìn)一步的交云。
在LangChain代理中,這通常涉及以下幾個(gè)子步驟:1.參數(shù)填充:將思考階段提取的參數(shù)填入對(duì)應(yīng)的工具函數(shù)中。2.工具執(zhí)行:運(yùn)行工具,并獲取執(zhí)行結(jié)果。這可能是查詢數(shù)據(jù)庫(kù)、運(yùn)行算法、調(diào)用API等。3.響應(yīng)生成:根據(jù)工具的執(zhí)行結(jié)果構(gòu)建代理的響應(yīng)。響應(yīng)可以是純文本消息、數(shù)據(jù)、圖像或其他格式。
4.輸出:將生成的響應(yīng)輸出給用戶或系統(tǒng)。
代理類型決定了代理如何使用工具、處理輸入以及與用戶進(jìn)行交互,就像給機(jī)器人挑選不同的大腦一樣,我們有很多種”智能代理”可以根據(jù)需要來(lái)選擇。有的代理是為聊天模型(接收消息,輸出消息)設(shè)計(jì)的,可以支持聊天歷史;有的代理更適合單一任務(wù),是為大語(yǔ)言模型(接收字符串,輸出字符串)而設(shè)計(jì)的。而且,這些代理的能力也不盡相同:有的能記住你之前的對(duì)話(支持聊天歷史),有的能同時(shí)處理多個(gè)問題(支持并行函數(shù)調(diào)用),也有的只能專心做一件事(適用于單一任務(wù))。此外,有些代理需要我們提供一些額外信息才能更好地工作(所需模型參數(shù)),而有些則可以直接上手,不需要額外的東西。所以,根據(jù)你的需求和你所使用的模型,你可以選擇最合適的代理來(lái)幫你完成任務(wù),常見的代理類型如下:
智能代理類型 | 預(yù)期模型類型 | 支持聊天歷史 | 支持多輸入工具 | 支持并行函數(shù)調(diào)用 | 需要的模型參數(shù) | 何時(shí)使用 | API參考 |
OpenAI Tools | 聊天型 | ? | ? | ? | tools | 如果你使用的是較新的OpenAI模型(1106及以后) | ?Ref?[18] |
OpenAI Functions | 聊天型 | ? | ? | functions | 如果你使用的是OpenAI模型,或者是經(jīng)過微調(diào)以支持函數(shù)調(diào)用的開源模型,并且暴露與OpenAI相同的函數(shù)參數(shù) | ?Ref?[19] | |
XML | 大型語(yǔ)言模型 | ? | 如果你使用的是Anthropic模型,或者其他擅長(zhǎng)XML的模型 | ?Ref?[20] | |||
Structured Chat | 聊天型 | ? | ? | 如果你需要支持具有多個(gè)輸入的工具 | ?Ref?[21] | ||
JSON Chat | 聊天型 | ? | 如果你使用的是擅長(zhǎng)JSON的模型 | ?Ref?[22] | |||
ReAct | 大型語(yǔ)言模型 | ? | 如果你使用的是簡(jiǎn)單模型,推理觀察再行動(dòng) | ?Ref?[23] | |||
Self Ask With Search | 大型語(yǔ)言模型 | 如果你使用的是簡(jiǎn)單模型,并且只有一個(gè)搜索工具,追問+中間答案的技巧,who/when/how | ?Ref??[24] |
如果說Chain是LangChain中的基礎(chǔ)連接方式,那么Agent就是更高階的版本,它不僅可以綁定模板和LLM,還能夠根據(jù)具體情況添加或調(diào)整使用的工具。簡(jiǎn)單來(lái)說,如果Chain是一條直線,那么Agent就是能夠在多個(gè)路口根據(jù)交通情況靈活選擇路線的專業(yè)司機(jī)。
使用LangChain處理人臉識(shí)別問題的排查
隨著人臉識(shí)別服務(wù)的線上線下日調(diào)用量和應(yīng)用場(chǎng)景快速發(fā)展,人臉識(shí)別團(tuán)隊(duì)正在面臨一個(gè)巨大的挑戰(zhàn),每天反饋到團(tuán)隊(duì)的各種識(shí)別問題的case過多,排查起來(lái)費(fèi)時(shí)費(fèi)力,為了快速診斷問題,團(tuán)隊(duì)決定使用LangChain來(lái)構(gòu)建一個(gè)智能排查助手。這個(gè)助手可以分析用戶問題,錯(cuò)誤日志,與人臉識(shí)別的APIs進(jìn)行交互,甚至生成修復(fù)建議。
在LangChain框架中,工具(Tools)是用于解決特定問題的可調(diào)用的功能模塊。它們可以是簡(jiǎn)單的函數(shù),也可以是更復(fù)雜的對(duì)象,能夠?qū)崿F(xiàn)一項(xiàng)或多項(xiàng)特定任務(wù)。下面將詳細(xì)介紹幾種不同的工具定義及其在人臉識(shí)別問題排查過程中的應(yīng)用。
首先,我們需要導(dǎo)入依賴的函數(shù),主要來(lái)自各個(gè)現(xiàn)有日志系統(tǒng)的接口,能夠提取比對(duì)分,黑名單,讀取人臉庫(kù)大小等信息:
from face_functions import (
extract_compare_scores,
extract_local_group_size,
extract_actual_group_size,
perform_logic_judgement,
search_by_exact_query,
search_by_fuzzy_query,
blacklist
)
當(dāng)用戶遇到人臉比對(duì)失敗的情況時(shí),人臉的日志系統(tǒng)都在zmng平臺(tái)上,我們現(xiàn)在通過zmng_query工具提取UID,根據(jù)UID查詢相關(guān)的用戶信息,包括他們是否在黑名單上,提取比對(duì)分?jǐn)?shù),并獲取機(jī)具端及實(shí)際的人臉庫(kù)大小信息,判斷是什么原因識(shí)別不通過。
# 定義 zmng_query 工具的具體實(shí)現(xiàn)函數(shù)
def zmng_query(uid):
# 實(shí)現(xiàn)查詢 zmng 平臺(tái)以獲取與 uid 相關(guān)的錯(cuò)誤詳情
# 查詢可能包括黑名單狀態(tài)、比對(duì)分?jǐn)?shù)和 groupSize
# 返回查詢結(jié)果
return "需要調(diào)用compare_scores_tool extract_local_group_size extract_actual_group_size blacklist_query perform_logic_judgement 這五個(gè)tool,用于問題的排查輸入"
# 創(chuàng)建 zmng_query 工具實(shí)例
zmng_query_tool = Tool(
name="zmng_query",
func=zmng_query,
description=(
"當(dāng)用戶刷臉比對(duì)不通過,需要確認(rèn)是否為黑名單或其他原因時(shí)使用此工具。"
"此工具能查詢黑名單狀態(tài),提取比對(duì)分?jǐn)?shù),并獲取機(jī)具端及實(shí)際的groupSize信息,"
"以便于準(zhǔn)確診斷比對(duì)失敗的原因。需要通過uid或zid進(jìn)行查詢,"
"這是一個(gè)9位數(shù)編碼,能唯一識(shí)別一個(gè)人。使用此工具時(shí),至少提供一個(gè)參數(shù)['uid']或['zid']。"
)
)
這個(gè)工具用于從日志文件中提取比對(duì)分?jǐn)?shù),這對(duì)于診斷是人臉比對(duì)技術(shù)問題還是用戶本身的問題非常關(guān)鍵。
compare_scores_tool = Tool(
name="extract_compare_scores",
func=extract_compare_scores,
description=(
"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取日志中的比對(duì)分?jǐn)?shù)。"
)
)
這兩個(gè)工具分別用于提取機(jī)具端和實(shí)際的人臉庫(kù)大小(groupSize)。這項(xiàng)信息有助于判斷是否所有必要的人臉數(shù)據(jù)都已經(jīng)下發(fā)到機(jī)具端。
local_group_size_tool = Tool(
name="extract_local_group_size",
func=extract_local_group_size,
description=(
"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取日志中機(jī)具端的人臉庫(kù)大小groupSize。"
)
)
actual_group_size_tool = Tool(
name="extract_actual_group_size",
func=extract_actual_group_size,
description=(
"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取實(shí)際的人臉庫(kù)大小groupSize。"
)
)
此工具用于查詢指定用戶是否在黑名單中,這是人臉識(shí)別系統(tǒng)中的一項(xiàng)常見檢查。
blacklist_query_tool = Tool(
name="blacklist_query",
func=blacklist,
description="查詢指定UID是否在黑名單中。"
)
根據(jù)比對(duì)分?jǐn)?shù)和本地庫(kù)與實(shí)際庫(kù)的大小,此工具能夠給出比對(duì)不通過的分析結(jié)論。
logic_judgement_tool = Tool(
name="perform_logic_judgement",
func=perform_logic_judgement,
description="根據(jù)比對(duì)分?jǐn)?shù)和本地與實(shí)際庫(kù)的大小,給出比對(duì)不通過的分析結(jié)論。"
)
在LangChain框架中,tools是一系列用于執(zhí)行特定任務(wù)的函數(shù)或類的實(shí)例,它們可以被智能代理(Agent)調(diào)用以完成用戶請(qǐng)求。在提供的上下文中,需要用到的tool已經(jīng)定義好了。
tools = [
compare_scores_tool, #"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取日志中的比對(duì)分?jǐn)?shù)。"
local_group_size_tool, #"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取日志中機(jī)具端的人臉庫(kù)大小groupSize。"
actual_group_size_tool, #"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取實(shí)際的人臉庫(kù)大小groupSize。"
blacklist_query_tool, #"查詢指定UID是否在黑名單中。"
zmng_query_tool
]
將所有這些工具組裝到一個(gè)列表中,然后可以使用這個(gè)列表來(lái)初始化一個(gè)智能代理(Agent),該代理能夠運(yùn)行工具并與用戶進(jìn)行互動(dòng)。在LangChain中,智能代理負(fù)責(zé)管理用戶的輸入,并決定調(diào)用哪個(gè)工具來(lái)處理特定的請(qǐng)求或問題。通過這種方式,我們可以構(gòu)建一個(gè)強(qiáng)大的、能夠解決人臉識(shí)別相關(guān)問題的智能系統(tǒng)。
LangChain使用大型語(yǔ)言模型(LLM)如GPT-4來(lái)處理自然語(yǔ)言的理解和生成。在這里,我們創(chuàng)建一個(gè)聊天模型實(shí)例,這將允許我們的代理與用戶進(jìn)行自然語(yǔ)言交互:
tools = [
compare_scores_tool, #"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取日志中的比對(duì)分?jǐn)?shù)。"
local_group_size_tool, #"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取日志中機(jī)具端的人臉庫(kù)大小groupSize。"
actual_group_size_tool, #"當(dāng)用戶刷臉比對(duì)不通過時(shí),用于提取實(shí)際的人臉庫(kù)大小groupSize。"
blacklist_query_tool, #"查詢指定UID是否在黑名單中。"
zmng_query_tool
]
temperature參數(shù)控制生成文本的創(chuàng)造性;較低的temperature值(例如0)將導(dǎo)致更確定性和一致性的響應(yīng)。
一旦工具和聊天模型都被實(shí)例化,我們就可以初始化智能代理。在LangChain中,代理(Agent)是與用戶進(jìn)行交云的主體,它使用上面定義好的tools和LLM來(lái)處理用戶的輸入并提供響應(yīng)。
# 代理初始化,結(jié)合工具和聊天模型
agent = initialize_agent(tools, chat_model, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
現(xiàn)在,我們可以開始與用戶的交互:
print("您好,有什么能幫助您? (輸入 'exit' 結(jié)束對(duì)話)")
while True:
user_input = input("You: ")
if user_input.lower() in "exit", "goodbye", "quit":
print("再見!")
break
# 運(yùn)行代理并獲取當(dāng)前用戶輸入的響應(yīng)
response = agent.run(user_input)
# 打印出代理的響應(yīng)
print("Agent:", response)
在這個(gè)交互式循環(huán)中,智能代理會(huì)根據(jù)用戶的輸入運(yùn)行相應(yīng)的工具,并使用聊天模型生成自然語(yǔ)言響應(yīng)。這使得用戶可以以對(duì)話方式提出問題,并得到解答。
在LangChain框架中,智能代理(Agent)通常按照觀察(Observation)- 思考(Thought)- 行動(dòng)(Action)的模式來(lái)處理任務(wù)。這個(gè)模型相當(dāng)于一個(gè)決策循環(huán),代理首先觀察外部輸入,然后進(jìn)行內(nèi)部思考以產(chǎn)生相應(yīng)的行動(dòng)方案。下面詳細(xì)解釋這個(gè)技術(shù)鏈路和邏輯:
#AgentExecutor的核心邏輯,偽代碼:
next_action = agent.get_action(...)
while next_action != AgentFinish:
observation = run(next_action)
next_action = agent.get_action(...,next_action, observation)
return next_action
#實(shí)際AgentExecutor中的部分相關(guān)代碼:
for agent_action in actions:
if run_manager:
run_manager.on_agent_action(agent_action, color="green")
# Otherwise we lookup the tool
if agent_action.tool in name_to_tool_map:
tool = name_to_tool_map[agent_action.tool]
return_direct = tool.return_direct
color = color_mapping[agent_action.tool]
tool_run_kwargs = self.agent.tool_run_logging_kwargs()
if return_direct:
tool_run_kwargs["llm_prefix"] = ""
# We then call the tool on the tool input to get an observation
observation = tool.run(
agent_action.tool_input,
verbose=self.verbose,
color=color,
callbacks=run_manager.get_child() if run_manager else None,
**tool_run_kwargs,
)
我們構(gòu)建了一個(gè)關(guān)于人臉識(shí)別的問答智能代理,用戶詢問:“為什么我的臉無(wú)法被系統(tǒng)識(shí)別?”以下是這個(gè)代理按照Observation-Thought-Action模式處理此請(qǐng)求的過程:
利用LangChain與人臉問答知識(shí)庫(kù)進(jìn)行交互下面這些技術(shù)模塊共同構(gòu)成了一個(gè)基于LangChain與人臉知識(shí)庫(kù)進(jìn)行交互的系統(tǒng)。
下面這些技術(shù)模塊共同構(gòu)成了一個(gè)基于LangChain與人臉知識(shí)庫(kù)進(jìn)行交互的系統(tǒng)。
這個(gè)模塊負(fù)責(zé)讀取問題和答案對(duì),并將它們存儲(chǔ)在一個(gè)字典結(jié)構(gòu)中,以便后續(xù)檢索。
def load_qa_data(filepath):
qa_data = {}
with open(filepath, 'r', encoding='utf-8') as file:
lines = file.readlines()
current_question = None
answer_lines = [] # 用于累積多行答案的列表
for line in lines:
if line.startswith('問題: '):
if current_question:
# 將之前問題的答案存儲(chǔ)到字典中
qa_data[current_question] = ' '.join(answer_lines).strip()
# 去除"問題: "部分,并去除兩端空白字符
current_question = line[len('問題: '):].strip()
answer_lines = [] # 為新的問題重置答案行列表
elif current_question:
# 這是一個(gè)答案的一部分,可能不是第一行
answer_lines.append(line.strip())
# 不要忘記處理文件中的最后一個(gè)問題
if current_question and answer_lines:
qa_data[current_question] = ' '.join(answer_lines).strip()
return qa_data
Faiss 是 Facebook AI Research (FAIR) 精心打造的一款強(qiáng)大向量數(shù)據(jù)庫(kù),專為高效執(zhí)行相似性搜索和稠密向量聚類而設(shè)計(jì)。在處理大型數(shù)據(jù)集時(shí)表現(xiàn)尤為出色,能迅速在海量向量中鎖定與查詢向量最為匹配的項(xiàng),極大地加速了搜索流程。無(wú)論是機(jī)器學(xué)習(xí)還是數(shù)據(jù)挖掘,F(xiàn)aiss 都是一個(gè)不可或缺的工具,常見的應(yīng)用場(chǎng)景包括但不限于推薦系統(tǒng)、圖像搜索和自然語(yǔ)言處理。除了 Faiss,LangChain 支持的向量數(shù)據(jù)庫(kù)范圍廣泛,覆蓋了多種語(yǔ)言和平臺(tái)。這些數(shù)據(jù)庫(kù)包括阿里云的 OpenSearch、AnalyticDB、Annoy、Atlas、AwaDB,以及 Azure Cognitive Search、BagelDB、Cassandra、Chroma、Clarifai 等。此外,還有 ClickHouse Vector Search、Activeloop’s Deep Lake、Dingo,以及各種DocArray搜索能力,如DocArrayHnswSearch和DocArrayInMemorySearch。ElasticSearch、Hologres、LanceDB、Marqo、MatchingEngine、Meilisearch、Milvus、MongoDB Atlas 和 MyScale 也在支持之列。OpenSearch 和 pg_embedding 也提供了優(yōu)質(zhì)的搜索服務(wù)。這些多樣化的數(shù)據(jù)庫(kù)選擇使得LangChain能夠在不同的環(huán)境和需求下提供靈活、高效的搜索能力。
embeddings_model = OpenAIEmbeddings()
這一行創(chuàng)建了一個(gè)OpenAIEmbeddings實(shí)例,它是用來(lái)生成文本embedding的。這些embedding是高維向量,可以捕捉文本內(nèi)容的語(yǔ)義信息,用于文本之間的相似性比較。
#創(chuàng)建FAISS索引
def create_faiss_index(embedding_matrix):
dimension = embedding_matrix.shape[1] # 獲取向量的維度
index = faiss.IndexFlatL2(dimension) # 創(chuàng)建基于L2距離的FAISS索引
index.add(embedding_matrix.astype(np.float32)) # 向索引中添加向量
return index
create_faiss_index函數(shù)接受一個(gè)embedding矩陣(通常是二維數(shù)組,其中每行是一個(gè)向量),初始化一個(gè)FAISS索引,并將這些向量添加到索引中。這個(gè)索引后續(xù)將用于相似性搜索。
def search_faiss_index(query_embedding, index):
query_embedding = np.array(query_embedding).astype(np.float32) # 確保查詢向量為float32類型
_, indices = index.search(np.array([query_embedding]), 1) # 在索引中搜索最相似的向量
return indices[0][0] # 返回最相似向量的索引
與查詢向量最相似的存儲(chǔ)向量。函數(shù)返回最相似項(xiàng)的索引,這通常用來(lái)在一個(gè)數(shù)據(jù)庫(kù)或列表中檢索具體項(xiàng)。
當(dāng)用戶提出一個(gè)特定的問題時(shí),這個(gè)功能會(huì)根據(jù)用戶的輸入在知識(shí)庫(kù)中查找精確匹配的問題。
def search_by_exact_query(user_query):
# 從文件加載問題和答案
qa_data = load_qa_data(filepath)
# 獲取答案并打印
return(get_answer(qa_data, user_query))
這個(gè)模塊使用嵌入向量和Faiss索引來(lái)找到與用戶查詢最相似的問題,并返回相應(yīng)的答案。1.初始化文本嵌入模型。2.使用文本嵌入模型將文本轉(zhuǎn)換為向量。3.使用這些嵌入向量創(chuàng)建FAISS索引。4.當(dāng)用戶提出查詢時(shí),將查詢文本也轉(zhuǎn)換為嵌入向量。5.使用FAISS索引找到最相似的嵌入向量。
def search_by_fuzzy_query(user_query):
# 從文件加載問題和答案
qa_data = load_qa_data(filepath)
# Get embedding vectors for all questions and convert to numpy array
questions = list(qa_data.keys())
question_embeddings_list = embeddings_model.embed_documents(questions)
question_embeddings = np.array(question_embeddings_list)
# Create the faiss index
faiss_index = create_faiss_index(question_embeddings)
# # Prompt user for a query and process
user_query_embedding_list = embeddings_model.embed_documents([user_query])
user_query_embedding = np.array(user_query_embedding_list[0])
# Search the faiss index for the most similar question
closest_question_index = search_faiss_index(user_query_embedding, faiss_index)
closest_question = questions[closest_question_index]
# Print the closest question's answer
return(qa_data[closest_question])
在tools列表中,增加search_by_exact 和 search_by_fuzzy 兩個(gè)工具能力,其他邏輯不變。
tools = [
Tool(
name="search_by_exact",
func=search_by_exact_query,
description="當(dāng)需要準(zhǔn)確回答用戶問題時(shí)使用此工具。使用時(shí)需提供參數(shù)['query']。如果查詢?yōu)殄e(cuò)誤代碼,直接查詢并返回對(duì)應(yīng)的錯(cuò)誤原因和解決方法;如果觀察結(jié)果顯示有必要或可選發(fā)送郵件,請(qǐng)調(diào)用send_email工具。"
),
Tool(
name="search_by_fuzzy",
func=search_by_fuzzy_query,
description="當(dāng)需要回答用戶問題時(shí)使用此工具。使用時(shí)需提供參數(shù)['query']。如果查詢?yōu)殄e(cuò)誤代碼,直接查詢并返回對(duì)應(yīng)的錯(cuò)誤原因和解決方法;如果查詢非錯(cuò)誤代碼,可咨詢此工具相關(guān)解決方案;如果觀察結(jié)果顯示有必要或可選發(fā)送郵件,請(qǐng)調(diào)用send_email工具。"
),
send_email_tool, # Assuming definition is provided elsewhere
compare_scores_tool,
local_group_size_tool,
actual_group_size_tool,
blacklist_query_tool,
zmng_query_tool
]
通過LangChain的靈活性和模塊化,這個(gè)能夠自動(dòng)化處理人臉識(shí)別問題的智能排查助手,大大提高了問題診斷的效率并減輕了人工負(fù)擔(dān)。注意觀察下面agent的Observation Thought Action三個(gè)階段,agent會(huì)自動(dòng)提取出tool需要的參數(shù),形成action:
一句話總結(jié),Langchain這個(gè)開發(fā)框架,是為了讓我們更容易更低成本的構(gòu)建大語(yǔ)言模型的智能應(yīng)用,其中有自主行動(dòng)能力,能夠思考跟外部環(huán)境/工具交互的叫Agent,智能體。
AI Agent業(yè)界定義是具有環(huán)境感知、決策制定和行動(dòng)執(zhí)行能力的智能實(shí)體,并且能夠通過獨(dú)立思考和工具調(diào)用來(lái)逐步實(shí)現(xiàn)既定目標(biāo)。隨著大型語(yǔ)言模型(LLM)的出現(xiàn),AI Agent又被定義為基于LLM驅(qū)動(dòng)的Agent實(shí)現(xiàn)對(duì)通用問題的自動(dòng)化處理。當(dāng)AI Agent被賦予一個(gè)目標(biāo)時(shí),它能獨(dú)立地進(jìn)行思考和行動(dòng),詳細(xì)規(guī)劃出完成任務(wù)所需的每一個(gè)步驟,并通過外部反饋與自我思考來(lái)創(chuàng)建解決問題的prompt。例如,當(dāng)要求ChatGPT購(gòu)買咖啡時(shí),它可能會(huì)回應(yīng)“無(wú)法購(gòu)買咖啡,因?yàn)樗鼉H是一個(gè)文字型AI助手”。AI Agent的關(guān)鍵特征包括自治性、知覺、反應(yīng)能力、推理與決策能力、學(xué)習(xí)能力、通信能力以及目標(biāo)導(dǎo)向性,這些特性使得智能體能成為真正釋放LLM潛能的關(guān)鍵,它能為L(zhǎng)LM核心提供強(qiáng)大的行動(dòng)能力。
智能體(AI Agent)的發(fā)展可謂是人工智能領(lǐng)域的一個(gè)重要里程碑。大語(yǔ)言模型不再局限于處理文本信息,它們的能力正在擴(kuò)展到與世界各種軟件工具的直接交互中。通過調(diào)用APIs,這些模型現(xiàn)在可以獲取信息、執(zhí)行分析、生成報(bào)告、發(fā)送通知,甚至訪問網(wǎng)絡(luò),訪問數(shù)據(jù)庫(kù),使其功能變得無(wú)比強(qiáng)大。這種變化,讓這些模型從單純的文本處理者轉(zhuǎn)變?yōu)檎嬲臄?shù)字助理,能夠理解用戶的需求,并使用正確的工具為用戶提供服務(wù)。
隨著技術(shù)的發(fā)展,大語(yǔ)言模型使用工具能力與日俱增。早期的模型可能需要明確的、結(jié)構(gòu)化的指令才能正確調(diào)用幾十個(gè)工具,而現(xiàn)在,部分模型可以根據(jù)目標(biāo)自由的調(diào)用上萬(wàn)個(gè)工具,并采取相應(yīng)的行動(dòng)。想象一下,僅通過簡(jiǎn)單的對(duì)話,你的智能代理就能為你預(yù)訂餐廳、安排行程、購(gòu)物,甚至編程。這種靈活性和智能度的提升,極大地增強(qiáng)了用戶的體驗(yàn)。
另一個(gè)領(lǐng)域的進(jìn)步是智能體正在從單一的智能代理到多代理系統(tǒng)的轉(zhuǎn)變。初期,一個(gè)代理只能單一地執(zhí)行任務(wù),而現(xiàn)在,多個(gè)代理能夠同時(shí)工作,協(xié)同完成更加復(fù)雜的任務(wù)。例如,一個(gè)代理可以負(fù)責(zé)數(shù)據(jù)收集,而另一個(gè)代理同時(shí)進(jìn)行數(shù)據(jù)分析,第三個(gè)代理則負(fù)責(zé)與用戶溝通結(jié)果。這些代理之間的協(xié)同工作像是一個(gè)高效的團(tuán)隊(duì),每個(gè)成員都在其擅長(zhǎng)的領(lǐng)域發(fā)揮作用。
同時(shí),智能代理與人類用戶之間交互也在往更自然化的方向發(fā)展,多代理系統(tǒng)工作過程中,可以引入人類的決策。這種人機(jī)交互的深度,使得智能代理不僅是工具的操作者,更是人類的合作者。
正是這些技術(shù)進(jìn)步,塑造了我們今天所見證的智能體技術(shù)景觀,大語(yǔ)言模型在工具使用能力上的顯著提升以及智能代理的發(fā)展,為未來(lái)的可能性打下了堅(jiān)實(shí)的基礎(chǔ)。全球范圍內(nèi),新興的智能體技術(shù)如OpenAI的WebGPT為模型賦予了利用網(wǎng)頁(yè)信息的能力,Adept培養(yǎng)的ACT-1能獨(dú)立于網(wǎng)站操作并使用Excel、Salesforce等軟件,谷歌的PaLM項(xiàng)目旗下的SayCan和PaLM-E嘗試將LLM與機(jī)器人相結(jié)合,Meta的Toolformer探索使LLM能夠自主調(diào)用API,而普林斯頓的Shunyu Yao所做的ReAct工作則結(jié)合了思維鏈prompting技術(shù)和“手臂”概念,使LLM能夠搜索并利用維基百科信息。隨著這些技術(shù)的不斷完善和創(chuàng)新,我們有望完成更多曾經(jīng)難以想象的任務(wù),開啟智能體技術(shù)的嶄新篇章。
增強(qiáng)智能體的工具使用能力
智能代理和工具之間的關(guān)系可以類比為人類使用工具來(lái)完成任務(wù)的方式。就像人類使用錘子敲打釘子一樣,代理可以調(diào)用一個(gè)API來(lái)獲取數(shù)據(jù)、使用翻譯服務(wù)來(lái)翻譯文本或者執(zhí)行其他功能以協(xié)助或完成它們的任務(wù)。通過增強(qiáng)代理的工具使用能力,它們能夠執(zhí)行更復(fù)雜、更精細(xì)的任務(wù),并在更廣泛的場(chǎng)景中提供幫助。
最近一些開源的大語(yǔ)言模型能夠自由地與各種外部工具交互,比如Toolformer、Gorilla、ToolLLama等模型,它們是一類設(shè)計(jì)為優(yōu)化和改進(jìn)代理工具使用能力的模型,使代理更有效地與工具集成,完成任務(wù),從而擴(kuò)展LLMs的能力范圍。
Gorilla是一個(gè)基于檢索感知的LLaMA-7B大型語(yǔ)言模型,也是一種基礎(chǔ)的智能體,它能夠使用各種API工具。這個(gè)模型通過分析自然語(yǔ)言查詢,精準(zhǔn)地找出并調(diào)用合適、語(yǔ)義語(yǔ)法均正確的API,從而提升了大型語(yǔ)言模型執(zhí)行任務(wù)的能力和準(zhǔn)確性。
Gorilla的一個(gè)主要特點(diǎn)是它能夠準(zhǔn)確地調(diào)用超過1600個(gè)API,并且這個(gè)數(shù)量還在增長(zhǎng)。這一成就展示了如何利用語(yǔ)言模型的理解和生成能力,來(lái)擴(kuò)展其在自動(dòng)化工具使用上的潛力。為了進(jìn)一步提高Gorilla的性能,開發(fā)團(tuán)隊(duì)通過模擬聊天式對(duì)話,對(duì)LLaMA-7B模型進(jìn)行了微調(diào),讓其能夠更自然地與用戶進(jìn)行交流,并生成相應(yīng)的API調(diào)用。
此外,Gorilla也能夠處理帶有約束條件的API調(diào)用,這要求模型除了理解API的基本功能外,還必須能夠識(shí)別和考慮各種參數(shù)約束。這一能力讓Gorilla在處理特定要求的任務(wù)時(shí)顯得更加智能和可靠。
在訓(xùn)練過程中,Gorilla不僅在無(wú)檢索器的情況下學(xué)習(xí),還在有檢索器的環(huán)境中進(jìn)行訓(xùn)練,以提升其適應(yīng)和理解不斷更新的API文檔的能力。這種訓(xùn)練方式使得Gorilla不僅能響應(yīng)用戶的直接指令,還能夠針對(duì)檢索到的相關(guān)API文檔生成精確的調(diào)用指令,減少了錯(cuò)誤幻覺的發(fā)生。
總的來(lái)說,Gorilla不僅增強(qiáng)了語(yǔ)言模型在API調(diào)用和工具使用上的能力,還提高了處理帶約束任務(wù)的復(fù)雜性,展現(xiàn)了智能體在自動(dòng)化和人機(jī)交互方面的巨大潛力。
Gorilla-CLI是一個(gè)由加州大學(xué)伯克利分校開發(fā),基于Gorilla模型的提升命令行交互體驗(yàn)的工具,它通過智能化的命令預(yù)測(cè)和補(bǔ)全,使得命令行操作更加直觀和高效。當(dāng)開發(fā)者在終端中輸入命令時(shí),Gorilla-CLI能夠根據(jù)上下文提示可能的命令補(bǔ)全,甚至可以根據(jù)過去的操作模式預(yù)測(cè)下一步可能的命令,從而加速開發(fā)流程。https://github.com/gorilla-llm/gorilla-cli?
安裝步驟:
#通過pip安裝Gorilla CLI
pip install gorilla-cli
# Gorilla命令生成示例
$ gorilla 從當(dāng)前目錄下找到qa.txt文件
# 命令建議:
find . -name "qa.txt"
# Gorilla命令生成示例
$ gorilla 統(tǒng)計(jì)qa.txt文件中有多少個(gè)問題?
# Gorilla命令生成示例
$ gorilla 把qa.txt中的問題單獨(dú)寫到一個(gè)新的文件中
ToolLLaMA也是一個(gè)基于開源LLaMA-7B語(yǔ)言模型的框架,旨在增強(qiáng)模型執(zhí)行復(fù)雜任務(wù)的能力,特別是遵循指令使用外部工具API。通過擴(kuò)展傳統(tǒng)LLMs的功能,ToolLLaMA可以處理真實(shí)世界的應(yīng)用場(chǎng)景,這些場(chǎng)景需要結(jié)合多個(gè)API工具來(lái)完成任務(wù)。(gorilla5月份剛發(fā)布, ToolLLaMa 8月份就緊跟著發(fā)布了)
ToolLLaMA的關(guān)鍵特點(diǎn)在于支持大量的真實(shí)世界API,共16464個(gè),覆蓋49個(gè)類別。這種豐富的API支持為用戶提供了更多的工具選項(xiàng),以滿足各種應(yīng)用需求。ToolLLaMA使用ChatGPT生成的指令調(diào)整數(shù)據(jù)集ToolBench,這些數(shù)據(jù)集包含單工具和多工具使用場(chǎng)景的指令,使得模型能夠?qū)W習(xí)如何解析和執(zhí)行包含多個(gè)API調(diào)用的指令。
為了提高在這些復(fù)雜任務(wù)中的效率,ToolLLaMA采用了DFSDT算法,它是一種基于深度優(yōu)先搜索的決策樹,能夠幫助模型在多個(gè)潛在解決方案中做出更好的選擇。此算法增強(qiáng)了模型規(guī)劃任務(wù)路徑和推理的能力。
ToolLLaMA訓(xùn)練了一個(gè)API檢索器,能夠?yàn)榻o定的用戶指令推薦合適的API,從而省去了手動(dòng)篩選API的步驟,使得整個(gè)使用流程更加高效。
在性能評(píng)估方面,ToolEval結(jié)果表明,ToolLLaMA在執(zhí)行復(fù)雜指令及泛化到未見APIs方面的效果與封閉源碼的高級(jí)模型ChatGPT相似。這一發(fā)現(xiàn)表明,通過適當(dāng)?shù)挠?xùn)練方法和數(shù)據(jù)集,開源LLMs能夠?qū)崿F(xiàn)類似于封閉源碼LLMs的工具使用能力。ToolLLaMA項(xiàng)目的代碼、訓(xùn)練模型和演示都已在GitHub公開,以促進(jìn)社區(qū)的進(jìn)一步發(fā)展和應(yīng)用。
總體而言,ToolLLaMA不僅在API支持?jǐn)?shù)量上超越了類似Gorilla的模型,更在任務(wù)規(guī)劃、API檢索和泛化能力上提供了新的優(yōu)勢(shì),這些都是推動(dòng)開源LLMs在復(fù)雜應(yīng)用場(chǎng)景中應(yīng)用的重要因素。https://github.com/OpenBMB/ToolBench?
安裝步驟:
#克隆這個(gè)倉(cāng)庫(kù)并導(dǎo)航到ToolBench文件夾。
git clone git@github.com:OpenBMB/ToolBench.git
cd ToolBench
#安裝包(python>=3.9)
pip install -r requirements.txt
#或者只為ToolEval安裝
pip install -r toolbench/tooleval/requirements.txt
#使用我們的RapidAPI服務(wù)器進(jìn)行推理
#請(qǐng)首先填寫表單,審核后我們會(huì)發(fā)送給您toolbench密鑰。然后準(zhǔn)備您的toolbench密鑰:
export TOOLBENCH_KEY="your_toolbench_key"
#對(duì)于ToolLLaMA,要使用ToolLLaMA進(jìn)行推理,請(qǐng)運(yùn)行以下命令:
export PYTHONPATH=./
python toolbench/inference/qa_pipeline.py \
--tool_root_dir data/toolenv/tools/ \
--backbone_model toolllama \
--model_path ToolBench/ToolLLaMA-7b \
--max_observation_length 1024 \
--observ_compress_method truncate \
--method DFS_woFilter_w2 \
--input_query_file data/test_instruction/G1_instruction.json \
--output_answer_file toolllama_dfs_inference_result \
--toolbench_key $TOOLBENCH_KEY
#如果想要嘗試自己訓(xùn)練,參考下面的流程
#準(zhǔn)備數(shù)據(jù)和工具環(huán)境:
wget --no-check-certificate 'https://drive.google.com/uc?export=download&id=1XFjDxVZdUY7TXYF2yvzx3pJlS2fy78jk&confirm=yes' -O data.zip
unzip data.zip 數(shù)據(jù)預(yù)處理,以G1_answer為例:
export PYTHONPATH=./
python preprocess/preprocess_toolllama_data.py \
--tool_data_dir data/answer/G1_answer \
--method DFS_woFilter_w2 \
--output_file data/answer/toolllama_G1_dfs.json
#訓(xùn)練代碼基于FastChat。您可以使用以下命令使用我們的預(yù)處理數(shù)據(jù)data/toolllama_G123_dfs_train.json來(lái)訓(xùn)練2 x A100(80GB)的ToolLLaMA-7b的lora版本。對(duì)于預(yù)處理的細(xì)節(jié),我們分別將G1、G2和G3數(shù)據(jù)分割成訓(xùn)練、評(píng)估和測(cè)試部分,并在我們的主要實(shí)驗(yàn)中合并訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練:
export PYTHONPATH=./
deepspeed --master_port=20001 toolbench/train/train_lora.py \
--model_name_or_path huggyllama/llama-7b \
--data_path data/toolllama_G123_dfs_train.json \
--eval_data_path data/toolllama_G123_dfs_eval.json \
--conv_template tool-llama-single-round \
--bf16 True \
--output_dir toolllama_lora \
--num_train_epochs 5 \
--per_device_train_batch_size 4 \
--per_device_eval_batch_size 2 \
--gradient_accumulation_steps 2 \
--evaluation_strategy "epoch" \
--prediction_loss_only \
--save_strategy "epoch" \
--save_total_limit 8 \
--learning_rate 5e-5 \
--weight_decay 0. \
--warmup_ratio 0.04 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--source_model_max_length 2048 \
--model_max_length 8192 \
--gradient_checkpointing True \
--lazy_preprocess True \
--deepspeed ds_configs/stage2.json \
--report_to none
如果你正在計(jì)劃一個(gè)給最好朋友的驚喜派對(duì),并希望為每位參加聚會(huì)的人提供一些鼓舞人心的話語(yǔ),那么可以使用toolLLama這樣的語(yǔ)言模型,它能夠讓你輕松地調(diào)用一個(gè)工具來(lái)生成或查找各種名人的勵(lì)志名言,特別是關(guān)于愛情、夢(mèng)想和成功的話語(yǔ)。例如,其中一個(gè)例子返回了:“成功不是終點(diǎn),失敗也不是致命的:真正重要的是繼續(xù)前進(jìn)的勇氣。”–丘吉爾
智能體的發(fā)展:從單任務(wù)到多代理協(xié)同與人代理交互
隨著人工智能技術(shù)的不斷進(jìn)化,我們見證了智能體(AI Agent)的發(fā)展:從只能執(zhí)行單一任務(wù)的簡(jiǎn)單代理,到如今能夠進(jìn)行多代理協(xié)同與人類代理交互的復(fù)雜系統(tǒng)。這種進(jìn)步不僅拓寬了智能應(yīng)用的邊界,使其能夠在更加復(fù)雜的環(huán)境中同時(shí)處理多種任務(wù),還提升了與用戶合作的能力,共同做出更加精細(xì)化的決策。
我們正步入一個(gè)新紀(jì)元,其中最新的開源大型語(yǔ)言模型(LLMs)能夠自由地與多樣化的外部工具交互,完成更加豐富和復(fù)雜的任務(wù)。這不僅推動(dòng)了AI技術(shù)的民主化,還為社區(qū)驅(qū)動(dòng)的創(chuàng)新和發(fā)展打開了新的大門。
盡管LLMs的智能和精準(zhǔn)的提示輸入提供了巨大優(yōu)勢(shì),但有效利用這些模型仍然需要用戶掌握相應(yīng)的技巧,這已導(dǎo)致培訓(xùn)市場(chǎng)的出現(xiàn)。然而,prompt工程的復(fù)雜性也對(duì)普通用戶的體驗(yàn)造成了挑戰(zhàn)。AI智能體,作為能夠感知環(huán)境、做出決策和執(zhí)行動(dòng)作的獨(dú)立實(shí)體,可能是解決這一挑戰(zhàn)的關(guān)鍵。AI智能體不僅能夠自主完成任務(wù),也能夠主動(dòng)與環(huán)境交互。隨著LLMs的發(fā)展,AI智能體為這些模型提供了實(shí)際行動(dòng)力,不僅僅是作為工具,而是作為能夠自動(dòng)化處理通用問題的智能實(shí)體。通過釋放LLMs的潛能,AI智能體將成為未來(lái)技術(shù)的關(guān)鍵驅(qū)動(dòng)力。例如,AutoGPT將復(fù)雜任務(wù)分解為更易管理的子任務(wù),并生成相應(yīng)的提示(prompts)。MetaGPT將高級(jí)人類流程管理經(jīng)驗(yàn)編碼到智能體的提示中,促進(jìn)了多智能體之間的結(jié)構(gòu)化合作。ChatDev受到軟件開發(fā)的經(jīng)典瀑布模型的啟發(fā),通過模擬一個(gè)虛擬軟件公司的環(huán)境,展示了智能體在專業(yè)功能研討會(huì)中的合作潛力。在這個(gè)環(huán)境中,多個(gè)智能體扮演不同的角色,遵循開發(fā)流程,通過聊天進(jìn)行協(xié)作。
MetaGPT是由Deep Wisdom聯(lián)合幾個(gè)大學(xué)發(fā)布的一個(gè)基于大型語(yǔ)言模型(LLMs)專門為高效整合人類工作流程而設(shè)計(jì)的多智能體合作框架。通過將標(biāo)準(zhǔn)化操作程序(SOPs)編碼到智能體的提示序列中,MetaGPT簡(jiǎn)化了工作流程,使智能體能夠以類似于人類專家的方式來(lái)校驗(yàn)中間成果,這有助于減少錯(cuò)誤的發(fā)生。
在MetaGPT系統(tǒng)中,智能體根據(jù)裝配線原則被分配不同的角色,以協(xié)同完成復(fù)雜任務(wù)。任務(wù)被分解為多個(gè)子任務(wù),每個(gè)子任務(wù)由相應(yīng)的智能體負(fù)責(zé)。這種方法不僅提高了任務(wù)執(zhí)行的一致性,還提升了解決方案的質(zhì)量。例如,在軟件工程的協(xié)作任務(wù)中,MetaGPT展現(xiàn)出了相較于傳統(tǒng)基于聊天的多智能體系統(tǒng)更一致的解決方案生成能力。
廣泛接受的SOPs在任務(wù)分解和有效協(xié)調(diào)中扮演了關(guān)鍵角色,尤其是在確定團(tuán)隊(duì)成員職責(zé)和中間產(chǎn)物標(biāo)準(zhǔn)方面。在軟件開發(fā)領(lǐng)域,產(chǎn)品經(jīng)理通常依據(jù)SOP來(lái)創(chuàng)建產(chǎn)品需求文檔(PRD),這有助于指導(dǎo)整個(gè)開發(fā)過程。
MetaGPT框架吸取了SOPs的重要經(jīng)驗(yàn),并允許智能體生成結(jié)構(gòu)化且高質(zhì)量的需求文檔、設(shè)計(jì)文檔、流程圖和界面規(guī)格。這種結(jié)構(gòu)化的中間輸出能夠顯著提升目標(biāo)代碼生成的成功率。MetaGPT模擬了一個(gè)高度規(guī)范化的公司流程環(huán)境,在這個(gè)環(huán)境中,所有智能體必須嚴(yán)格遵守已確立的標(biāo)準(zhǔn)和工作流程。在角色扮演構(gòu)架中,智能體被分配了各種各樣的角色,以高效協(xié)同工作、分解復(fù)雜任務(wù)。這種角色扮演的設(shè)計(jì)有助于減少無(wú)效交流,并降低大模型幻覺風(fēng)險(xiǎn)。
MetaGPT通過”編程促進(jìn)編程”(programming to program)的方法,提供了一個(gè)有前景的元編程框架。智能體不僅是代碼的執(zhí)行者,還主動(dòng)參與到需求分析、系統(tǒng)設(shè)計(jì)、代碼生成-修改-執(zhí)行、以及運(yùn)行時(shí)調(diào)試的全過程。每個(gè)智能體都擁有特定的角色和專業(yè)知識(shí),并遵循既定的標(biāo)準(zhǔn)。如此一來(lái),MetaGPT成為了一種獨(dú)特的解決方案,在自動(dòng)化編程任務(wù)中展現(xiàn)出巨大的潛力,并推動(dòng)了元編程的高效實(shí)現(xiàn)。??
MetaGPT接受單行需求作為輸入,并輸出用戶故事、競(jìng)爭(zhēng)分析、需求、數(shù)據(jù)結(jié)構(gòu)、API、文檔等。在內(nèi)部,MetaGPT包括產(chǎn)品經(jīng)理、架構(gòu)師、項(xiàng)目經(jīng)理和工程師。它提供了一個(gè)軟件公司的整個(gè)流程,以及精心編排的標(biāo)準(zhǔn)操作程序(SOP)。代碼 = SOP(團(tuán)隊(duì)) 是其核心理念。我們將SOP具體化,并將其應(yīng)用到由大型語(yǔ)言模型(LLMs)組成的團(tuán)隊(duì)中。
在通信協(xié)議中,智能體通過共享消息池發(fā)布和訂閱結(jié)構(gòu)化消息,以此來(lái)協(xié)調(diào)工作和交換信息。這允許智能體根據(jù)自己的角色和任務(wù)需求,獲取相關(guān)信息并執(zhí)行任務(wù)。
MetaGPT中的工程師智能體可以生成代碼,運(yùn)行代碼檢查錯(cuò)誤。如果遇到錯(cuò)誤,智能體會(huì)查閱存儲(chǔ)在記憶中的消息,并將它們與產(chǎn)品需求文檔、系統(tǒng)設(shè)計(jì)和代碼文件進(jìn)行對(duì)比,以識(shí)別問題并進(jìn)行修正。這一過程涉及迭代編程和可執(zhí)行反饋,使得智能體可以不斷優(yōu)化其解決方案。
整個(gè)軟件開發(fā)過程圖強(qiáng)調(diào)了MetaGPT對(duì)SOPs的依賴性。這些SOPs規(guī)定了從項(xiàng)目開始到完成的每一步,確保智能體可以高效、系統(tǒng)地完成任務(wù)。
MetaGPT實(shí)驗(yàn)流程
#步驟1:確保您的系統(tǒng)上安裝了Python 3.9或更高版本。您可以使用以下命令來(lái)檢查:
#您可以使用conda來(lái)初始化一個(gè)新的python環(huán)境
conda create -n metagpt python=3.9
conda activate metagpt
python3 --version
#步驟2:克隆倉(cāng)庫(kù)到您的本地機(jī)器以獲取最新版本,并進(jìn)行安裝。
git clone https://github.com/geekan/MetaGPT.git
cd MetaGPT
pip3 install -e . # 或者 pip3 install metagpt # 用于穩(wěn)定版本
#步驟3:設(shè)置您的OPENAI_API_KEY,或確保它已經(jīng)存在于環(huán)境變量中
mkdir ~/.metagpt
cp config/config.yaml ~/.metagpt/config.yaml
vim ~/.metagpt/config.yaml
#步驟4:運(yùn)行metagpt命令行工具
metagpt "Create a 2048 game in python"
#步驟5 [可選]:如果您想要保存工作區(qū)中的產(chǎn)物,如象限圖、系統(tǒng)設(shè)計(jì)、序列流程圖等,可以在執(zhí)行步驟3之前執(zhí)行此步驟。默認(rèn)情況下,框架是兼容的,整個(gè)過程可以完全不執(zhí)行此步驟而運(yùn)行。
如果執(zhí)行,請(qǐng)確保您的系統(tǒng)上安裝了NPM。然后安裝mermaid-js。(如果您的計(jì)算機(jī)中沒有npm,請(qǐng)前往Node.js官方網(wǎng)站安裝Node.js https://nodejs.org/,然后您的計(jì)算機(jī)中將有npm工具。)
npm --version
sudo npm install -g @mermaid-js/mermaid-cli
運(yùn)行過程:
ChatDev是OpenBMB聯(lián)合清華大學(xué)NLP實(shí)驗(yàn)室共同開發(fā)的大模型全流程自動(dòng)化軟件開發(fā)框架,它模擬了一家虛擬軟件公司,由擔(dān)任不同職能的多個(gè)智能代理運(yùn)作,包括首席執(zhí)行官(CEO)、首席產(chǎn)品官(CPO)、首席技術(shù)官(CTO)、程序員、審查員、測(cè)試員和設(shè)計(jì)師。這些智能代理構(gòu)成了一個(gè)多代理組織架構(gòu),并共同致力于一個(gè)使命:”通過編程革新數(shù)字世界。” 在ChatDev中,代理們通過聊天參與研討會(huì)協(xié)作,涵蓋設(shè)計(jì)、編碼、測(cè)試以及文檔撰寫等多種專業(yè)任務(wù)。
ChatDev的主要目標(biāo)是提供一個(gè)易于使用、高度可定制和可擴(kuò)展的框架,該框架基于大型語(yǔ)言模型(LLMs),旨在成為研究集體智能的理想場(chǎng)景。https://github.com/OpenBMB/ChatDev?
ChatDev通過模擬軟件開發(fā)的瀑布模型,實(shí)現(xiàn)了智能的分階段、分聊天的協(xié)作。每個(gè)階段包含多個(gè)原子聊天,而在每個(gè)聊天中,兩個(gè)扮演不同角色的智能體通過任務(wù)導(dǎo)向的對(duì)話來(lái)協(xié)同完成子任務(wù)。這個(gè)流程不僅包括了智能體之間基于指令的互動(dòng),還包括了角色專業(yè)化、記憶流、自省等機(jī)制,以確保智能體能夠高效、準(zhǔn)確地執(zhí)行任務(wù),并持續(xù)優(yōu)化決策過程。
角色專業(yè)化使每個(gè)智能體都能在對(duì)話中有效地扮演其指定的角色,比如程序員、審查員等。記憶流記錄了聊天中的對(duì)話歷史,使智能體在做決策時(shí)有足夠的上下文信息。自省機(jī)制則是在達(dá)成共識(shí)的情況下,讓智能體反思并驗(yàn)證決策,確保沒有違反終止條件。
在編碼和測(cè)試階段,為了減少代碼幻覺——即智能體生成與現(xiàn)有代碼庫(kù)不一致的代碼——ChatDev引入了思維指令機(jī)制。智能體通過角色交換,明確詢問或解釋代碼中的具體問題,這樣可以更精確地定位問題所在,并通過更具體的指令指導(dǎo)程序員修復(fù)問題。這種機(jī)制加強(qiáng)了智能體對(duì)代碼的理解,提高了編程和測(cè)試的準(zhǔn)確性。
克隆GitHub倉(cāng)庫(kù):使用以下命令開始克隆倉(cāng)庫(kù):
git clone https://github.com/OpenBMB/ChatDev.git
設(shè)置Python環(huán)境:確保你有一個(gè)3.9或更高版本的Python環(huán)境。你可以使用以下命令創(chuàng)建并激活這個(gè)環(huán)境,將ChatDev_conda_env替換為你喜歡的環(huán)境名稱:
conda create -n ChatDev_conda_env python=3.9 -y
conda activate ChatDev_conda_env
安裝依賴項(xiàng):移動(dòng)到ChatDev目錄,并通過運(yùn)行以下命令安裝必需的依賴項(xiàng):
cd ChatDev
pip3 install -r requirements.txt
設(shè)置OpenAI API密鑰:將你的OpenAI API密鑰作為環(huán)境變量導(dǎo)出。將"your_OpenAI_API_key"替換為你實(shí)際的API密鑰。記住,這個(gè)環(huán)境變量是會(huì)話特定的,所以如果你打開一個(gè)新的終端會(huì)話,你需要再次設(shè)置它。在Unix/Linux系統(tǒng)上:
export OPENAI_API_KEY="your_OpenAI_API_key"
構(gòu)建你的軟件:使用以下命令開始構(gòu)建你的軟件,將[description_of_your_idea]替換為你的想法描述,將[project_name]替換為你想要的項(xiàng)目名稱:在Unix/Linux系統(tǒng)上:
python3 run.py --task "[description_of_your_idea]" --name "[project_name]"
運(yùn)行你的軟件:一旦生成,你可以在WareHouse目錄下的特定項(xiàng)目文件夾中找到你的軟件,例如project_name_DefaultOrganization_timestamp。在該目錄下使用以下命令運(yùn)行你的軟件:在Unix/Linux系統(tǒng)上:
cd WareHouse/project_name_DefaultOrganization_timestamp
python3 main.py
# 安裝完成后,我們創(chuàng)建了一個(gè)字謎游戲:
python3 run.py --task "創(chuàng)建一個(gè)猜英文字謎的游戲" --name 'puzzle'
# 可視化智能代理對(duì)游戲的生成過程:
python3 visualizer/app.py
MetaGPT和ChatDev都支持自動(dòng)化軟件開發(fā),但在架構(gòu)設(shè)計(jì)、技術(shù)實(shí)現(xiàn)、支持功能等方面存在一些差異。
功能特點(diǎn) | MetaGPT | ChatDev |
流程標(biāo)準(zhǔn)化 | 標(biāo)準(zhǔn)化操作程序 | 聊天鏈 |
任務(wù)解決模式 | 按指令操作 | 智能體間通信 |
架構(gòu)設(shè)計(jì) | 系統(tǒng)接口 | —① |
緩解代碼幻覺 | — | 思維指令 |
藝術(shù)設(shè)計(jì) | — | 文字到圖片設(shè)計(jì)師 |
記憶 | 上下文檢索 | 短時(shí)記憶共享 |
消息共享 | 智能體層面廣播 | 階段層面?zhèn)鬟f |
版本管理 | — | Git |
自動(dòng)化測(cè)試 | —② | 解釋器反饋 |
自然語(yǔ)言文檔 | 產(chǎn)品需求文檔 | 用戶手冊(cè) |
①M(fèi)etaGPT通過序列流程顯式設(shè)計(jì)架構(gòu);而ChatDev的架構(gòu)設(shè)計(jì)是通過生成性基礎(chǔ)模型隱式實(shí)現(xiàn)的。②截至2023年9月19日,MetaGPT的官方代碼庫(kù)目前不支持軟件開發(fā)的自動(dòng)化測(cè)試。
全球范圍內(nèi),多個(gè)AI智能體產(chǎn)品如AiAgent.app和GPT Researcher已被推出,并在媒體報(bào)道、行業(yè)分析、研究助理等領(lǐng)域獲得成功應(yīng)用。這些智能體設(shè)計(jì)得足夠靈活,能夠調(diào)用軟件應(yīng)用和硬件設(shè)備,大大提升了工作效率和便利性。盡管AI智能體的發(fā)展時(shí)間短暫,它們迅速在各行業(yè)中得到認(rèn)可。隨著大型語(yǔ)言模型(LLMs)的多模態(tài)能力和計(jì)算力的增強(qiáng),早年提出的智能體理念得以迅速實(shí)現(xiàn),并廣泛應(yīng)用于多個(gè)領(lǐng)域。各種開源AI智能體的出現(xiàn),加速了技術(shù)供應(yīng)商和創(chuàng)業(yè)團(tuán)隊(duì)引入智能體的步伐,并幫助更多組織認(rèn)識(shí)到并接受了AI智能體的概念,這可能成為L(zhǎng)LMs落地的主要模式,并助力多個(gè)行業(yè)更好地利用LLMs。
LangChain為大型語(yǔ)言模型提供了一種全新的搭建和集成方式,正如樂高積木提供了無(wú)盡的創(chuàng)造可能。通過這個(gè)強(qiáng)大的框架,我們可以將復(fù)雜的技術(shù)任務(wù)簡(jiǎn)化,讓創(chuàng)意和創(chuàng)新更加易于實(shí)現(xiàn)。在第一篇的內(nèi)容中,我們穿越了LangChain的世界,體驗(yàn)了如同搭建樂高積木般構(gòu)建語(yǔ)言模型應(yīng)用的樂趣。從LangChain的核心概念到其在現(xiàn)實(shí)世界中人臉問題的智能排查應(yīng)用,我們見證了這一框架如何助力智能體的創(chuàng)新與成長(zhǎng)。
在第二篇的內(nèi)容中,我們討論了智能體的發(fā)展,目前主要呈現(xiàn)兩大方向。首先,我們看到了諸如Gorilla和ToolLLaMa這樣的進(jìn)步,它們通過增強(qiáng)大型語(yǔ)言模型(LLMs)本身的工具使用能力,為我們帶來(lái)直觀、高效的互動(dòng)體驗(yàn)。這些工具的發(fā)展將大語(yǔ)言模型的潛力發(fā)揮到極致,為智能體提供了更為強(qiáng)大的支持功能。
另一方向是多代理協(xié)同,像MetaGPT和ChatDev這樣的系統(tǒng)展示了通過多智能體的合作可以如何高效解決問題。這種多代理模式模擬了人類團(tuán)隊(duì)工作的方式,每個(gè)智能體扮演特定的角色,共同完成任務(wù)。這不僅提高了任務(wù)執(zhí)行的效率,也開啟了智能代理未來(lái)無(wú)限的可能性。
隨著技術(shù)的不斷進(jìn)化,智能代理正在從單一任務(wù)執(zhí)行者轉(zhuǎn)變?yōu)槟軌騾f(xié)同工作的團(tuán)隊(duì)成員。這一轉(zhuǎn)變不僅擴(kuò)大了智能體在各行各業(yè)中的應(yīng)用范圍,也為未來(lái)出現(xiàn)的人與智能體之間的互動(dòng)提供了基礎(chǔ)。讓我們攜手前進(jìn),共同迎接智能體技術(shù)帶來(lái)的充滿驚喜的新時(shí)代。
引用:
1.https://api.python.langchain.com/en/latest/langchain_api_reference.html
2.https://python.langchain.com/docs/modules/agents/concepts#agentexecutor
3.https://arxiv.org/pdf/2305.15334.pdf Gorilla: Large Language Model Connected with Massive APIs
4.https://arxiv.org/abs/2312.17025 ChatDev: Communicative Agents for Software Development
5.https://arxiv.org/abs/2307.16789 ToolLLM: Facilitating Large Language Models to Master
6.https://arxiv.org/abs/2308.00352 MetaGPT: Meta Programming for A Multi-Agent
7.https://github.com/gorilla-llm/gorilla-cli
8.https://github.com/OpenBMB/ToolBench
9.https://github.com/geekan/MetaGPT
10.https://github.com/OpenBMB/ChatDev
11.https://cobusgreyling.medium.com/agents-f444d165024
12.https://developers.lseg.com/en/article-catalog/article/bond-copilot–unleashing-rd-lib-search-api-with-ai-llm-langchain
13.https://huggingface.co/moka-ai/m3e-base
14.https://blog.csdn.net/lrb0677/article/details/132198025
15.https://zhuanlan.zhihu.com/p/645655496
16.https://www.sohu.com/a/723783296_116132,全球AI Agent大盤點(diǎn),大語(yǔ)言模型創(chuàng)業(yè)一定要參考的60個(gè)AI智能體
17.https://36kr.com/p/2203231346847113, LangChain:Model as a Service粘合劑,被ChatGPT插件干掉了嗎?18.https://api.python.langchain.com/en/latest/agents/langchain.agents.openai_tools.base.create_openai_tools_agent.html19.https://api.python.langchain.com/en/latest/agents/langchain.agents.openai_functions_agent.base.create_openai_functions_agent.html20.https://api.python.langchain.com/en/latest/agents/langchain.agents.xml.base.create_xml_agent.html21.https://api.python.langchain.com/en/latest/agents/langchain.agents.structured_chat.base.create_structured_chat_agent.html22.https://api.python.langchain.com/en/latest/agents/langchain.agents.json_chat.base.create_json_chat_agent.html23.https://api.python.langchain.com/en/latest/agents/langchain.agents.react.agent.create_react_agent.html
24.https://api.python.langchain.com/en/latest/agents/langchain.agents.self_ask_with_search.base.create_self_ask_with_search_agent.html
文章轉(zhuǎn)自微信公眾號(hào)@阿里云開發(fā)者
GraphRAG:基于PolarDB+通義千問api+LangChain的知識(shí)圖譜定制實(shí)踐
使用Node.js、Express和MySQL構(gòu)建REST API
天氣API推薦:精準(zhǔn)獲取氣象數(shù)據(jù)的首選
基于自定義數(shù)據(jù)集的微調(diào):Alpaca與LLaMA模型的訓(xùn)練
OAuth和OpenID Connect圖解指南
有哪些新聞媒體提供Open API?
現(xiàn)在做大模型,還有靠譜且免費(fèi)的API接口嗎?
如何運(yùn)用AI提高自己的工作效率?
區(qū)塊鏈API推薦,快速開發(fā)去中心化應(yīng)用
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)