微信扫码
与创始人交个朋友
我要投稿
本文说明如何在Agent中加入RAG查询引擎,这样就可以在Agent中使用外部的知识库,从而让Agent可以进行外部知识库中数据的查询,让Agent更加强大。
这种模式在很多场景下都很有用,比如:我们很多时候需要先查询或计算某个指标后,若数据或指标符合某个条件时,再通过工具函数来进行处理。该文的实验是通过llamaindex自带的一个例子来完成,我们可以通过该例子结合自己的业务来进行拓展。
本文运行的代码完全是在x86机器上,并且都是在本地部署跑通,不依赖openai的任何接口,完全免费。
为了演示如何在Agent中使用 RAG 引擎,我们将创建一个非常简单的 RAG 查询引擎。我们的源数据将是维基百科上关于 2023 年加拿大联邦预算的页面,并已将其打印为 PDF 格式。
通过rag和agent结合,可以先从文档数据中获取到对应的数据,让后再调用tools函数,来对文档中读取到的数据进行处理。
注意:这些步骤都是大模型根据语义的理解选取合适的工具,自动执行的。而我们只需要给我们的代码指令,告诉它,我们想要什么即可。
我的环境是一台虚拟机,没有GPU,配置如下:
cpu类型: x86
核数:16核
内存:32G
从huggingface或其他地方下载bge-base-en-v1.5模型的所有文件到以下目录:
/opt/models/BAAI/bge-base-en-v1.5
直接可以通过ollama来获取大模型到本地,我这里使用的是gemm2。
ollama pull gemma2
# 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)
把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+中大型企业
2024-12-17
llamaindex实战-ChatEngine-Context(上下文)模式
2024-12-01
LlamaIndex,让AI唤醒你的数据
2024-11-29
llamaindex实战-Agent-自定义工具函数
2024-11-22
llamaindex实战-Agent-让Agent调用多个工具函数(本地部署)
2024-11-19
llamaindex实战-Workflow:工作流入门(本地部署断网运行)
2024-11-07
深度解析 REAcT Agent 的实现:利用 LlamaIndex 和 Gemini 提升智能代理工作流
2024-11-04
手把手教你用Coze零代码搭建一个智能搜索智能体,高时效性、保姆级!
2024-10-11
深入解析LlamaIndex Workflows【下篇】:实现ReAct模式AI智能体的新方法
2024-07-09
2024-04-20
2024-06-05
2024-04-25
2024-04-28
2024-05-09
2024-07-20
2024-04-26
2024-06-19
2024-04-08