深入浅出 LangChain 与智能 Agent:构建下一代 AI 助手

发布于 5 个月前

本文作者是支付宝技术部算法工程师元丹。他深入浅出地讲解了LangChain与智能Agent。

小时候我们都玩过乐高积木。通过堆砌各种颜色和形状的积木,我们可以构建出城堡、飞机甚至城市。现在想象一下,如果有一种数字世界的乐高积木,我们能够用这些“积木”来搭建智能程序——这些程序能阅读和理解文本,并与我们进行对话。这就是大型语言模型(LLM)能达到的水平,比如GPT-4,它就像一套庞大的乐高积木套装,等待我们去发掘和构建。

LangChain是什么?

LangChain是一个工具箱,可以帮助我们把各种语言模型乐高积木组合成有趣的应用。它不是一个实体,而是一种开源软件框架,帮助开发者像搭乐高一样快速构建和优化基于语言模型的项目。

为什么需要LangChain?

想一想,虽然我们有了乐高积木,但如果没有说明书或构建工具,要搭建出一个复杂的模型将是非常困难的。同样地,即使有了强大的LLM,比如GPT-4,它们也需要“说明书”和“工具”来更好地服务于现实世界的需求。GPT-4有无与伦比的能力去处理语言,但它还需要额外的组件和连接才能完全发挥潜力,例如访问最新的数据、与外部API互动以及处理用户的上下文信息等。LangChain就像是这样一套“说明书”和“工具”,让GPT-4能够更好地融入我们的应用中。

LangChain的乐高世界

举个例子,假设你想用GPT-4搭建一个旅行顾问机器人。单独的GPT-4就像是一堆杂乱无章的乐高积木。它可能知道很多关于世界各地的信息,但如果没有实时查找航班信息或酒店价格的功能,提供旅行建议就不太准确实用。LangChain就好比是提供了一本指导手册和一套辅助工具,使你的旅行顾问机器人链接到航班数据库、记住用户的旅行偏好以及根据用户以往的提问历史提供个性化的建议。

假设你计划一场旅行,向智能旅行问答助手提出:“我该带些什么去泰国旅行?”如果只有GPT-4,它可能会基于以往的数据给出一般性建议,如防晒霜、泳衣等。但配备LangChain的问答系统可以查询实时天气预报API,并了解当前泰国的季节和天气情况,提供更精确的建议,比如“泰国正处于雨季,记得带上雨具和防潮包”。同样地,如果你问:“泰国哪个垂钓体验最佳?” LangChain可以帮助连接到最新的旅行博客和垂钓爱好者论坛,甚至直接查阅最近旅行者的评论,为你推荐最受欢迎的目的地。

另一个例子,如果你想有一个可以帮你总结长篇报告的工具,单独的GPT-4可能因为文章太长而无法处理。LangChain提供的工具就像是设计用来构建复杂构造的专用乐高积木,它可以将长篇报告切成小部分让GPT-4处理,最后整合结果生成一个完整的摘要。

LangChain的主要概念

Langchain提供了六类组件来帮助我们更好地使用大语言模型。可以视为开源版的GPT插件,提供了丰富的大语言模型工具,可以在开源模型基础上快速增强模型的能力。想象一下,你手中有一盒乐高积木,但这不是普通的积木而是能够编程、交流甚至思考的智能积木。LangChain就像是这样一盒特殊的积木盒,里面装满了不同功能的积木块,这些积木组件集成了数十种大语言模型、多样的知识库处理方法以及成熟的应用链,几十种可调用的工具箱,为用户提供了一个快速搭建和部署大语言模型智能应用程序的平台。

模型(Model)是 LangChain 积木盒中的基础积木,如同地基支撑房屋,LLMs 提供了构建复杂语言理解和生成任务的坚实基础。Chat Models 就像是为乐高小人制作对话能力的积木模板,让应用程序能流畅进行对话,就像注入了会说话的灵魂。

文本嵌入模型(Text Embedding Models)提供了理解文本深度含义的能力,就像是特殊积木块帮助其他积木更好地理解每个块应该放在哪里。Prompt Templates 就是这些剧本,指导模型如何回答问题或生成文本。

索引(Indexes)通过索引来允许文档结构化,让LLM直接、高效地与文档互动。Document Loaders 担任小仓库角色,帮助智能模型存储和访问信息。

Text Splitters 可以将长篇文本拆分成易于处理的小块,就像乐高世界中的分割工具。

向量存储(Vector Stores)是一种特殊存储设施,让积木块记住它们在结构中的位置。Retrievers 则是搜索引擎的替代品,能在向量存储中快速检索和提取信息。

Memory(记忆):对话的连贯性

LangChain 通过 Memory 工具类为 Agent 和 Chain 提供了记忆功能,让智能应用能够记住前一次的交互。在聊天环境中这一点尤其重要。

Chat Message History(聊天消息历史)

最常见的一种对话内容中的 Memory 类,这就好比是在你的乐高角色之间建立了一个记忆网络,使它们能够记住过去的对话。这样每次交流都能在之前的基础上继续,使得智能积木人在每次对话中保持连贯性。

Chains(链)

Chain、LLM Chain、Index-related Chains

CHAIN 模块整合了大型语言模型、向量数据库、记忆系统及提示,通过 Agents 的能力拓展至各种工具。它不仅比大模型API更加高效,还增强了模型的各种应用,诸如问答、摘要编写、表格分析和代码理解等。

这些都构成了一个能够互相合作的独立模块网络。

Chain是连接不同智能积木块的基础方法,而LLM链是最简单的组合方式之一,专为链接语言模型设计。Index-related chains则在其中融入了索引功能,以确保信息的高效流通。

在 LangChain 的世界里,Agent 是一种智能代理。它的职责是接收用户的需求和分析当前的情境,然后从工具箱中选择最合适的工具来执行操作。这些工具包括 LangChain 提供的各种积木,比如 Models、Prompts 和 Indexes 等。

如下图所示,Agent 接受一个任务。它使用 LLM(大型语言模型)作为“大脑”或“思考工具”,通过这个大脑来决定为了达成目标需要执行什么操作。Agent 性格类似于一位有战略眼光的指挥官,不仅知道战场上的每个小队能做什么,还能指挥它们完成更复杂的任务。

在 LangChain 中,Agent 组件的架构图如下所示。本质上它也是基于 Chain 实现的,但它是特殊类型的 Chain,主要作用是在 Action 循环调用的过程中,使用 PromptTemplate 模板来完成思考和决策的过程。Agent 的核心思想是利用 LLM 进行决策,并选择一系列动作来驱动应用程序的核心逻辑。通过 Toolkits 中的一组特定工具,用户可以设计出各种不同的应用场景。

代理执行流程:AgentExecutor

AgentExecuter负责迭代执行代理,直到达到预定的终止条件,使代理能够以类似生物的方式循环处理信息和任务。

在观察阶段,代理接收来自用户的提问或系统发出的请求。它通过解析输入来提取关键信息作为后续步骤的基础。

思考阶段,代理使用预先设定的规则、知识库或者机器学习模型分析这些信息。这一过程的目标是确定如何回应观察到的情况。代理可能会评估不同的行动方案,并选择最合适的答案或行为来回应用户的提问。

在 LangChain 中,这个过程可能涉及以下几个子步骤:

1. **理解用户意图**:使用 NLP 技术理解用户的问题是什么。

2. **推断所需工具**:确定哪个工具(或工具组合)能解决用户的问题。

3. **提取参数**:提取所需工具运行所需的必要参数。这可能包括文本解析、关键信息提取和验证等过程。

行动阶段,代理根据思考阶段的结果执行特定的行动。这种行动可能是提供答案、执行任务、调用工具或者与用户进行进一步交流。

在 LangChain 代理中,这通常涉及以下几个子步骤:

1. **参数填充**:将思考阶段提取的参数填入对应的工具函数中。

2. **工具执行**:运行工具,并获取执行结果。这可能包括查询数据库、运行算法、调用 API 等。

3. **响应生成**:根据工具的执行结果构建代理的响应。响应可以是纯文本消息、数据、图像或其他格式。

4. **输出**:将生成的响应输出给用户或系统。

Agent 推理方式:

- **AgentType**: 指定代理如何使用工具、处理输入以及与用户进行交互,类似于为机器人挑选不同的大脑一样。我们有多种“智能代理”可以根据需求选择,例如聊天模型(接收消息,输出消息)和大型语言模型(接收字符串,输出字符串)。

这些代理的能力也不尽相同:

- **支持聊天历史**:有些代理是专为聊天设计的,能够处理聊天历史。

- **支持多输入工具**:一些代理适合执行多项任务,并能同时处理多个问题(支持并行函数调用)。

- **支持并行函数调用**:有些代理擅长并行执行任务。

- **需要的模型参数**: 有些代理可能需要特定的模型参数才能更好地工作。

此外,不同的代理可能还需要额外信息来更有效地完成任务:

- **所需模型参数**: 这些代理通常需要一些附加的信息以便更好地工作。

- **API 参考**:如果使用的是较新的 OpenAI 模型(1106 及以后),则需参考 OpenAI 的工具或功能。

### LangChain 实际案例:人脸技术问题的智能排查助手

#### 使用 LangChain 处理人脸识别问题的排查

随着人脸识别服务的日调用量和应用场景的发展,团队每天接收到的各种识别问题已经很多。为了快速诊断这些问题,团队决定使用 LangChain 来构建一个智能排查助手。这个助手可以分析用户的问题、错误日志以及与人脸识别 API 的交互,并生成修复建议。

在 LangChain 框架中,工具(Tools)是用于解决特定问题的可调用功能模块。它们可以是简单的函数,也可以是更复杂的对象,能够实现一项或多项特定任务。下面将详细介绍几种不同的工具定义及其在人脸识别问题排查过程中的应用:

**zmng_query 工具**

当用户遇到人脸比对失败的情况时,人脸的日志系统都在 zmng 平台上,我们现在通过 zmng_query 工具提取 UID,根据 UID 查询相关的用户信息,包括他们是否在黑名单上、提取比对分数,并获取机具端及实际的人脸库大小信息。这些信息有助于准确诊断比对失败的原因。

**# 定义 zmng_query 工具的具体实现函数**

```python

def zmng_query(uid):

# 实现查询 zmng 平台以获取与 uid 相关的错误详情

# 查询可能包括黑名单状态、比对分数和 groupSize

return "需要调用compare_scores_tool extract_local_group_size extract_actual_group_size blacklist_query perform_logic_judgement 这五个tool,用于问题的排查输入"

```

**extract_compare_scores 工具**

这个工具用于从日志文件中提取比对分数,这对于诊断是人脸比对技术问题还是用户本身的问题非常关键。

**compare_scores_tool = Tool(

name="extract_compare_scores",

func=extract_compare_scores,

description=(

"当用户刷脸比对不通过时,用于提取日志中的比对分数。"

)

)**

**extract_local_group_size 和 extract_actual_group_size 工具**

这两个工具分别用于提取机具端和实际的人脸库大小(groupSize)。这项信息有助于判断是否所有必要的人脸数据都已经下发到机具端。

**local_group_size_tool = Tool(

name="extract_local_group_size",

func=extract_local_group_size,

description=(

"当用户刷脸比对不通过时,用于提取日志中机具端的人脸库大小groupSize。"

)

)**

**actual_group_size_tool = Tool(

name="extract_actual_group_size",

func=extract_actual_group_size,

description=(

"当用户刷脸比对不通过时,用于提取实际的人脸库大小groupSize。"

)

)**

**blacklist_query 工具**

此工具用于查询指定用户是否在黑名单中,这是人脸识别系统中的常见检查。

**blacklist_query_tool = Tool(

name="blacklist",

func=blacklist,

description="查询指定UID是否在黑名单中。"

)**

**perform_logic_judgement 工具**

根据比对分数和本地库与实际库的大小,此工具能够给出比对不通过的分析结论。

**logic_judgement_tool = Tool(

name="perform_logic_judgement",

func=perform_logic_judgement,

description="根据比对分数和本地与实际库的大小,给出比对不通过的分析结论。"

)**

在 LangChain 框架中,tools 是一系列用于执行特定任务的函数或类的实例,它们可以被智能代理(Agent)调用以完成用户请求。在提供的上下文中,需要用到的 tool 已经定义好了。

**tools = [

compare_scores_tool, #"当用户刷脸比对不通过时,用于提取日志中的比对分数。"

local_group_size_tool, #"当用户刷脸比对不通过时,用于提取日志中机具端的人脸库大小groupSize。"

actual_group_size_tool, #"当用户刷脸比对不通过时,用于提取实际的人脸库大小groupSize。"

blacklist_query_tool, #"查询指定UID是否在黑名单中。"

zmng_query_tool

]**

将所有这些工具组装到一个列表中后,可以使用这个列表来初始化一个智能代理(Agent),该代理能够运行工具并与用户进行互动。

**# 代理初始化,结合工具和聊天模型**

```python

agent = initialize_agent(tools, chat_model, agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

```

现在,我们可以开始与用户的交互:

```python

print("您好,有什么能帮助您? (输入 'exit' 结束对话)")

while True:

user_input = input("You: ")

if user_input.lower() in "exit", "goodbye", "quit":

print("再见!")

break

# 运行代理并获取当前用户输入的响应

response = agent.run(user_input)

# 打印出代理的响应

print("Agent:", response)

```

在这个交互式循环中,智能代理会根据用户的输入运行相应的工具,并使用聊天模型生成自然语言响应。这使得用户可以以对话方式提出问题,并得到解答。

通过观察、思考和行动的处理流程,我们可以构建一个强大的人脸识别问题排查助手,能够快速诊断并解决问题。

借助 LangChain 结合人脸问答知识库进行互动

以下这几个技术模块共同构建了一个基于 LangChain 和人脸问答库进行交互的系统。

模块1:数据加载

这个模块负责读取问题和答案对,并将其存储在字典结构中以便后续检索。请参阅代码实现:

```python

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:

# 将之前问题的答案存储到字典中

qa_data[current_question] = ' '.join(answer_lines).strip()

# 去除"问题: "部分,并去除两端空白字符

current_question = line[len('问题: '):].strip()

answer_lines = [] # 为新的问题重置答案行列表

elif current_question:

# 这是一个答案的一部分,可能不是第一行

answer_lines.append(line.strip())

# 不要忘记处理文件中的最后一个问题

if current_question and answer_lines:

qa_data[current_question] = ' '.join(answer_lines).strip()

return qa_data

```

模块2:向量生成与Faiss索引创建

Faiss是Facebook AI Research精心打造的一款强大向量数据库,特别适用于高效执行相似性搜索和稠密向量聚类。在处理大型数据集时表现尤为出色,能迅速在海量向量中锁定与查询向量最为匹配的项,极大地加速了搜索流程。无论是机器学习还是数据挖掘,Faiss都是不可或缺的工具,常见的应用场景包括但不限于推荐系统、图像搜索和自然语言处理。

除了Faiss,LangChain支持多种向量数据库,覆盖了不同语言和平台。这些数据库包括阿里云的OpenSearch、AnalyticDB、Annoy、Atlas、AwaDB等,以及Azure Cognitive Search、BagelDB、Cassandra、Chroma、Clarifai等。此外,还有ClickHouse Vector Search、Activeloop's Deep Lake、Dingo、ElasticSearch、Hologres、LanceDB、Marqo、MongoDB Atlas和MyScale等;OpenSearch和pg_embedding也提供了优质搜索服务。

通过初始化OpenAIEmbeddings并创建FAISS索引,我们利用LangChain提供的向量数据库能力,提升了数据处理的效率。创建FAISS索引的过程如下:

```python

def create_faiss_index(embedding_matrix):

dimension = embedding_matrix.shape[1] # 获取向量的维度

index = faiss.IndexFlatL2(dimension) # 创建基于L2距离的FAISS索引

index.add(embedding_matrix.astype(np.float32)) # 向索引中添加向量

return index

```

在FAISS索引中搜索,我们使用嵌入向量和Faiss索引来找到与用户查询最相似的问题,并返回相应的答案。请参阅代码实现:

```python

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] # 返回最相似向量的索引

```

模块3:精确匹配查询

当用户提出一个特定的问题时,这个功能会根据用户的输入在知识库中查找精确匹配的问题。

```python

def search_by_exact_query(user_query):

qa_data = load_qa_data('path_to_qa_file')

return(get_answer(qa_data, user_query))

```

模块4:模糊匹配查询

这个模块使用嵌入向量和Faiss索引来找到与用户查询最相似的问题,并返回相应的答案。

```python

def search_by_fuzzy_query(user_query):

# 从文件加载问题和答案

qa_data = load_qa_data('path_to_qa_file')

questions = list(qa_data.keys())

question_embeddings_list = embeddings_model.embed_documents(questions)

question_embeddings = np.array(question_embeddings_list)

faiss_index = create_faiss_index(question_embeddings)

user_query_embedding_list = embeddings_model.embed_documents([user_query])

user_query_embedding = np.array(user_query_embedding_list[0])

closest_question_index = search_faiss_index(user_query_embedding, faiss_index)

closest_question = questions[closest_question_index]

return(qa_data[closest_question])

```

模块5:工具列表

在工具列表中,增加搜索精确匹配和模糊匹配两个工具功能。其他逻辑不变。

```python

tools = [

Tool(

name="search_by_exact",

func=search_by_exact_query,

description="当需要准确回答用户问题时使用此工具。使用时需提供参数['query']。如果查询为错误代码,直接查询并返回对应的错误原因和解决方法;如果观察结果显示有必要或可选发送邮件,请调用send_email工具。"

),

Tool(

name="search_by_fuzzy",

func=search_by_fuzzy_query,

description="当需要回答用户问题时使用此工具。使用时需提供参数['query']。如果查询为错误代码,直接查询并返回对应的错误原因和解决方法;如果查询非错误代码,可咨询此工具相关解决方案;如果观察结果显示有必要或可选发送邮件,请调用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的灵活性和模块化,这个能够自动化处理人脸识别问题的智能排查助手大大提高了问题诊断的效率,并减轻了人工负担。请注意观察下面agent的ObservationThoughtAction三个阶段,agent会自动提取出tool需要的参数形成action。

```python

def handle_agent_query(agent, user_input):

# 解析工具名称和相关参数

tool_name = None

parameters = {}

if 'search_by_exact' in user_input:

tool_name = "search_by_exact"

parameters = {'query': user_input.split("search_by_exact")[1]}

elif 'search_by_fuzzy' in user_input:

tool_name = "search_by_fuzzy"

parameters = {'query': user_input.split("search_by_fuzzy")[1]}

# 根据工具名称调用相应方法

if tool_name is not None and len(parameters) > 0:

agent.action = {

'tool_name': tool_name,

'parameters': parameters

}

# 执行agent任务并获取结果

response = execute_agent_task(agent)

return response

```

智能体(Agent)在人工智能领域的重要性日益凸显。它们不仅能处理文本,还能与各种软件工具进行交互。

AI Agent 是具有环境感知、决策制定和行动执行能力的智能实体,能够通过独立思考和工具调用来逐步实现目标。随着大语言模型(LLM)的出现,AI Agent 又被定义为基于 LLM 驱动的 Agent 实现对通用问题的自动化处理。

智能体的发展方向包括:

1. **扩展大语言模型的能力**:它们不再局限于文本处理,而是能与世界各种软件工具进行直接交互。

2. **多代理系统**:智能代理从单一代理到多代理系统的转变,允许多个代理协同完成更复杂的任务。

3. **增强人机交互性**:智能代理不仅操作工具,还能作为人类的合作者。

智能体的关键特征包括自治性、知觉、反应能力、推理与决策能力、学习能力、通信能力和目标导向性。这些特性让智能体成为真正释放 LLM 潜能的关键,并为 LLM 核心提供强大行动能力。

大语言模型在工具使用能力上的显著提升,以及智能代理的发展,为未来的可能性打下了坚实的基础。新兴的智能体技术如 WebGPT 、ACT-1 和 SayCan 等,都在探索这些可能性中。

智能体的分类包括:

- **自主行动型智能体**:具备自我驱动、思考和外部环境/工具交互能力。

- **基于 LLM 驱动的智能体**:使用大语言模型进行目标处理和自动化任务。

增强智能体的工具使用能力,就像人类用锤子敲打钉子一样。智能代理可以调用一个 API 来获取数据、使用翻译服务来翻译文本或者执行其他功能以帮助或完成它们的任务。通过提升代理对工具的使用能力,它们能够执行更复杂、更加精细的任务,并在更多场景中提供帮助。

最近一些开源的大语言模型能够与各种外部工具无缝交互,比如 Toolformer、Gorilla 和 ToolLLama 等模型。这些模型的设计目的是优化和改进代理对工具的使用能力,使代理能够更好地集成与工具,完成任务,从而扩展 LLMs 的能力范围。

精准调用超过1600个API的智能体进步

Gorilla是一款基于检索感知的LLaMA-7B大型语言模型,也是一种基础的智能体。它能够使用各种API工具,并通过分析自然语言查询来精准找出和调用合适且语义语法均正确的API,从而提升了大型语言模型执行任务的能力和准确性。

Gorilla的一个主要特点是能准确调用超过1600个API,这个数量还在增长中。这一成就展示了如何利用语言模型的理解和生成能力来扩展在自动化工具使用上的潜力。为了进一步提高Gorilla的性能,开发团队通过模拟聊天式对话对LLaMA-7B模型进行了微调,让其更自然地与用户进行交流并生成相应的API调用。

此外,Gorilla还能处理带有约束条件的API调用,这要求它不仅要理解API的基本功能,还要能识别和考虑各种参数约束。这种能力让Gorilla在处理特定任务时显得更加智能和可靠。

在训练过程中,Gorilla不仅在无检索器的情况下学习,还在有检索器的环境中进行训练,以提升其适应和理解不断更新的API文档的能力。这种训练方式使得Gorilla不仅能响应用户的直接指令,还能针对检索到的相关API文档生成精确的调用指令,减少了错误幻觉的发生。

通过上述技术进步,Gorilla不仅提升了语言模型在自动化工具使用上的效率,还增强了其执行复杂任务时的可靠性和准确性。

总的来说,Gorilla不仅提升了语言模型在API调用和工具使用上的能力,还增强了对复杂任务的处理能力,展现了智能体在自动化和人机交互方面的巨大潜力。

**Gorilla-CLI:提升命令行互动体验**

Gorilla CLI是加州大学伯克利分校开发的一个基于Gorilla模型的工具,旨在通过智能化的命令预测和补全功能来优化命令行交互体验。当开发者在终端中输入命令时,Gorilla CLI能够根据上下文提供可能的命令补全,甚至还能根据过去的操作模式推测接下来可能的命令,从而显著加速开发流程。

**安装步骤:**

# 通过pip安装Gorilla CLI

```bash

pip install gorilla-cli

```

# 示例命令生成:

- `find . -name "qa.txt"`

- 命令建议:`find . -name "qa.txt"`

- `统计qa.txt文件中有多少个问题?`

- 命令建议:`cat qa.txt | wc -l`

- `把qa.txt中的问题单独写到一个新的文件中`

- 命令建议:`awk '{print $1}' qa.txt > new_file.txt`

实验效果:

通过Gorilla CLI,开发者可以在命令行环境中更快速、准确地找到和处理文件或数据。例如,在查找文件或统计信息时,智能补全功能能够显著提高效率,而命令预测则可以避免不必要的错误输入,确保操作的正确性和便捷性。

以上是Gorilla CLI的基本使用方法和效果介绍。

ToolLLaMA:实现 16000+ API 的精准协同调用

ToolLLaMa 是一个基于开源 LLaMA-7B 的框架,旨在增强模型执行复杂任务的能力,特别是遵循指令使用外部工具API。通过扩展传统LLMs的功能,ToolLLaMa 可以处理真实世界的应用场景,这些场景需要结合多个API工具来完成任务。

ToolLLaMa的关键特点是支持大量的真实世界API,共16464个,覆盖49个类别。这种丰富的API支持为用户提供了更多的工具选项,以满足各种应用需求。ToolLLaMa 使用ChatGPT生成的指令调整数据集 ToolBench,这些数据集包含单工具和多工具使用场景的指令,使得模型能够学习如何解析和执行包含多个API调用的指令。

为了提高在这些复杂任务中的效率,ToolLLaMa采用了一种基于深度优先搜索的决策树算法DFSDT,它帮助模型在多个潜在解决方案中做出更好的选择。此算法增强了模型规划任务路径和推理的能力。

ToolLLaMA训练了一个API检索器,能够为给定的用户指令推荐合适的API,从而省去了手动筛选API的步骤,使得整个使用流程更加高效。

在性能评估方面,ToolEval结果表明,ToolLLaMa在执行复杂指令及泛化到未见API方面的效果与封闭源码的高级模型ChatGPT相似。这一发现表明,通过适当的训练方法和数据集,开源LLMs可以实现类似于封闭源码LLMs的工具使用能力。

ToolLLaMa项目的代码、训练模型和演示都已在GitHub公开,以促进社区的发展和应用。

总体而言,ToolLLaMA不仅在API支持数量上超越了类似Gorilla的模型,更在任务规划、API检索和泛化能力上提供了新的优势。

安装步骤:

#克隆这个仓库并导航到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服务器进行推理

#请首先填写表单,审核后我们会发送给您toolbench密钥。然后准备您的toolbench密钥:

export TOOLBENCH_KEY="your_toolbench_key"

#对于ToolLLaMA,要使用ToolLLaMA进行推理,请运行以下命令:

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

#如果想要尝试自己训练,参考下面的流程

#准备数据和工具环境:

wget --no-check-certificate 'https://drive.google.com/uc?export=download&id=1XFjDxVZdUY7TXYF2yvzx3pJlS2fy78jk&confirm=yes' -O data.zip

unzip data.zip 数据预处理,以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

#训练代码基于FastChat。您可以使用以下命令使用我们的预处理数据data/toolllama_G123_dfs_train.json来训练2 x A100(80GB)的ToolLLaMA-7b的lora版本。对于预处理的细节,我们分别将G1、G2和G3数据分割成训练、评估和测试部分,并在我们的主要实验中合并训练数据进行训练:

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

实验效果:

如果你正在计划一个给最好朋友的惊喜派对,并希望为每位参加聚会的人提供一些鼓舞人心的话语,那么可以使用 toolLLama 这样的语言模型。它能够轻松调用工具来生成或查找各种名人的励志名言,特别是关于爱情、梦想和成功的话语。例如,其中一个例子返回了:“成功不是终点,失败也不是致命的:真正重要的是继续前进的勇气。”--丘吉尔

随着人工智能技术的发展,我们见证了智能体(AI Agent)从单一任务代理到多代理协同与人代理交互的演变。这种进步不仅拓展了智能应用的边界,使其能够在更加复杂的环境中处理多种任务,还增强了与用户合作的能力,共同做出精细化决策。

我们正步入一个新时代,其中最新的开源大型语言模型(LLMs)能够自由地与其他外部工具进行交互,并完成更为丰富和复杂的任务。这不仅推动了AI技术的民主化,也为社区驱动的创新和发展打开了新的大门。

尽管LMMs的强大提示输入提供了显著优势,但有效利用这些模型仍然需要用户掌握相应的技巧,导致了培训市场的出现。然而,prompt工程的复杂性也对普通用户的体验造成了挑战。AI智能体,作为能够感知环境、自主做出决策和执行动作的独立实体,可能是解决这一挑战的关键。

AI智能体不仅能够自主完成任务,还能主动与环境交互。随着LMMs的发展,AI智能体为这些模型提供了实际操作能力,不仅仅是作为工具,而是具备了自动处理通用问题的能力。通过释放LMMs的潜能,AI智能体将成为未来技术的关键驱动因素。

例如,AutoGPT将复杂任务分解成更易管理的子任务,并生成相应的提示(prompts),从而提高了解决方案的一致性和质量;MetaGPT则通过将标准化操作程序(SOPs)编码到智能体的提示中,简化了工作流程,使智能体能够以类似于人类专家的方式校验中间成果,减少错误的发生;ChatDev则受软件开发的经典瀑布模型启发,在专业功能研讨会中展示了智能体在协作中的潜力。

MetaGPT框架由Deep Wisdom联合几个大学发布,专门针对高效整合人类工作流程设计,通过将标准化操作程序(SOPs)编码到智能体的提示序列中,简化了任务分解和有效协调。在这种系统中,智能体根据装配线原则被分配不同的角色,协同完成复杂任务。

MetaGPT框架吸取了标准操作程序(SOPs)的重要经验,并允许智能体生成结构化且高质量的需求文档、设计文档、流程图和界面规格,从而显著提升目标代码的成功率。它模拟了一个高度规范化的公司流程环境,在这个环境中,所有智能体必须严格遵守已确立的标准和工作流程。

在角色扮演构架中,智能体被分配了各种各样的角色,以高效协同工作,并分解复杂任务。这种设计有助于减少无效交流,降低大模型幻觉风险。

MetaGPT通过"编程促进编程"(programming to program)的方法,提供了一个有前景的元编程框架。智能体不仅是代码的执行者,还主动参与到需求分析、系统设计、代码生成-修改-执行以及运行时调试的全过程。每个智能体都拥有特定的角色和专业知识,并遵循既定的标准。

因此,MetaGPT成为了一种独特的解决方案,在自动化编程任务中展现出巨大的潜力,并推动了元编程的高效实现。

MetaGPT接受单行需求作为输入,并输出用户故事、竞争分析、需求、数据结构、API文档和内部流程。

在内部,MetaGPT包括产品经理、架构师、项目经理和工程师。它提供了一个软件公司的完整流程以及精心编排的标准操作程序(SOP)。

代码 = SOP(团队) 是其核心理念。我们将SOP具体化,并将其应用到由大型语言模型(LLMs)组成的团队中。

在通信协议中,智能体会通过共享消息库来发布和订阅结构化的消息,从而协作完成工作并进行信息交流。这样做可以使得每个智能体能够根据其角色和任务的需求,获取所需的信息并执行相应的行为。

在MetaGPT中,工程师智能体能够生成代码并检查错误。当遇到问题时,它会查阅存储在记忆中的消息,并与产品需求文档、系统设计和代码文件进行对比,以识别问题并进行修正。这个过程中包括迭代编程和可执行反馈,使得智能体可以不断优化其解决方案。

整个软件开发过程图突显了MetaGPT对SOPs(标准操作程序)的依赖性。这些SOPs规定从项目开始到完成的所有步骤,确保智能体能够高效、系统地完成任务。

MetaGPT 实验流程

第一步:确保您的系统上已安装 Python 3.9 或更高版本。

使用以下命令检查:

```

python3 --version

```

第二步:克隆仓库并进行安装。

请将代码保存到本地机器,然后运行以下命令以获取最新版本,并完成安装:

```

git clone https://github.com/geekan/MetaGPT.git

cd MetaGPT

pip3 install -e . # 或者 pip3 install metagpt # 用于稳定版本

```

第三步:设置您的 OPENAI_API_KEY,或确保它已经存在于环境变量中。

创建名为 `~/.metagpt` 的目录,并将配置文件保存到该目录:

```

mkdir ~/.metagpt

cp config/config.yaml ~/.metagpt/config.yaml

vim ~/.metagpt/config.yaml

```

第四步:运行 metagpt 命令行工具。

执行以下命令创建一个 2048 游戏的 Python 代码:

```

metagpt "Create a 2048 game in python"

```

第五步 [可选]:如果需要保存工作区中的产物,如象限图、系统设计等,请在执行步骤3之前执行此步骤。默认情况下,框架是兼容的,整个过程可以完全不执行此步骤而运行。

如果您想要保存工作区中的产物,请确保您的系统上已安装 NPM,并且安装 mermaid-js。

```

npm --version

sudo npm install -g @mermaid-js/mermaid-cli

```

ChatDev 是一款由 OpenBMB 和清华大学 NLP 实验室合作开发的大规模全流程自动化软件开发框架。这个框架模拟了一个虚拟公司,拥有不同职能的智能代理,包括 CEO、CPO、CTO、程序员、审查员、测试员和设计师等。这些智能代理通过聊天协作参与研讨会,并处理设计、编码、测试以及文档撰写等多种任务。

ChatDev 的主要目标是提供一个易于使用且高度可定制的框架,基于大型语言模型(LLMs)。它旨在成为研究集体智能的理想场景。其GitHub地址为:github.com/OpenBMB/ChatDev

ChatDev 采用模拟软件开发的瀑布模型,实现了一种高效的智能协作方式。每个阶段包含多个原子聊天,其中每个聊天中智能体通过任务导向的对话协同完成子任务。这个流程不仅包括指令驱动的智能体互动,还包括角色专业化、记忆流和自我反省等机制,确保智能体高效准确地执行任务,并持续优化决策过程。

在ChatDev的协作方式中,智能体之间的对话不仅仅是基于指令的,还包含了对各自角色的理解、记忆流管理和自我反省等机制。这些机制使得智能体能够协同工作,并不断调整自己的策略以提高效率和准确性,从而实现智能化协作的目标。

角色专业化使得每个智能体都能有效地承担其特定的角色,比如程序员、审查员等。记忆流记录了聊天中的对话历史,为智能体提供充足的信息以做出决定。自省机制则在达成共识后让智能体反思并验证决策,确保没有违反终止条件。

在编码和测试阶段,为了减少代码幻觉——即智能体生成与现有代码库不一致的代码——ChatDev 引入了思维指令机制。智能体通过角色交换,明确询问或解释代码中的具体问题,这样可以更精确地定位问题所在,并通过更具体的指令指导程序员修复问题。这种机制增强了智能体对代码的理解,提高了编程和测试的准确性。

安装步骤:

1. 使用以下命令开始克隆仓库:

git clone https://github.com/OpenBMB/ChatDev.git

2. 确保你有一个3.9或更高版本的Python环境。使用以下命令创建并激活该环境,将ChatDev_conda_env替换为你喜欢的环境名称:

```bash

conda create -n ChatDev_conda_env python=3.9 -y

conda activate ChatDev_conda_env

```

3. 移动到ChatDev目录,并通过运行以下命令安装必需的依赖项:

```bash

cd ChatDev

pip3 install -r requirements.txt

```

设置OpenAI API密钥:

1. 将你的OpenAI API密钥作为环境变量导出。替换"your_OpenAI_API_key"为实际的API密钥,记住这个环境变量是会话特定的。

2. 在Unix/Linux系统上:

```bash

export OPENAI_API_KEY="your_OpenAI_API_key"

```

构建你的软件:

1. 使用以下命令开始构建你的软件:

```bash

python3 run.py --task "[description_of_your_idea]" --name "[project_name]"

```

2. 在Unix/Linux系统上:

```bash

cd WareHouse/project_name_DefaultOrganization_timestamp

python3 main.py

```

运行过程:

为了简化操作流程并确保所有步骤都得到妥善处理,我们特意为“ChatDev”中的“仓库”目录配置了一个辅助功能。当用户运行特定指令时,系统将自动创建一个与之相关的子目录,名称则固定为“puzzle”。这一改动旨在提升开发效率和项目的组织性,让项目管理更加井然有序。

可视化游戏生成的过程:

在ChatDev中,项目从开始到结束涉及到多个角色之间的协作与沟通。这些角色使用对话形式来生成语言模型的提示,以此推动项目的进展。团队成员通过聊天界面编写代码、讨论问题和提出解决方案。整个过程可以用一个可视化的工具进行回放。

可视化游戏生成的过程:

在ChatDev中,项目从开始到结束涉及到多个角色之间的协作与沟通。这些角色使用对话形式来生成语言模型的提示,以此推动项目的进展。团队成员通过聊天界面编写代码、讨论问题和提出解决方案。整个过程可以用一个可视化的工具进行回放。

MetaGPT 和 ChatDev 都能进行自动化的软件开发。但它们的设计风格、技术实现和功能上有一定的区别。

首先,MetaGPT通过序列流程显式设计架构来实现,而ChatDev则是通过生成性基础模型隐式实现的架构设计。截至2023年9月19日,MetaGPT的官方代码库不支持自动化测试。

其次,两种智能体在快速发展中表现各异。MetaGPT更注重流程的标准化和操作程序,强调聊天链的任务解决模式。而ChatDev则采用思维指令的艺术设计,通过自然语言文档来处理用户的需求。

总的来说,尽管两者都支持自动化软件开发,但它们的功能特点、架构设计以及技术实现方式各有不同。

全球范围内,多个AI智能体产品如 AiAgent.app 和 GPT Researcher 已经在市场上崭露头角,并在媒体报道、行业分析、研究助理等领域得到了广泛应用。这些智能体设计得相当灵活,能够调用软件应用和硬件设备,大大提高了工作效率和便利性。

尽管AI智能体的发展时间不长,它们已经迅速在各行业中得到认可。随着大型语言模型(LLMs)的多模态能力和计算力的增强,早年提出的智能体理念得以迅速实现,并广泛应用于多个领域。

各种开源AI智能体的出现,加速了技术供应商和创业团队引入智能体的步伐,并帮助更多组织认识到并接受了AI智能体的概念,这可能成为LLMs落地的主要模式。通过这些智能体,各行业可以更好地利用LLMs。

在第一篇的内容中,我们体验了LangChain的强大功能,它提供了一种全新的搭建和集成方式,就像乐高积木提供了无尽的创造可能。通过这个强大的框架,我们可以将复杂的技术任务简化,让创意和创新更加易于实现。

第二篇内容讨论了智能体的发展,目前主要呈现两大方向:一是Gorilla和ToolLLaMa的进步,它们通过增强大型语言模型本身的工具使用能力,为我们带来直观、高效的互动体验。这些工具的发展将大语言模型的潜力发挥到极致,为智能体提供了更为强大的支持功能。

另一方向是多代理协同,像MetaGPT和ChatDev这样的系统展示了通过多智能体的合作可以如何高效解决问题。这种多代理模式模拟了人类团队工作的方式,每个智能体扮演特定的角色,共同完成任务。这不仅提高了任务执行的效率,也开启了智能代理未来无限的可能性。

随着技术的不断进化,智能代理正在从单一任务执行者转变为能够协同工作的团队成员。这一转变不仅扩大了智能体在各行各业中的应用范围,也为未来出现的人与智能体之间的互动提供了基础。让我们携手前进,共同迎接智能体技术带来的充满惊喜的新时代。