llamaindex实战-Agent-在Agent中和数据库对话(本地部署)

概述

本文实现了一个简单的智能Agent,该Agent先从数据库中查询出数据,然后再通过工具函数来对数据进行处理。这是一个非常常见的场景。从这个场景可以扩展到多个实际的场景。

同样,本文的实验都是在本地一台:16C32G的linux机器(CPU)上完成。

数据准备

在mysql数据库中创建一张表:

CREATE TABLE \`city\_stats\` (  
  \`city\_name\` varchar(100) DEFAULT NULL,  
  \`population\` int(11) DEFAULT NULL,  
  \`country\` varchar(100) DEFAULT NULL  
) ENGINE\=InnoDB DEFAULT CHARSET\=latin1;

在数据表中插入几条数据:

city_namepopulationcountry
Toronto2930000Canada
Tokyo13929286Japan
Berlin600000Germany

实现逻辑

  1. 定义本地嵌入模型,并把本地嵌入模型的对象赋值给Settings.embed_model变量。这个是llamaindex的一个设置项。

    注意:这个一定要用本地嵌入模型来进行重置,否则会默认使用openai的接口,这样就达不到本地部署的目的了。

  2. 构建数据库查询引擎。这个主要是通过创建NLSQLTableQueryEngine对象来实现的。通过这个对象,就可以使用自然语言和数据库对话。

  3. 构建一系列的工具函数,通过这些工具函数来实现额外的一些功能。

  4. 把数据库查询引擎通过QueryEngineTool对象封装成工具链中的一个对象,这样Agent就可以把查询引擎当成工具链中的一个工具来选择和使用了。

  5. 最后就是要写好提示词,给Agent一个明确的指令。我这里的指令是:先查询出两个城市的人口数,然后再调用add函数把这两个城市的人口数相加。

注意:该实验只是一个例子,演示了数据库查询引擎和Agent工具函数结合使用。这种组合实际上还可以实现更多的场景的功能。

实现代码

from llama\_index.core.agent import ReActAgent  
from llama\_index.llms.openai import OpenAI  
from llama\_index.core.tools import FunctionTool  
from llama\_index.core import SimpleDirectoryReader, VectorStoreIndex, Settings  
from llama\_index.core.tools import QueryEngineTool  
from llama\_index.llms.ollama import Ollama  
  
from llama\_index.embeddings.huggingface import HuggingFaceEmbedding  
from llama\_index.llms.ollama import Ollama  
from llama\_index.core import SQLDatabase  
from llama\_index.llms.ollama import Ollama  
from ollama import Client  
  
from llama\_index.core.query\_engine import NLSQLTableQueryEngine  
  
from sqlalchemy import (  
    create\_engine,  
    select,  
)  
from sqlalchemy import insert  
  
\# 构建本地嵌入模型  
local\_model \= "/opt/models/BAAI/bge-base-en-v1.5"  
\# bge-base embedding model  
Settings.embed\_model \= HuggingFaceEmbedding(model\_name\=local\_model)  
  
\# 创建本地大模型  
#Settings.llm = Ollama(model="llama3.2", request\_timeout=360)  
Settings.llm \= Ollama(model\="gemma2", request\_timeout\=360)  
  
\## 创建数据库查询引擎  
engine \= create\_engine("mysql+pymysql://admin:admin123@192.168.1.54/llmdb")  
\# prepare data  
sql\_database \= SQLDatabase(engine, include\_tables\=\["city\_stats"\])  
query\_engine \= NLSQLTableQueryEngine(  
    sql\_database\=sql\_database,   
    tables\=\["city\_stats"\],   
    llm\=Settings.llm  
)  
  
\# 创建工具函数  
def multiply(a: float, b: float) \-> float:  
    """Multiply two numbers and returns the product"""  
    return a \* b  
  
multiply\_tool \= FunctionTool.from\_defaults(fn\=multiply)  
  
def add(a: float, b: float) \-> float:  
    """Add two numbers and returns the sum"""  
    return a + b  
  
add\_tool \= FunctionTool.from\_defaults(fn\=add)  
  
\# 把数据库查询引擎封装到工具函数对象中  
population\_tool \= QueryEngineTool.from\_defaults(  
    query\_engine,   
    name\="city\_population",  
    description\="A SQLTable query engine about population of the city and country."  
)  
  
\# 构建RAG查询引擎  
agent \= ReActAgent.from\_tools(\[multiply\_tool, add\_tool, population\_tool\], verbose\=True)  
\# 通过agent给出指令  
response \= agent.chat("Please get the populations of Toronto city and Tokyo city from database table, and the add the population!")  
  
print(response)

代码给出的指令是:查出Toronto和Tokyo城市的人口,然后把这两个城市的人口数量加起来,最终得到输出结果。这只是一个简单的例子,可以根据实际业务场景来修改例子进行测试。

结果输出

python agent\_rag\_db.py   
\> Running step 1a514ec3-de70-440d-a58d-0304ff0a02e5. Step input: Please get the populations of Toronto city and Tokyo city from database table, and the add the population!  
Thought: The current language of the user is: English. I need to use a tool to help me answer the question.  
Action: city\_population  
Action Input: {'input': 'Toronto'}  
Observation: Toronto has a population of 2,930,000.    
  
\> Running step 84aa20cf-31c6-402e-95d5-8b265b8ddef8. Step input: None  
Thought: The current language of the user is: English. I need to use a tool to help me answer the question.  
Action: city\_population  
Action Input: {'input': 'Tokyo'}  
Observation: The population of Tokyo is 13,929,286.   
  
Let me know if you have any other questions about Tokyo or cities around the world!  
\> Running step 1f40acfb-1b80-4962-80e6-cbe5395182a6. Step input: None  
Thought: I can answer without using any more tools. I'll use the user's language to answer  
Answer: The population of Toronto is  2,930,000 and the population of Tokyo is 13,929,286. Their combined population is 16,859,286.  
The population of Toronto is  2,930,000 and the population of Tokyo is 13,929,286. Their combined population is 16,859,286.

从以上输出可以看出,Agent把我的指令规划成了3个步骤(这个是不是最优的?),先分两步进行查询结果,然后再把两步得结果相加得到最终结果。

要注意:Agent有planning能力,但这个能力也有好有不好,规划得好,那么可能实现的效率就高。从以上输出来看,我们的Agent的规划步骤并不一定是最优的(其实我们可以一步查询出两个城市的人口,而不是分成两步),这个取决于大模型的能力,也和提示词的写法有很大的关系。

小结

最终,我们给Agent的指令,Agent通过自动规划,计算出了我们想要的结果。但这个过程有很多可以去优化的点。一是通过自然语言和数据库的数据表对话的能力。二是Agent的规划能力。规划的好,效率就高,规划的不好就会浪费资源。这里我们可以通过优化我们的提示词来更好的让Agent给出好的规划。

如何系统学习掌握AI大模型?

AI大模型作为人工智能领域的重要技术突破,正成为推动各行各业创新和转型的关键力量。抓住AI大模型的风口,掌握AI大模型的知识和技能将变得越来越重要。

学习AI大模型是一个系统的过程,需要从基础开始,逐步深入到更高级的技术。

这里给大家精心整理了一份全面的AI大模型学习资源,包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2024行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

在这里插入图片描述

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

全套的AI大模型学习资源已经整理打包,有需要的小伙伴可以微信扫描下方优快云官方认证二维码,免费领取【保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值