简介
Agent(智能代理)是一种能够自主执行任务、做出决策并与环境交互的智能系统。在AI领域,Agent通常指的是结合了大语言模型(LLM)和工具调用能力的智能实体,能够理解用户意图,规划执行步骤,并通过调用外部工具来完成复杂任务。
核心组成部分
一个完整的Agent通常包含以下核心组件:
-
**大语言模型(LLM)**:作为Agent的"大脑",负责理解用户意图、生成思考过程和决策
-
**工具集(Tools)**:Agent可以调用的外部工具,如搜索引擎、计算器、API等
-
**记忆系统(Memory)**:用于存储对话历史或上下文信息
-
**执行框架(Executor)**:协调LLM和工具调用的执行流程
工作原理
Agent的典型工作流程如下:
-
接收用户输入并理解用户意图
-
根据任务需求决定是否需要调用工具
-
如果需要调用工具,选择合适的工具并生成工具调用参数
-
执行工具调用并获取结果
-
根据工具执行结果生成最终响应
Agent有什么用
Agent的主要价值在于扩展了大语言模型的能力边界,使其能够:
1 处理实时信息查询
大语言模型的训练数据有时间限制,无法获取最新信息。通过接入搜索引擎工具,Agent可以获取实时的新闻、数据和事件信息
2 执行计算和数据分析,通过接入计算工具,Agent可以处理复杂的数学运算和数据分析任务,避免了大语言模型在数值计算上的不准确问题。
3 完成多步骤复杂任务,通过规划和执行框架,Agent可以将复杂任务分解为多个子步骤,并按顺序执行,最终完成复杂目标。
4 与外部系统集成, Agent可以通过自定义工具与各种外部系统集成,如天气API、数据库、业务系统等,实现更广泛的应用场景。
5 保持对话上下文,通过记忆系统,Agent可以在多轮对话中保持上下文信息,提供更连贯的用户体验。
实战案例
(一)信息查询示例:该案例使用百度的搜索库来作为agent的查询工具,将搜索与大模型结合起来,根据搜索到的内容再由大模型进行总结整合,使输出结果更直观
python
from langchain_openai import ChatOpenAI
from langchain_classic.agents import initialize_agent
from langchain_classic.agents import AgentType
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_classic.tools import Tool
from dotenv import load_dotenv
import requests
import json
load_dotenv()
import os
api_key = os.getenv("DEEPSEEK_API_KEY")
os.environ["OPENAI_API_KEY"] = api_key
# # 获取SerpAPI密钥
# serpapi_api_key = os.getenv("SERPAPI_API_KEY")
#定义llm
llm = ChatOpenAI(
temperature=0,
model="deepseek-chat",
api_key=api_key,
base_url="https://api.deepseek.com/beta",
max_tokens=1024,
)
# 自定义百度搜索工具类
class BaiduSearchTool:
def run(self, query: str) -> str:
"""
使用百度搜索进行搜索
Args:
query: 搜索查询字符串
Returns:
搜索结果的文本摘要
"""
try:
# 尝试导入baidusearch库
from baidusearch import baidusearch
# 执行搜索
results = baidusearch.search(query, num_results=5) # 返回5条结果
if not results:
return "未找到相关搜索结果"
# 格式化搜索结果
formatted_results = []
for i, result in enumerate(results, 1):
title = result.get("title", "无标题")
snippet = result.get("summary", "无摘要")
url = result.get("url", "无链接")
formatted_results.append(f"{i}. {title}\n {snippet}\n 链接: {url}")
return "\n\n".join(formatted_results)
except ImportError:
return "百度搜索工具未安装,请先执行: pip install baidusearch"
except Exception as e:
return f"百度搜索出错: {str(e)}"
baidu_search_tool = Tool(
name="百度搜索",
func=BaiduSearchTool().run,
description="用于搜索网络信息的工具,适用于查找最新资讯、事实性问题等。输入为搜索查询字符串。"
)
# 加载数学工具
# math_tool = load_tools(["llm-math"], llm=llm)[0]
tools = [baidu_search_tool]
print("已加载百度搜索工具")
agent = initialize_agent(
tools,
llm,
agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, # 这里有不同的类型
verbose=True, #是否打印日志
)
# 调用agent并处理可能的异常
try:
result = agent.invoke("中国2024全年税收是多少?军队支出是多少?")
print(result)
except Exception as e:
print(f"调用Agent时出错:{type(e).__name__}: {str(e)}")
(二)搜索工具与计算工具结合使用:该案例使用搜过工具和计算工具,将这两种工具结合起来使用,可以使得agent的功能更丰富。
python
from langchain_openai import ChatOpenAI
from langchain_experimental.plan_and_execute import PlanAndExecute, load_agent_executor, load_chat_planner
from langchain_community.utilities import SerpAPIWrapper
# from langchain_core.tools import Tool
from langchain_classic.tools import Tool
# 正确导入LLMMathChain类
from langchain_classic.chains.llm_math.base import LLMMathChain
from dotenv import load_dotenv
import os
# 自定义百度搜索工具类
class BaiduSearchTool:
def run(self, query: str) -> str:
"""
使用百度搜索进行搜索
Args:
query: 搜索查询字符串
Returns:
搜索结果的文本摘要
"""
try:
# 尝试导入baidusearch库
from baidusearch import baidusearch
# 执行搜索
results = baidusearch.search(query, num_results=5) # 返回5条结果
if not results:
return "未找到相关搜索结果"
# 格式化搜索结果
formatted_results = []
for i, result in enumerate(results, 1):
title = result.get("title", "无标题")
snippet = result.get("summary", "无摘要")
url = result.get("url", "无链接")
formatted_results.append(f"{i}. {title}\n {snippet}\n 链接: {url}")
return "\n\n".join(formatted_results)
except ImportError:
return "百度搜索工具未安装,请先执行: pip install baidusearch"
except Exception as e:
return f"百度搜索出错: {str(e)}"
search = Tool(
name="百度搜索",
func=BaiduSearchTool().run,
description="用于搜索网络信息的工具,适用于查找最新资讯、事实性问题等。输入为搜索查询字符串。"
)
# 直接从环境变量获取API密钥,避免跨文件依赖
api_key = os.getenv("DEEPSEEK_API_KEY")
load_dotenv()
import os
model_api_key = os.getenv("DEEPSEEK_API_KEY")
llm = ChatOpenAI(model="deepseek-chat", api_key=model_api_key, base_url="https://api.deepseek.com/beta")
# 创建工具
try:
llm_math_chain = LLMMathChain(llm=llm, verbose=True)
print("已成功初始化LLMMathChain工具")
except Exception as e:
print(f"初始化工具时出错: {str(e)}")
# 定义工具列表
tools = [
Tool(
# name="Search",
# func=search.run,
# description="用于回答关于当前事件的问题"
name="百度搜索",
func=BaiduSearchTool().run,
description="用于搜索网络信息的工具,适用于查找最新资讯、事实性问题等。输入为搜索查询字符串。"
),
Tool(
name="Calculator",
func=llm_math_chain.run,
description="用于计算或解决问题"
)
]
# 加载规划器和执行器
planner = load_chat_planner(llm)
executor = load_agent_executor(llm, tools, verbose=True)
# 创建Plan and Execute代理
agent = PlanAndExecute(planner=planner, executor=executor, verbose=True)
# 运行代理解决实际问题
try:
result = agent.invoke("在纽约,100美元能买几束玫瑰?")
print("\n代理执行结果:")
print(result)
except Exception as e:
print(f"\n代理执行时出错: {str(e)}")
print("建议检查:")
(三)给agent添加记忆库
python
from langchain_openai import ChatOpenAI
from langchain_classic.memory import ConversationBufferMemory
from langchain_classic.chains.conversation.base import ConversationChain
import os
from dotenv import load_dotenv
"""
给agent添加记忆
"""
load_dotenv()
deepseek_api_key = os.getenv("DEEPSEEK_API_KEY")
# 初始化大模型
llm = ChatOpenAI(model_name="deepseek-chat", api_key=deepseek_api_key, base_url="https://api.deepseek.com/beta")
# 添加聊天对话记忆
memory = ConversationBufferMemory()
memory.chat_memory.add_user_message("我是李老师")
memory.chat_memory.add_ai_message("你好,李老师。")
# 初始化对话链
conversation = ConversationChain(llm=llm, memory=memory)
# 提问
res = conversation.invoke({"input": "我是谁?"})
print(res)