llamaindex实战-ChatEngine-ReAct Agent模式

server/2024/12/1 22:34:08/

概述

ReAct 是一种基于Agent的聊天模式,构建在数据查询引擎之上。对于每次聊天交互,代理都会进入一个 ReAct 循环:

  • 首先决定是否使用查询引擎工具并提出适当的输入

  • (可选)使用查询引擎工具并观察其输出

  • 决定是否重复或给出最终答复

这种方法很灵活,因为它可以灵活地选择是否查询知识库,它是基于Agent来实现的。然而,表现也更依赖于LLM的质量。您可能需要进行更多强制,以确保它选择在正确的时间查询知识库,而不是产生幻觉答案。

实现逻辑

  1. 构建和使用本地大模型。这里使用的是gemma2这个模型,也可以配置其他的大模型

  2. 从文档中构建索引

  3. 把索引转换成查询引擎:index.as_chat_engine,并设置chat_mode为react。

注意:我这里使用的是本地大模型gemm2,效果可能没有openai的好。

实现代码

from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.ollama import Ollamalocal_model = "/opt/models/BAAI/bge-base-en-v1.5"# bge-base embedding model
Settings.embed_model = HuggingFaceEmbedding(model_name=local_model)
# ollama
Settings.llm = Ollama(model="gemma2", request_timeout=360.0)from llama_index.core import VectorStoreIndex, SimpleDirectoryReaderdata = SimpleDirectoryReader(input_dir="./data/paul_graham/").load_data()
index = VectorStoreIndex.from_documents(data)# 设置使用react模式
chat_engine = index.as_chat_engine(chat_mode="react", llm=Settings.llm, verbose=True)response = chat_engine.chat( "Use the tool to answer what did Paul Graham do in the summer of 1995?")

输出

从以下输出可以看到,不同大模型的输出不太相同。Agent通过查询引擎获取到了对应的索引和文本信息。

$ python chat_react.py 
> Running step 3e748b23-a1bb-4807-89f6-7bda3b418b86. Step input: Use the tool to answer what did Paul Graham do in the summer of 1995?
Thought: The current language of the user is: English. I need to use a tool to help me answer the question.
Action: query_engine_tool
Action Input: {'input': 'What did Paul Graham do in the summer of 1995?'}
Observation: He worked on his Lisp-based web server.  
​
> Running step 5f4592b6-f1d0-4fcf-8b03-a50d46641ef2. Step input: None
Thought: I can answer without using any more tools. I'll use the user's language to answer
Answer: In the summer of 1995, Paul Graham worked on his Lisp-based web server.

实现分析

从以下实现代码中可以看到,当聊天模式是REACT模式时,会创建一个AgentRunner,并把查询引擎作为工具放入Agent工具列表中。

  def as_chat_engine(self,chat_mode: ChatMode = ChatMode.BEST,llm: Optional[LLMType] = None,**kwargs: Any,) -> BaseChatEngine:    if chat_mode in [ChatMode.REACT, ChatMode.OPENAI, ChatMode.BEST]:# use an agent with query engine tool in these chat modes# NOTE: lazy importfrom llama_index.core.agent import AgentRunnerfrom llama_index.core.tools.query_engine import QueryEngineTool
​# convert query engine to toolquery_engine_tool = QueryEngineTool.from_defaults(query_engine=query_engine)
​return AgentRunner.from_llm(tools=[query_engine_tool],llm=llm,**kwargs,)

小结

通过REACT模式,会创建一个Agent,并把查询引擎作为工具放到该Agent中。然后,通过查询引擎的能力来查询想要的内容。


http://www.ppmy.cn/server/146558.html

相关文章

曲面单值化定理

曲面单值化定理(Uniformization Theorem)是复分析、几何和拓扑学中的一个重要结果。它为紧致黎曼曲面提供了标准化的几何结构,是研究复几何和代数几何的基础。以下是对曲面单值化定理的详细介绍以及其应用场景。 曲面单值化定理的陈述 基本版…

Python 异步编程:await 与 create_task 的比较与选择

Python 异步编程:await 与 create_task 的比较与选择 1. await 直接调用协程示例代码特点 2. await create_task(async 函数)示例代码特点 3. 区别与优劣并发性控制流适用场景 4. 示例代码5. 总结 在 Python 的异步编程中,await 和 asyncio.create_task(…

TorchMoji使用教程/环境配置(2024)

TorchMoji使用教程/环境配置(2024) TorchMoji简介 这是一个基于pytorch库,用于将文本分类成不同的多种emoji表情的库,适用于文本的情感分析 配置流程 从Anaconda官网根据提示安装conda git拉取TorchMoji git clone https://gi…

《Django 5 By Example》阅读笔记:p455-p492

《Django 5 By Example》学习第 16 天,p455-p492 总结,总计 38 页。 一、技术总结 1.myshop (1)打折功能 使用折扣码实现,但是折扣码是手动生成的,感觉实际业务中应该不是这样的。 (2)推荐功能 使用 Redis 做缓存&#xff0…

PyTorch3

自动微分: 自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。 张量: Torc…

23种设计模式-生成器(Builder)设计模式

文章目录 一.什么是生成器设计模式?二.生成器模式的特点三.生成器模式的结构四.生成器模式的优缺点五.生成器模式的 C 实现六.生成器模式的 Java 实现七.代码解析八. 总结 类图: 生成器设计模式类图 一.什么是生成器设计模式? 生成器模式&am…

网络药理学之薛定谔Schrödinge Maestro:6、分子对接(Glide、Ligand docking)和可视化

本人是win11,薛定谔版本是12.9。 官网:https://www.schrodinger.com/ 本篇文章的示例大分子蛋白PDB ID为4KNN,小分子配体的MOL ID为MOL004004。 本文部分图源来自知乎https://zhuanlan.zhihu.com/p/416698194,推荐为原作者贡献阅读…

C#里怎么样使用抽象Abstract定义的属性?

C#里怎么样使用抽象Abstract定义的属性? 由于面向对象设计时,需要体现继承, 那么就需要使用基类, 使用基类,就需要使用抽象属性。 比如下面的例子: using System;public abstract class Shape {private string myId;public Shape(string s){Id = s; }public string I…