大模型学习记录(九)-------Agent

简介

Agent(智能代理)是一种能够自主执行任务、做出决策并与环境交互的智能系统。在AI领域,Agent通常指的是结合了大语言模型(LLM)和工具调用能力的智能实体,能够理解用户意图,规划执行步骤,并通过调用外部工具来完成复杂任务。

核心组成部分

一个完整的Agent通常包含以下核心组件:

  1. **大语言模型(LLM)**:作为Agent的"大脑",负责理解用户意图、生成思考过程和决策

  2. **工具集(Tools)**:Agent可以调用的外部工具,如搜索引擎、计算器、API等

  3. **记忆系统(Memory)**:用于存储对话历史或上下文信息

  4. **执行框架(Executor)**:协调LLM和工具调用的执行流程

工作原理

Agent的典型工作流程如下:

  1. 接收用户输入并理解用户意图

  2. 根据任务需求决定是否需要调用工具

  3. 如果需要调用工具,选择合适的工具并生成工具调用参数

  4. 执行工具调用并获取结果

  5. 根据工具执行结果生成最终响应

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)
相关推荐
natide5 小时前
词汇/表达差异-6-n-gram分布距离
人工智能·python·算法
偶信科技5 小时前
自容式水听器是什么?偶信科技为您解答
人工智能·科技·偶信科技·ocean·自容式水听器·海洋仪器·海洋设备
xunyan62345 小时前
异常处理-异常概述
java·学习
躺柒5 小时前
读人机沟通法则:理解数字世界的设计与形成04机器是不完整的
大数据·人工智能·ai·人机交互·人机对话
Hcoco_me5 小时前
cv::contourArea &&鞋带公式
人工智能·rnn·lstm
小付爱coding5 小时前
MCP官方调试工具
java·人工智能
zhaodiandiandian5 小时前
AI狂奔之下的伦理拷问:在创新与规范之间寻找平衡
人工智能
长相忆兮长相忆5 小时前
【推荐算法】PRM重排模型:Personalized Re-ranking for Recommendation
深度学习·机器学习·推荐算法
走在路上的菜鸟5 小时前
Android学Dart学习笔记第二十六节 并发
android·笔记·学习·flutter