AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


llamaindex实战-Agent-在Agent中使用RAG查询(本地部署)
发布日期:2024-11-15 12:00:07 浏览次数: 1572 来源:大数据架构师修行之路


llamaindex实战-Agent-在Agent中使用RAG查询(本地部署)

概述

本文说明如何在Agent中加入RAG查询引擎,这样就可以在Agent中使用外部的知识库,从而让Agent可以进行外部知识库中数据的查询,让Agent更加强大。

这种模式在很多场景下都很有用,比如:我们很多时候需要先查询或计算某个指标后,若数据或指标符合某个条件时,再通过工具函数来进行处理。该文的实验是通过llamaindex自带的一个例子来完成,我们可以通过该例子结合自己的业务来进行拓展。

本文运行的代码完全是在x86机器上,并且都是在本地部署跑通,不依赖openai的任何接口,完全免费。

实现思路

为了演示如何在Agent中使用 RAG 引擎,我们将创建一个非常简单的 RAG 查询引擎。我们的源数据将是维基百科上关于 2023 年加拿大联邦预算的页面,并已将其打印为 PDF 格式。

通过rag和agent结合,可以先从文档数据中获取到对应的数据,让后再调用tools函数,来对文档中读取到的数据进行处理。

注意:这些步骤都是大模型根据语义的理解选取合适的工具,自动执行的。而我们只需要给我们的代码指令,告诉它,我们想要什么即可。

运行环境

我的环境是一台虚拟机,没有GPU,配置如下:

  • cpu类型: x86

  • 核数:16核

  • 内存:32G


实现步骤

  1. 准备好本地嵌入模式

从huggingface或其他地方下载bge-base-en-v1.5模型的所有文件到以下目录:

/opt/models/BAAI/bge-base-en-v1.5


  1. 准备本地大模型

直接可以通过ollama来获取大模型到本地,我这里使用的是gemm2。

ollama pull gemma2


  1. 把RAG查询引擎加入到Agent工具列表中

# rag pipeline as a tool
budget_tool = QueryEngineTool.from_defaults(
   query_engine,
   name="canadian_budget_2023",
   description="A RAG engine with some basic facts about the 2023 Canadian federal budget."
)

# 把rag查询引擎作为agent的工具,加入到agent的工具列表中
agent = ReActAgent.from_tools([multiply_tool, add_tool, budget_tool], verbose=True)


  1. 我们要查询的文档内容如下

把https://en.wikipedia.org/wiki/2023_Canadian_federal_budget保存成pdf文档,内容如上图所示,并保存到./agent_rag_data目录下。

代码实现

首先通过ollama下载大模型到本地,并下载并保存本地嵌入模型,我这里下载并使用的是:bge-base-en-v1.5模型,该模型所有的文件都保存在/opt/models/BAAI/bge-base-en-v1.5目录中。

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

# 创建本地大模型
#Settings.llm = Ollama(model="llama3.2", request_timeout=360)
Settings.llm = Ollama(model="gemma2", request_timeout=360)

local_model = "/opt/models/BAAI/bge-base-en-v1.5"
# 创建本地嵌入大模型
Settings.embed_model = HuggingFaceEmbedding(model_name=local_model)

# 创建其他数据处理的工具函数
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)

# 构建知识库查询引擎
documents = SimpleDirectoryReader("./agent_rag_data").load_data()
index = VectorStoreIndex.from_documents(documents,show_progress=True)
query_engine = index.as_query_engine()

# test 2
# rag pipeline as a tool
budget_tool = QueryEngineTool.from_defaults(
   query_engine,
   name="canadian_budget_2023",
   description="A RAG engine with some basic facts about the 2023 Canadian federal budget."
)

agent = ReActAgent.from_tools([multiply_tool, add_tool, budget_tool], verbose=True)
response = agent.chat("What is the total amount of the 2023 Canadian federal budget multiplied by 3? Go step by step, using a tool to do any math."
)
print(response)


通过gemm2本地大模型,输出的结果如下:

python agent_rag.py 
Parsing nodes: 100%|█████████████████████████████████████████████████████████████████████████| 4/4 [00:00<00:00, 1161.94it/s]
Generating embeddings: 100%|███████████████████████████████████████████████████████████████████| 4/4 [00:01<00:00,  2.92it/s]
> Running step a8beded3-6a08-4d4d-acec-189c63f0fbf3. Step input: What is the total amount of the 2023 Canadian federal budget multiplied by 3? Go step by step, using a tool to do any math.
Thought: The current language of the user is: English. I need to use a tool to help me answer the question.
Action: canadian_budget_2023
Action Input: {'input': 'What is the total amount of the 2023 Canadian federal budget?'}
Observation: $496.9 billion

> Running step a783cc6d-ee83-4166-af2c-e2ea58333a9a. Step input: None
Thought: I need to multiply this by three.
Action: multiply
Action Input: {'a': 496.9, 'b': 3}
Observation: 1490.6999999999998
> Running step 8dfa9d5c-c729-454d-bc97-7c59beba99b2. Step input: None
Thought: I can answer without using any more tools. I'll use the user's language to answer
Answer: The total amount of the 2023 Canadian federal budget multiplied by 3 is $1,490.7 billion.
The total amount of the 2023 Canadian federal budget multiplied by 3 is $1,490.7 billion.


从以上结果可以看到,gemm2结合嵌入模型,rag模式从文档中获取到了$496.9 billion这个数据,然后再对该数据乘以3,就得到了最终要求的结果。

注意:可以使用其他大模型试一下,比如:llama3,有时候效果并不是很好,不能得到想要的答案。所以,这个还需要进一步测试和优化,才能更好的使用。



53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询