AI 智能体是一个由规划功能、内存和工具组成的系统,用于执行用户请求的任务。对于数据分析或与复杂系统交互等复杂任务,您的应用可能依赖于不同类型智能体之间的协作。有关更多背景信息,请参阅 LLM 智能体简介 和 构建您的首个 LLM 智能体应用。
本文介绍了构建准确的 LLM 应用(可在查询时处理细致入微的数据分析任务)所需的代理类型。本文将介绍构建数据分析代理应用(包括代码片段)的示例用例。最后,本文将介绍 AI 开发者在优化和构建 LLM 代理应用时需要考虑的一些注意事项。
用于数据分析任务的 LLM 代理类型
首先,本节介绍两种主要类型的 LLM 代理及其工作原理 – 数据代理和 API 或执行代理。我还将介绍代理集群用例,其中涉及多个代理合作解决问题。请注意,这些代理类型在某种程度上代表频谱的端部。可以为特定用例创建混合的专用代理。
数据代理
数据代理通常专为提取目标而设计。换言之,数据代理协助用户从各种数据源中提取信息。它们有助于完成辅助推理任务。
例如,财务分析师可能会问:“公司在今年的几个季度实现了正现金流量?”此类问题需要推理、搜索(结构化、非结构化或两者兼有)和规划能力。
API 或执行代理
API 或执行代理专为执行目标而设计。这些代理执行用户请求的任务或一组任务。
假设同一个金融分析师使用的 Excel 电子表格包含去年 10 只股票的收市价。分析师希望根据一个或多个统计公式来组织这些收市价。需要将 Excel API 链接在一起以执行此任务。有关另一个 API 代理示例,请参阅Google Places API Copilot 演示。
智能体群
智能体群涉及多个数据智能体和多个 API 智能体以去中心化方式协作,以解决复杂问题。智能体群专为工作流而设计,其中包括需要不同形式的规划和智能体核心线束的提取和执行任务。
例如,假设财务分析师希望研究排名前 5 的快餐库存以进行投资规划。实现这一目标所需的行动顺序如下图 1 所示。
- 挖掘股价。数据代理使用 SQL、pandas 或 Quandl API 访问结构化数据库。
- 从 10-K 和 10-Q 报告中提取更多相关信息。使用数据代理执行搜索引擎调用以获取表单。使用数据代理提取信息,并通过检索增强生成(RAG)调用。
- 将信息存储在 Excel 中。API 代理调用 Excel API。
- 从社交媒体内容中提取用户情感。使用数据智能体的数据挖掘执行社交媒体 API 调用。使用 RAG 数据智能体执行情感分析。
- 使用预设指标,使用 API 代理 (Sheets API) 生成指标。
- 使用 API 代理生成报告。
- 使用 API 代理 (PowerPoint API) 将关键图形、图形和图表上传至 PowerPoint 幻灯片。
随着对更多类型的 LLM 代理进行建模,它们可以在代理群中相互交互,以有效解决问题。将问题限制在不同的代理垂直领域中,可以使用较小的模型构建代理。这需要减少自定义工作并保留模块化,进而为添加新功能、选择所需功能和简化部署扩展带来好处。在此生态系统中,每个代理都将另一个代理视为工具,并在需要时使用其帮助。
构建数据分析师代理
基于本节的概述,我们将详细讨论如何构建一个数据代理,用于与用于库存管理的 SQL 数据库进行通信。请注意,以下内容假设您已经阅读了构建您的首个 LLM 智能体应用,或者对 LLM 代理的基础知识有所了解。
选择 LLM
首先,选择您要使用的 LLM。在这个例子中,我们使用了Mixtral 8x7B LLM,它可以在NVIDIA NGC目录中找到。这个模型可以加速各种模型的使用,并且以API的形式提供。每个模型的前几次API调用是免费的,用于实验目的。
请注意,如果您使用的模型未经过调整以处理代理工作流,可以将以下提示重新表述为一系列选择题 (MCQ)。这应该有效,因为大多数模型都经过指令调整以处理 MCQ。详细了解微调。
选择用例
接下来,选择一个用例。本文的用例是与用于库存管理的 SQL 数据库通信。然后使用例如三个表填充该数据库。
请注意,以下信息仅供参考,并不打算传达实际细节。
suppliers_data = [
{"name": "Samsung Electronics", "address": "Seoul, South Korea", "contact": "800-726-7864"},
{"name": "Apple Inc.", "address": "Cupertino, California, USA", "contact": "800–692–7753"},
{"name": "OnePlus Technology", "address": "Shenzhen, Guangdong, China", "contact": "400-888-1111"},
{"name": "Google LLC", "address": "Mountain View, California, USA", "contact": "855-836-3987"},
{"name": "Xiaomi Corporation", "address": "Beijing, China", "contact": "1800-103-6286"},
]
products_data = [
{"name": "Samsung Galaxy S21", "description": "Samsung flagship smartphone", "price": 799.99, "supplier_id": 1},
{"name": "Samsung Galaxy Note 20", "description": "Samsung premium smartphone with stylus", "price": 999.99, "supplier_id": 1},
{"name": "iPhone 13 Pro", "description": "Apple flagship smartphone", "price": 999.99, "supplier_id": 2},
{"name": "iPhone SE", "description": "Apple budget smartphone", "price": 399.99, "supplier_id": 2},
{"name": "OnePlus 9", "description": "High performance smartphone", "price": 729.00, "supplier_id": 3},
{"name": "OnePlus Nord", "description": "Mid-range smartphone", "price": 499.00, "supplier_id": 3},
{"name": "Google Pixel 6", "description": "Google's latest smartphone", "price": 599.00, "supplier_id": 4},
{"name": "Google Pixel 5a", "description": "Affordable Google smartphone", "price": 449.00, "supplier_id": 4},
{"name": "Xiaomi Mi 11", "description": "Xiaomi high-end smartphone", "price": 749.99, "supplier_id": 5},
{"name": "Xiaomi Redmi Note 10", "description": "Xiaomi budget smartphone", "price": 199.99, "supplier_id": 5},
]
inventory_data = [
{"product_id": 1, "quantity": 150, "min_required": 30},
{"product_id": 2, "quantity": 100, "min_required": 20},
{"product_id": 3, "quantity": 120, "min_required": 30},
{"product_id": 4, "quantity": 80, "min_required": 15},
{"product_id": 5, "quantity": 200, "min_required": 40},
{"product_id": 6, "quantity": 150, "min_required": 25},
{"product_id": 7, "quantity": 100, "min_required": 20},
{"product_id": 8, "quantity": 90, "min_required": 18},
{"product_id": 9, "quantity": 170, "min_required": 35},
{"product_id": 10, "quantity": 220, "min_required": 45},
为了进行实验,请将前面的条目存储在 SQLite 数据库中。这些条目是针对图 2 所示的模式定制的。目的是创建一个简化版本的数据库,通常是任何库存管理系统的核心。这些数据库包含有关当前库存水平、供应商等的信息。
LLM 代理组件
LLM 代理包含四个关键组件:工具、内存模块、规划模块和代理核心。有关此示例组件的详细信息如下。
工具
此示例使用以下两种工具:
- 计算器:用于查询数据后所需的任何基本计算。为了保持简单,此处使用了 LLM。可以添加任何服务或 API 来解决所述问题。
- SQL 查询执行器:用于查询原始数据的数据库。
显存
用于跟踪智能体所有操作的简单缓冲区或列表。
规划
线性贪婪方法。为实现这一点,请为“生成最终答案”创建一个“人工工具”。以下部分将进一步探讨这一想法。
智能体核心
是时候整合所有内容了。智能体核心 LLM 的提示如下所示:
""" [INST]You are an agent capable of using a variety of TOOLS to answer a data analytics question.
Always use MEMORY to help select the TOOLS to be used.
MEMORY
TOOLS
- Generate Final Answer: Use if answer to User's question can be given with MEMORY
- Calculator: Use this tool to solve mathematical problems.
- Query_Database: Write an SQL Query to query the Database.
ANSWER FORMAT
```json
{
"tool_name": "Calculator"
}
```
[/INST]
User: {User's Question}
Assistant: ```json
{
"tool_name": """
前面的提示包含所有工具和相关信息。您可以设计核心的代码线束,以便给定除“生成最终答案”的人工工具以外的任何工具,智能体将附加所使用工具的结果以记忆并重新访问情况。这是一种迭代式贪婪方法,可针对单个步骤做出“最佳”决定。
if tool_selection['tool_name'] == "Query_Database":
Generate_SQL_Query(question, memory, schema)
QueryDB
Append results to memory
Agent(question, memory)
if tool_selection['tool_name'] == "Generate Final Answer":
Final_Output = llm(question, memory)
return final output
if tool_selection['tool_name'] == "Calculator":
Ask_Math_Question_To_LLM(question, memory)
Append results to memory
Agent(question, memory)
总而言之,数据代理可以访问规划功能、内存、多种数据访问工具以及执行相关分析任务的方法。图 3 显示了数据代理的一般架构。
数据代理示例
本节提供了一个示例,展示了如何一起使用不同的工具来解决业务问题。在这样的场景中使用代理的主要优势是,用户不需要了解数据库的详细信息或运行查询的技术技能。
问题:“Google Pixel 6 的剩余库存量是多少?”
答案:根据从库存系统中检索到的信息,您目前有 80 个 Google Pixel 6 的剩余库存单位。此计算是从当前库存数量 (100) 中减去所需的最小数量 (20) 后得出的。(有关源数据,请参阅上文。)
为解决此问题,智能体执行了以下步骤:
第一步:QueryDB 工具
- 生成 SQL
- 查询数据库
- 将结果存储在内存中
第二步:使用 Calculator 工具
- 使用 LLM 解决数学问题
- 将结果存储在内存中。请注意,这可以替换为代码生成和代码执行。要了解有关动态工具的更多信息,请参阅构建由 LLM 提供支持的 API Agent 以执行任务。
第 3 步:生成最终答案
以下提示适用于生成 SQL 后的代理核心 LLM。
"""
[INST]You are an agent capable of using a variety of TOOLS to answer a data analytics question.
Always use MEMORY to help select the TOOLS to be used.
MEMORY
Previous Question: How much excess inventory do we have for 'Google Pixel 6'?
SQL Query:
SELECT
inventory.id,
inventory.product_id,
inventory.quantity,
inventory.min_required,
products.name
FROM
inventory
JOIN
products ON inventory.product_id = products.id
WHERE
products.name = 'Google Pixel 6';
Retrieved Information: [(7, 7, 100, 20, 'Google Pixel 6')]
TOOLS
- Generate Final Answer: Use if answer to User's question can be given with MEMORY
- Calculator: Use this tool to solve mathematical problems.
- Query_Database: Write an SQL Query to query the Database.
ANSWER FORMAT
```json
{
"tool_name": "Calculator"
}
```
[/INST]
User: How much excess inventory do we have for 'Google Pixel 6'?
Assistant: ```json
{
"tool_name": """
构建数据代理应用时的主要注意事项
在构建 LLM 代理应用程序时,请谨记以下主要注意事项。
扩展工具
想象一下,一个案例包含 10 万个表和 100 个工具,而不是 3 个表和 3 个工具。适应这种扩展的一种方法是添加一个中间 RAG 步骤。此步骤可能会提取最相关的 5 个工具供代理选择。这可以应用于内存、数据库模式或代理需要考虑的任何其他选项。
使用多个向量数据库
您还可以构建主题路由器,以便在多个 SQL 或向量数据库的情况下将查询导向正确的数据库。
更好地规划实施
此处介绍了一个用于实现贪婪迭代解决方案的简单线性求解器。它可以被任务分解模块或各种计划编译器取代,以生成更高效的执行计划。
总结
本文介绍了如何构建用于数据分析的 LLM 智能体应用的基础知识,以帮助您熟悉构建智能体背后的概念。我强烈建议您探索开源生态系统,为您的应用选择最佳智能体框架。
准备好构建您自己的生产 LLM 数据代理了吗?查看采用检索增强生成技术的 AI 聊天机器人免费动手实验室,帮助您构建可靠且可扩展的解决方案。
如需深入了解关于 LLM 代理的信息,请阅读构建由 LLM 提供支持的 API Agent 以执行任务。