如何使用Llama Index和MonsterAPI构建AI代理

2024年09月10日 由 alex 发表 642 0

介绍

AI 代理是未来的驱动力,它们可以推动未来的发展。AI 代理在 AI 的成长和新技术进步中变得越来越不可或缺。AI 代理是模仿人类属性的应用程序,可以互动、推理,甚至做出适当的决策,以高度自治的方式实现特定目标,并实时执行多项任务,这对于大型语言模型(LLMs)而言是不可能的。


在本文中,我们将借助 MonsterAPIs 和 LlamaIndex 工具详细了解 AI 代理及其工作原理。LlamaIndex 是一个强大的框架,旨在构建和管理大规模语言模型,能够与各种数据源无缝整合。其关键特性包括高效的基于向量的检索、可定制的查询引擎和对复杂索引的支持,使其成为开发 AI 驱动应用程序的理想选择。LlamaIndex 还提供了一套工具和抽象,方便地开发 AI 代理。


我们还将使用 MonsterAPI 提供的 LLM API 来构建具有实际应用的代理程序。MonsterAPI 是一个平台,提供用于微调、测试、评估和部署最新大型语言模型(如 Llama 3、Gemma、Mistral、Stable diffusion 等)的 API 套件。那么让我们开始吧:


什么是 AI 代理?


7


AI 代理是旨在模仿人类行为的自主系统,使其能够执行类似于人类思维和观察的任务。代理在与大型语言模型(LLMs)、工具和记忆结合的环境中行动,以执行各种任务。AI 代理在其工作方式和生成输出的过程中与大型语言模型有所不同。我们将在本文中介绍 AI 代理的一些基本属性,并详细讨论 LLMs 和 AI 代理之间的区别,以便全面了解 AI 代理。

  1. AI 代理像人类一样思考:AI 代理使用工具执行特定功能以产生某种输出。例如,搜索引擎、数据库搜索、计算器等。
  2. AI 代理像人类一样行动:与人类类似,AI 代理使用一系列的动作和规划来使用工具执行特定动作并生成输出。
  3. AI 代理像人类一样观察:通过使用框架进行规划,代理可以对特定输入做出反应、反思并采取适当的行动。记忆组件允许 AI 代理保留先前的步骤和行动,以便有效地生成所需的输出。


让我们看看 LLM 和 AI 代理之间的核心区别,以清楚地区分这两种技术。


8


与 AI 代理合作

代理由一组组件开发而成,主要包括记忆层、工具、模型和推理循环,这些组件共同协作以完成一组任务或用户可能想解决的特定任务。例如,使用天气代理通过用户的语音或文本命令提取实时天气数据。让我们深入了解构建 AI 代理的每个组件:


0_vpGiYtVHqkxdfDQj


  1. 推理循环:推理循环是 AI 代理的核心,用于规划行动和做出决策,通过处理输入、提炼输出来在循环结束时产生所需的结果。
  2. 记忆层:记忆在 AI 代理中至关重要,它能够在处理用户输入的整个过程中记住规划、思想和行动,从而生成特定的结果。记忆可以是短期的,也可以是长期的,具体取决于问题的性质。
  3. 模型:大型语言模型帮助综合和生成结果,使人类可以理解和解释。
  4. 工具:这些是代理可以利用来执行特定任务的外部内置函数,例如从数据库检索数据、调用 API 获取实时天气数据或使用计算器执行特定计算,这些都提升了代理的能力。


组件之间的交互:

推理循环不断与模型和工具进行交互。循环利用模型的输出来告知决策,而工具则被用来执行这些决策。


这种交互形成了一个闭环,数据在组件之间流动,使代理能够无缝处理信息、做出明智的决策并采取适当的行动。


让我们看看 AI 代理的用例,然后我们将看看使用 MonsterAPI 的 AI 代理的实时代码示例。


AI 代理的使用模式:

LlamaIndex 提供高级工具和类,使开发者无需担心执行和实现问题就能开发 AI 代理。


在推理循环中,LlamaIndex 提供函数调用代理,这些代理可以很好地整合 LLMs、ReAct 代理、向量存储和高级代理,从而构建从原型到生产的有效工作代理应用程序。


在 LlamaIndex 中,代理的开发遵循以下模式。我们将在稍后讨论 AI 代理的详细开发过程。


from llama_index.agent.openai import OpenAIAgent
from llama_index.llms.openai import OpenAI
# import and define tools
...
# initialize llm
llm = OpenAI(model="gpt-3.5-turbo-0613")
# initialize openai agent
agent = OpenAIAgent.from_tools(tools, llm=llm, verbose=True)


AI 代理的使用案例 AI 代理在现实世界中有着广泛的使用案例,可以完成常见任务,提高时间效率,同时提升企业的营收。以下是一些常见的使用案例:

  1. Agentic RAG:构建一个上下文增强系统,以利用特定业务数据集来增强用户查询响应和特定输入查询答案的准确性。
  2. SQL 代理:文本到 SQL 是另一个使用案例,代理利用 LLMs 和数据库生成自动化的 SQL 查询,并输出用户友好的结果,而无需手动编写 SQL 查询。
  3. 工作流程助手:构建一个代理,可以与常见的工作流程助手(如天气 API、计算器、日历等)一起工作。
  4. 代码助手:帮助审查、编写和增强开发人员代码编写体验的助手。
  5. 内容策展:AI 代理可以推荐个性化内容,如文章、博客文章,并为用户总结信息。
  6. 自动化交易:AI 代理可以提取实时市场数据,包括情感分析,自动进行交易,以最大化企业的利润。
  7. 威胁检测:AI 代理可以监控网络流量,识别潜在的安全威胁,并实时响应网络攻击,增强组织的网络安全防护能力。


使用 LlamaIndex 和 MonsterAPI 构建文本到 SQL 代理

在本部分中,我们将使用 LlamaIndex 工具和 MonsterAPI 访问大型语言模型来构建文本到 SQL 应用程序。在深入代码之前,让我们先看看 MonsterAPI 平台的概述。


MonsterAPI 概述

MonsterAPI 是一个易于使用的无代码/低代码工具,简化了基于大型语言模型的应用程序(包括 AI 代理)的部署、微调、测试、评估和错误管理。与其他云平台相比,它的成本更低,并且可以免费用于个人项目或研究工作。它支持多种模型,如文本生成、图像生成和代码生成模型。在我们的示例中,MonsterAPI 模型 API 访问存储在 LlamaIndex 向量存储中的自定义数据集,以基于新添加的数据集提供增强的查询答案。


安装必要的库并设置环境

首先,我们将安装必要的库和模块,包括 MonsterAPI LLMs、LlamaIndex、sqlalchemy 和 llamaindex embeddings 以进一步开发代理。同时,在 MonsterAPI 平台上注册以获取用于访问大型语言模型的 API 密钥。


!pip install pymysql
!pip install llama_index
!pip install --force-reinstall 'sqlalchemy<2.0.0''sqlalchemy<2.0.0'
!pip install llama-index-callbacks-aim
!pip install sqlalchemy
!pip install monsterapi
!pip install llama-index-llms-monsterapi
!pip install llama-index-embeddings-huggingface
# import logging modules to configure login parameters
import logging
import sys
import pymysql
logging.basicConfig(stream=sys.stdout, level=logging.INFO, force=True)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from IPython.display import Markdown, display
# db credentials 
db_user = "your_username"
db_password = "your_password"
db_host = "your_host"
db_name = "your_name"
# create_engine, text classes from sqlalchemy
from sqlalchemy import create_engine, text
# Construct the connection string
connection_string = f"mysql+pymysql://{db_user}:{db_password}@{db_host}/{db_name}"
# Create an engine instance
engine = create_engine(connection_string)
# Test the connection using raw SQL
with engine.connect() as connection:
    result = connection.execute(text("show tables"))
    for row in result:
        print(row)
---------------------------------[Output]-------------------------------------
('Customers',)
('OrderDetails',)
('Orders',)
('info',)
('table_36370395d9314572970b325bee42817d',)
('table_59af3c5a5388482193f88093fc2eaa36',)


在上面的代码中,首先,你需要使用可用的数据库凭据连接 MySQL 数据库。创建一个数据库连接字符串对象,然后创建一个连接数据库表的引擎。一旦连接建立,我们就可以获取查询目的的表详情。


LlamaIndex SQL 数据库实例

一旦数据库连接上,我们使用 llamaindex 核心库中的 SQLDatabase 类来获取选定表的表架构。在创建了 SQL 数据库后,我们就可以继续开发 NL2SQL 应用程序。


from llama_index.core import SQLDatabase
# select tables to connect for application
tables = ['table_36370395d9314572970b325bee42817d', 'table_59af3c5a5388482193f88093fc2eaa36']
sql_database = SQLDatabase(engine, include_tables=tables, sample_rows_in_table_info=2)


使用 LlamaIndex 模块开发文本到 SQL 的应用程序

现在,我们将设置一个令牌计数器并配置大型语言模型,以便通过数据库表处理查询和生成响应。


import os
from llama_index.llms.monsterapi import MonsterLLM
import tiktoken
from llama_index.core.callbacks import CallbackManager, TokenCountingHandler
# token counter using token counting handler
token_counter = TokenCountingHandler(
    tokenizer=tiktoken.encoding_for_model("Meta-Llama-3-8B-Instruct").encode
)
# callback manager for encoding input queries
callback_manager = CallbackManager([token_counter])
# set up monsterapi key
os.environ["MONSTER_API_KEY"] = "YOUR_API_KEY"
# create an instance of llama-3-8b model
model = "meta-llama/Meta-Llama-3-8B-Instruct"
llm = MonsterLLM(model=model, temperature=0.75)
# setting up service context for llm
service_context = ServiceContext.from_defaults(
  llm=llm,callback_manager=callback_manager
)


该代码为一个使用基于 LlamaIndex 模型的代理应用程序设置了基本基础设施,并托管在 MonsterAPI 上。以下是它实现的功能:

  • 令牌管理:TokenCountingHandler 负责跟踪使用的令牌数量,这在与大型语言模型交互的应用程序中,对于管理成本和性能至关重要。
  • 模型初始化:MonsterLLM 实例配置了一特定模型(“Meta-Llama-3–8B-Instruct”)并设定温度参数,以控制响应的变异性。
  • 服务上下文:创建了一个 ServiceContext 用于管理模型操作,包括令牌计数,确保交互的流畅和高效。


创建 SQL 表节点映射

使用 LlamaIndex 向量存储、嵌入以及 ObjectIndex,我们可以列出数据库的表并为提示生成表架构,以便 MonsterAPI 模型 API 根据用户的查询生成合适的 SQL 查询。


from llama_index.core.embeddings import resolve_embed_model
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.objects import ObjectIndex, SQLTableNodeMapping, SQLTableSchema
import pandas as pd
# list all the tables from database and crate table schema for prompt to LLM
tables = list(sql_database._all_tables)
table_node_mapping = SQLTableNodeMapping(sql_database)
table_schema_objs = []
for table in tables:
    table_schema_objs.append((SQLTableSchema(table_name = table)))


初始化SQL表查询检索引擎


from llama_index.core.indices.struct_store.sql_query import SQLTableRetrieverQueryEngine
# create an object index to store vectors 
obj_index = ObjectIndex.from_objects(
    table_schema_objs,
    table_node_mapping,
    VectorStoreIndex
)
# initializing query engine 
query_engine = SQLTableRetrieverQueryEngine(
    sql_database, obj_index.as_retriever(similarity_top_k=3), service_context=service_context
)
# Ask query to query engine and store it in a response variable
response = query_engine.query("How many people have previous work experience?")


这个代码片段使用 LlamaIndex 的 SQLTableRetrieverQueryEngine 实现了一个查询引擎,与数据库交互。该过程涉及以下几个关键步骤:

  1. 创建对象索引:创建一个 ObjectIndex 来存储向量,代表结构化数据对象,如数据库表(table_schema_objs 和 table_node_mapping)。该索引配置为使用 VectorStoreIndex 来管理和检索这些基于相似性的向量。
  2. 初始化查询引擎:通过传入一个 SQL 数据库(sql_database),一个配置为返回最相似的前3个结果的检索器对象索引(similarity_top_k=3),以及管理与数据库交互的服务上下文(service_context),来初始化 SQLTableRetrieverQueryEngine。
  3. 执行查询:使用查询引擎对数据库执行查询,要求提供有过工作经验的人的信息。该查询的响应存储在 response 变量中。


通过这些步骤,我们可以使用自然语言查询数据库,并获得相应的答案,而无需编写明确的 SQL 查询来回答业务问题。


总结

综上所述,AI 代理正在改变我们与 AI 技术交互的方式,通过拥有AI助手或工具,模拟人类思维和行为自主执行任务。



文章来源:https://medium.com/the-modern-scientist/how-to-build-an-ai-agent-using-llama-index-and-monsterapi-50dde12ba97e
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消