用LlamaIndex构建AI智能体:ReAct模式实战

324 阅读2分钟

在之前的文章中,我们探讨了文档问答、对话系统、RAG管道和系统监控。今天,我们将深入学习如何使用LlamaIndex构建AI智能体(Agent),特别是采用ReAct(Reasoning and Acting)模式的智能体,让AI能够进行推理并执行具体操作。

1. ReAct模式简介

ReAct是一种结合了推理(Reasoning)和行动(Acting)的AI模式:

  • 推理:分析问题并制定解决方案
  • 行动:执行具体的操作步骤
  • 观察:评估执行结果
  • 思考:根据观察结果调整策略

2. 基础环境配置

import os
from dotenv import load_dotenv
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
from llama_index.core.tools import FunctionTool

load_dotenv()

3. 构建基础工具集

首先,我们需要定义一些基础工具供智能体使用:

# 数学运算工具
def multiply(a: float, b: float) -> float:
    """将两个数相乘并返回结果"""
    return a * b

def add(a: float, b: float) -> float:
    """将两个数相加并返回结果"""
    return a + b

def subtract(a: float, b: float) -> float:
    """将两个数相减并返回差值"""
    return a - b

def divide(a: float, b: float) -> float:
    """将两个数相除并返回商"""
    return a / b

# 将函数转换为工具
multiply_tool = FunctionTool.from_defaults(fn=multiply)
add_tool = FunctionTool.from_defaults(fn=add)
subtract_tool = FunctionTool.from_defaults(fn=subtract)
divide_tool = FunctionTool.from_defaults(fn=divide)

4. 创建ReAct智能体

# 初始化语言模型
llm = OpenAI(model="gpt-4", temperature=0)

# 创建ReAct智能体
agent = ReActAgent.from_tools(
    tools=[multiply_tool, add_tool, subtract_tool, divide_tool],
    llm=llm,
    verbose=True
)

5. 实现复杂计算示例

def solve_math_problem():
    # 解决复杂数学问题
    response = agent.chat(
        "What is 20+(2*4)/(5-1)? Use a tool to calculate every step."
    )
    print(response)

6. 扩展工具集

6.1 文件操作工具

def read_file(file_path: str) -> str:
    """读取文件内容"""
    with open(file_path, 'r') as f:
        return f.read()

def write_file(file_path: str, content: str) -> bool:
    """写入文件内容"""
    try:
        with open(file_path, 'w') as f:
            f.write(content)
        return True
    except Exception as e:
        return False

# 转换为工具
file_tools = [
    FunctionTool.from_defaults(fn=read_file),
    FunctionTool.from_defaults(fn=write_file)
]

6.2 网络请求工具

import requests

def fetch_web_content(url: str) -> str:
    """获取网页内容"""
    try:
        response = requests.get(url)
        return response.text
    except Exception as e:
        return str(e)

web_tool = FunctionTool.from_defaults(fn=fetch_web_content)

7. 高级智能体配置

7.1 自定义推理链

from llama_index.core.agent import ReActChatFormatter

# 自定义推理格式化器
custom_formatter = ReActChatFormatter(
    system_header="你是一个专业的助手,擅长解决复杂问题。",
    system_footer="记住要逐步思考并使用工具。"
)

# 创建带有自定义推理的智能体
advanced_agent = ReActAgent.from_tools(
    tools=[multiply_tool, add_tool, subtract_tool, divide_tool],
    llm=llm,
    chat_formatter=custom_formatter,
    verbose=True
)

7.2 错误处理

def safe_agent_call(agent, query):
    try:
        response = agent.chat(query)
        return response
    except Exception as e:
        print(f"执行出错: {str(e)}")
        return None

总结

通过本文,我们学习了:

  • ReAct模式的基本原理
  • 如何构建基础工具集
  • 创建和配置ReAct智能体

在下一篇文章中,我们将探讨如何使用LlamaParse处理复杂的PDF文档,进一步提升文档处理能力。