当前位置: 首页 > news >正文

LLamaIndex中经常使用的四个模块

from llama_index.core.callbacks.base import BaseCallbackHandler
from llama_index.core.callbacks.schema import CBEventType
from llama_index.core.tools.types import ToolOutput
from typing import AsyncGenerator, Dict, Any, List, Optional

这四个模块每一个都很实用,在实际开发中经常用到,下面我详细介绍。


✅ 1. from llama_index.core.callbacks.base import BaseCallbackHandler

这是 LlamaIndex 框架提供的一个回调处理器的基类,你要想监听聊天过程中的各种事件(比如:开始检索了、调用工具了、Agent 步骤开始了),就得继承它。

✅ 举个例子:

class MyHandler(BaseCallbackHandler):def on_event_start(self, event_type, payload, event_id, **kwargs):print(f"事件开始了!类型是 {event_type},内容是 {payload}")

📦使用场景:

比如你想做一个流式聊天界面,展示“现在在调用哪个工具”、“找到哪些文档”等等 —— 就可以写一个继承自它的类,然后实时捕捉这些事件。


✅ 2. from llama_index.core.callbacks.schema import CBEventType

这是一个事件类型的枚举类(Enum),LlamaIndex 定义了它在运行过程中可能发生的各种事件类型,比如:

类型名含义
CBEventType.RETRIEVE开始文档检索
CBEventType.FUNCTION_CALL调用了某个工具
CBEventType.AGENT_STEPAgent 进入了某个推理步骤
CBEventType.LLM模型开始生成文本
CBEventType.TEMPLATING正在拼 Prompt 模板

✅ 举个例子:

if event_type == CBEventType.RETRIEVE:print("正在检索文档")

📦使用场景:

你在 CallbackHandler 里判断是哪种事件,就靠这个枚举值,比如你只关心 tool 调用,就判断是不是 CBEventType.FUNCTION_CALL


✅ 3. from llama_index.core.tools.types import ToolOutput

这是一个 工具调用结果的结构体类,当 Agent 调用了某个工具函数(比如查天气、算数学题),这个类就表示工具调用完后返回的结果。

它里面有什么?

ToolOutput(content="今天天气晴朗",raw_input={"city": "北京"},raw_output={"weather": "sunny"},tool_name="get_weather",is_error=False
)

📦使用场景:

你想展示:“调用了哪个工具,传了什么参数,返回了什么结果”,就从 ToolOutput 里面拿。


✅ 4. from typing import AsyncGenerator, Dict, Any, List, Optional

这是 Python 标准库里的类型注解模块,用来给你的函数或变量标明“是什么类型”,可以让编辑器帮你自动补全、检查 bug,更方便写代码。

各个类型意思:

类型作用举例
AsyncGenerator表示是个异步生成器async def xxx(): yield ...
Dict[str, Any]字典,键是字符串,值是任意类型{"a": 123, "b": "hello"}
List[int]表示一个整型列表[1, 2, 3]
Optional[X]可能是 X,也可能是 NoneOptional[str] 表示:要么是字符串,要么是 None

✅ 举个注解例子:

from typing import AsyncGenerator, Dict, Anyasync def my_gen() -> AsyncGenerator[Dict[str, Any], None]:yield {"msg": "hello"}

🔚 总结对比表:

模块用途举个场景
BaseCallbackHandler自定义事件监听器监听聊天过程中的检索、tool调用等
CBEventType定义事件类型判断当前发生了什么事件
ToolOutput表示工具函数的返回结果显示 Agent 工具调用后的输出内容
typing 模块写类型注解用来标注 async generator、字典、列表等类型

from llama_index.core.tools.types import ToolOutput详细用法

我们来把 ToolOutput 拆开一点点讲,讲清楚它到底是干啥的、里面的每个属性代表什么、以及在哪儿用到它。


🧠 背景知识先补一下(30 秒理解)

在 LlamaIndex 的 Agent 机制中,你可以定义工具(tools),比如:

  • search_stock_info(股票代码):查股票信息
  • get_weather(城市名):查天气
  • calculate(expression):算数学题

当用户提了一个问题,例如:“帮我查下北京的天气”,Agent 会选择合适的工具(比如调用 get_weather),然后等工具返回结果,继续生成回复。

👉 那工具返回的这个结果,LlamaIndex 就用 ToolOutput 类型来描述。


ToolOutput 是个什么?

它是一个 数据结构(类),里面放着「某次工具调用的完整信息」,比如:

字段名说明举个例子
tool_name用了哪个工具"get_weather"
raw_input工具收到的参数{"city": "北京"}
raw_output工具返回的原始结果{"weather": "晴"}
content给用户展示的文本"北京今天天气晴"
is_error工具有没有出错False(正常)

🧩 举个超简单的例子:

比如你写了一个查天气的工具 get_weather(city: str),用户问了:

“北京今天什么天气?”

Agent 决定调用这个工具,然后:

# 调用过程
tool_name = "get_weather"
raw_input = {"city": "北京"}
raw_output = {"weather": "晴"}
content = "北京今天天气晴"
is_error = False

这时候 LlamaIndex 就会把这些数据包成一个 ToolOutput 对象:

from llama_index.core.tools.types import ToolOutputoutput = ToolOutput(tool_name="get_weather",raw_input={"city": "北京"},raw_output={"weather": "晴"},content="北京今天天气晴",is_error=False
)

🧲 在哪里用到这个 ToolOutput

这段处理 Agent 工具调用响应:

def get_agent_tool_response(self) -> dict | None:response = self.payload.get("response")if response is not None:sources = response.sourcesfor source in sources:if isinstance(source, ToolOutput):...

意思就是:payload 里有工具的执行结果,提取出来,准备展示给用户

比如你做的是前端流式对话页面,拿到这个结构后可以展示为:

{"toolCall": {"name": "get_weather","input": {"city": "北京"}},"toolOutput": {"output": "北京今天天气晴","isError": false}
}

用户就知道 Agent 调用了哪个工具、传了啥参数、返回了啥结果。


📦 总结一下:

属性作用举个例子
tool_name工具的名字"get_weather"
raw_input工具收到的参数{"city": "北京"}
raw_output工具返回的原始结果(可能是 dict、str 等){"weather": "晴"}
content工具生成的展示内容(面向用户)"北京今天天气晴"
is_error是否出错False(没错)

相关文章:

  • 2024年第九届团队程序设计天梯赛c++题解L1-L3-1(附PTA网址)
  • 6 CMD 与 PowerShell 指令大全、C 程序终端运行、字符编码切换指南
  • 【AI工具】用大模型生成脑图初试
  • C++学习记录:
  • 2025主流报表软件评测和推荐
  • 【DeepSeek答】如何成为一名科技领域陪同口译,阶段性学习目标是什么
  • FreeRTOS之消息队列
  • Spring Boot 应用程序中配置使用consul
  • 20250416在荣品的PRO-RK3566开发板的Android13下编译native C的应用程序的步骤
  • 免费使用RooCode + Boomerang AI + Gemini 2.5 Pro开发套件
  • 【技术派后端篇】深度剖析 Knife4j:从概述到整合及功能优势
  • RK3568 更换显示logo
  • 赋能顶尖AI平台:如何加速高质量AI音乐生成?
  • 架构风格(高软59)
  • STM32单片机入门学习——第38节: [11-3] 软件SPI读写W25Q64
  • Python学习之路(三)
  • 基于MyBatis自定义拦截器实现数据库字段加密脱敏
  • 反转一个字符串
  • C++零基础实践教程 文件输入输出
  • Java转Go日记(一):Slice解密
  • csgo翻硬币网站开发/百度指数搜索指数的数据来源
  • 做外贸的几个网站/百度联盟官网登录入口
  • 网站建设 面试/网络链接推广
  • 网站建设要什么知识/淘宝seo排名优化软件
  • 关于优化网站建设的方案/百度热搜的含义
  • 网站建设的品牌/线上营销手段有哪些