AI代理是一个由规划能力、内存和执行用户请求的任务的工具组成的系统。对于数据分析或与复杂系统的交互等复杂任务,应用程序可能依赖于不同类型代理之间的协作。
本文解释了构建能够处理细微的数据分析任务的准确LLM应用程序所需的代理类型。它通过一个构建数据分析师代理应用程序的用例来逐步说明,包括代码片段。最后,它为AI开发人员提供了一些在优化和构建LLM代理应用程序时需要考虑的注意事项。
首先,本节解释两种主要的LLM代理类型以及它们的工作方式——数据代理和API或执行代理。我还将介绍一个代理群用例,其中涉及多个代理协作解决问题。请注意,这些代理类型在某种程度上代表了光谱的两端。可以为特定的用例创建混合的、专门构建的代理。
数据代理
数据代理通常是为提取目标而设计的。换句话说,数据代理可以帮助用户从各种数据源中提取信息。它们有助于完成辅助推理任务。
例如,金融分析师可能会问:“今年有多少季度公司的现金流为正?”这种问题需要推理、搜索(结构化、非结构化或两者结合)和规划能力。
API或执行代理
API或执行代理是为执行目标而设计的。这些代理执行用户请求的一个或多个任务。
想象一下,同一位金融分析师正在使用Excel电子表格,其中包含过去一年10只股票的收盘价。分析师希望根据一个或多个统计公式对这些收盘价进行排序。需要链接多个Excel API来完成此任务。
代理群
代理群涉及多个数据代理和多个API代理以分散的方式协作解决复杂问题。代理群是为包括提取和执行任务在内的工作流程而设计的,这些任务需要不同形式的规划和代理核心工具。
例如,假设金融分析师想要研究投资规划中表现最好的五大快餐股。达到此目标所需的一系列行动如下所述,并在图1中概述。
随着越来越多的LLM代理被建模,它们可以在代理群中相互交互以有效地解决问题。将问题约束为不同的代理垂直领域,可以构建具有较小模型的代理。这需要较少的自定义努力,并保持模块化,从而为添加新功能、选择所需功能和简化部署扩展提供好处。在这个生态系统中,每个代理都像工具一样看待另一个代理,并在需要时寻求其帮助。
以这个通用分类法为基础,本节深入探讨为与SQL数据库进行库存管理的用例构建数据代理。
选择LLM
首先确定要使用哪个LLM。本示例使用NVIDIA NGC目录中提供的Mixtral 8x7B LLM。它加速了各种模型,并使其可作为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的提示大致如下:
"""<s> [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 <Empty> 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)来得出的。(数据来源见上文。)
为了解决这个问题,代理执行了以下步骤:
步骤1:QueryDB工具
步骤2:计算器工具
步骤3:最终答案生成
以下是在生成SQL后针对代理核心LLM的提示。
""" <s> [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个工具,而不是三个表格和三个工具。适应这种扩展的一种方法是添加一个中间RAG步骤。此步骤可能会拉取代理选择的最相关的前五个工具。这可以应用于内存、数据库模式或代理需要考虑的任何其他选项。
与多个向量数据库一起工作
在有多个SQL或向量数据库的情况下,还可以构建一个主题路由器,将查询定向到正确的数据库。
更好的实施规划
这里展示了一个简单的线性求解器来实现贪婪迭代解决方案。它可以被任务分解模块或某种计划编译器取代,以生成更有效的执行计划。
总结
本文解释了如何构建用于数据分析的LLM代理应用程序的基本概念,以帮助熟悉构建代理背后的概念。强烈建议探索开源生态系统,为你的应用程序选择最佳的代理框架。