基于 LlamaIndex 实现 Agent 智能体
Agent 是具备感知、规划、行动能力的智能系统。本文基于 LlamaIndex 框架,详解 Agent 的核心原理与实现方式。通过代码示例展示了工具调用(Function Tool)和检索增强生成(RAG)的集成方法,并探讨了 Agent 的记忆机制。内容涵盖从基础定义到复杂场景的完整构建流程,帮助开发者快速掌握 LLM 应用开发中的智能体技术。

Agent 是具备感知、规划、行动能力的智能系统。本文基于 LlamaIndex 框架,详解 Agent 的核心原理与实现方式。通过代码示例展示了工具调用(Function Tool)和检索增强生成(RAG)的集成方法,并探讨了 Agent 的记忆机制。内容涵盖从基础定义到复杂场景的完整构建流程,帮助开发者快速掌握 LLM 应用开发中的智能体技术。

在当前的 AIGC 应用生态中,Agent(智能体)已成为不可或缺的核心功能。从字面意义上理解,Agent 意为'代理',但在国内主流大模型产品的定义中,绝大多数将其称为'智能体'。
不同厂商对 Agent 的定义略有差异,但核心逻辑一致:
从使用者角度看,智能体就像专门完成某一类任务的机器人。其设计目的为了实现特定的目标或完成特定的任务。它像是一个专家,专门解决某一类问题。例如,医生比喻中,Agent 如同专科大夫,只能看骨科相关的病;而大模型 LLM 则像全科大夫,什么病都能看。
在设计上,Agent 与通用 LLM 有显著区别。处理复杂数学公式或特定领域知识时,向专门为解决问题设计的 Agent 提问,比直接向 LLM 提问得到的答案更准确。
以智谱清言为例,创建智能体时有不少配置项,其中两个最重要的配置是:
除了联网能力和代码能力外,知识库的集成是提升 Agent 专业性的关键。
LlamaIndex 是一个强大的数据框架,用于构建 LLM 应用。使用 LlamaIndex 实现一个简单的 Agent Demo 相对容易。
首先确保安装了必要的依赖包:
pip install llama-index llama-index-llms-glm
我们可以利用 ReActAgent 来实现工具调用。以下代码展示了如何创建一个能够执行加减乘除运算的 Agent。
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool
# 假设已自定义 GLM4LLM 封装
from llamaindex_demo.custom.custom_llm_glm import GLM4LLM
def multiply(a: float, b: float) -> float:
"""Multiply two numbers and returns the product"""
return a * b
def add(a: float, b: float) -> float:
"""Add two numbers and returns the sum"""
return a + b
def main():
# 注册工具
multiply_tool = FunctionTool.from_defaults(fn=multiply)
add_tool = FunctionTool.from_defaults(fn=add)
# 初始化 LLM
llm = GLM4LLM()
# 创建 ReActAgent 实例
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)
# 发起查询
response = agent.chat("20+(2*4)等于多少?使用工具计算每一步")
print(response)
if __name__ == "__main__":
main()
代码解析:
输出分析:
Agent 会将提问中的计算步骤分别利用自定义的函数 add 和 multiply,而不是直接由大模型估算。这体现了 Agent 的控制力,除了使用 Prompt 外,开发者对处理流程拥有更大的控制权。
为了增强 Agent 的知识获取能力,可以将 RAG 引擎作为工具加入 Agent。
import os
import sys
import re
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
from llama_index.core.agent import ReActAgent
from llama_index.core.tools import FunctionTool, QueryEngineTool
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llamaindex_demo import logger
from llamaindex_demo.custom.custom_llm_glm import GLM4LLM
from llamaindex_demo.custom.custom_embedding_zhipu import ZhipuEmbeddings
# 设置环境变量,禁用 tokenizers 的并行处理
os.environ["TOKENIZERS_PARALLELISM"] = "false"
def toHtml(text: str) -> str:
"""遇到英文单词就用 html 标签包裹"""
return re.sub(r"(\b[a-zA-Z]+\b)", r'<span style="color:red;">\1</span>', text)
def run_glm4_query_with_embeddings(query: str):
# 从指定目录加载文档数据
documents = SimpleDirectoryReader(input_files=["./data/sample.txt"]).load_data()
# 设置 LLM 和嵌入模型
Settings.llm = GLM4LLM()
Settings.embed_model = ZhipuEmbeddings()
# 创建索引和查询引擎
index = VectorStoreIndex.from_documents(documents, show_progress=True)
query_engine = index.as_query_engine(streaming=True)
# 将查询引擎包装为工具
yc_tool = QueryEngineTool.from_defaults(
query_engine,
description="关于作者背景知识的 RAG 引擎",
)
to_html_tool = FunctionTool.from_defaults(fn=toHtml)
# 创建 Agent,包含 RAG 工具和文本处理工具
agent = ReActAgent.from_tools(
[to_html_tool, yc_tool],
verbose=True,
)
# 执行查询
logger.info("agent 查询结果:")
response = agent.chat(query)
print(response)
logger.info("\n查询完成")
def main():
run_glm4_query_with_embeddings("请描述一下作者的求学经历,并将英文用 html 高亮显示")
if __name__ == "__main__":
main()
运行效果说明:
在此示例中,yc_tool 是通过加载本地文件自定义的 RAG 应用,并加入到 Agent 的工具列表中。Agent 在执行过程中会先调用 RAG 工具获取相关知识,再调用 toHtml 工具进行格式处理。日志输出显示了 Agent 的思考过程(Thought)、行动(Action)及观察结果(Observation),验证了多工具协作的能力。
Agent 具备记忆功能,这意味着它能记住之前的对话上下文,而不是将每次提问视为独立事件。
在 LlamaIndex 中,可以通过配置 ConversationBufferMemory 或其他记忆机制来实现。当在一个流程中发起多次提问时,Agent 能够结合历史对话信息进行回答。这对于多轮对话场景至关重要。
ReAct (Reasoning + Acting) 是目前最流行的 Agent 范式。其工作流程如下:
这种循环机制允许 Agent 自主规划任务路径,处理复杂问题。
在 LlamaIndex 中,工具可以是任意 Python 函数,也可以是外部 API 的封装。关键在于正确描述工具的 description 和参数类型,以便 LLM 能准确理解何时调用该工具。
在实际应用中,Agent 可能会遇到工具调用失败、API 超时或 LLM 幻觉等问题。建议采取以下措施:
streaming=True 提升用户体验。尽管 Agent 功能强大,但仍存在局限性:
学习 AI 大模型是当前科技发展的趋势。通过掌握 LlamaIndex 等框架,开发者可以构建出具备感知、规划和行动能力的智能体,从而更好地理解和应用人工智能技术。这不仅能为职业发展增添竞争力,还能创造实际的业务价值。
本文详细讲解了如何使用 LlamaIndex 实现 Agent 智能体,涵盖了从基础定义、工具调用、RAG 集成到记忆管理的完整流程。希望这些内容能帮助你在 AI 应用开发道路上少走弯路,快速构建出高质量的智能系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online