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

【大模型LLM第十四篇】Agent学习之anthropic-quickstarts Agent

前言

对于anthropic api的快速使用,在github上有几个example

  • Customer Support Agent:由 Claude 提供支持的客户支持代理。该项目演示了如何利用 Claude 的自然语言理解和生成功能来创建可访问知识库的 AI 辅助客户支持系统。
  • Financial Data Analyst :由 Claude 提供支持的金融数据分析师。该项目演示了如何利用 Claude 的交互式数据可视化功能通过聊天分析财务数据。
  • Computer Use Demo: Claude 可用于控制台式计算机的环境和工具。该项目演示了如何利用新 Claude 3.5 Sonnet 模型的计算机使用功能。

其中 Computer use Demo是agent的example
链接:https://github.com/anthropics/anthropic-quickstarts/tree/main/computer-use-demo/computer_use_demo

文件介绍

打开之后可能会发现一堆报错,不慌,因为版本的问题,里面有一些python语言的不兼容,开头加上这句

from __future__ import annotations

一般agent文件目录都这么设置,朴实无华

  • tools:包含base tool等一系列基础组件,接下来就是一个个tool了,最终会把tool做collection送给模型规定的格式,最终模型think后作出判断输出tool的name,collection根据name策略模式来选择对应的tool执行
  • loop:agent loop的主要逻辑
  • streamlit:轻量级的直接可视化工具:https://docs.streamlit.io/

除了这些,一般还会把llm单独搞个模块出来,memory等模块。

环境安装

streamlit>=1.38.0
anthropic[bedrock,vertex]>=0.39.0
jsonschema==4.22.0
boto3>=1.28.57
google-auth<3,>=2

Tool

BaseTool

from __future__ import annotations

from abc import ABCMeta, abstractmethod
from dataclasses import dataclass, fields, replace
from typing import Any

from anthropic.types.beta import BetaToolUnionParam


class BaseAnthropicTool(metaclass=ABCMeta):
    """Abstract base class for Anthropic-defined tools."""

    @abstractmethod
    def __call__(self, **kwargs) -> Any:
        """Executes the tool with the given arguments."""
        ...

    @abstractmethod
    def to_params(
        self,
    ) -> BetaToolUnionParam:
        raise NotImplementedError


@dataclass(kw_only=True, frozen=True)
class ToolResult:
    """Represents the result of a tool execution."""

    output: str | None = None
    error: str | None = None
    base64_image: str | None = None
    system: str | None = None

    def __bool__(self):
        return any(getattr(self, field.name) for field in fields(self))

    def __add__(self, other: "ToolResult"):
        def combine_fields(
            field: str | None, other_field: str | None, concatenate: bool = True
        ):
            if field and other_field:
                if concatenate:
                    return field + other_field
                raise ValueError("Cannot combine tool results")
            return field or other_field

        return ToolResult(
            output=combine_fields(self.output, other.output),
            error=combine_fields(self.error, other.error),
            base64_image=combine_fields(self.base64_image, other.base64_image, False),
            system=combine_fields(self.system, other.system),
        )

    def replace(self, **kwargs):
        """Returns a new ToolResult with the given fields replaced."""
        return replace(self, **kwargs)


class CLIResult(ToolResult):
    """A ToolResult that can be rendered as a CLI output."""


class ToolFailure(ToolResult):
    """A ToolResult that represents a failure."""


class ToolError(Exception):
    """Raised when a tool encounters an error."""

    def __init__(self, message):
        self.message = message

其他的tool都需要去实现BaseAnthropicTool,输出为定义的ToolResult结构体

Tool的基础参数格式

按照API官方文档为准,(代码里应该是有一些问题,缺少description,每个params不规范,都为自定义
https://docs.anthropic.com/zh-CN/docs/build-with-claude/tool-use/overview

{
  "name": "get_weather",
  "description": "获取指定位置的当前天气",
  "input_schema": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "城市和州,例如 San Francisco, CA"
      },
      "unit": {
        "type": "string",
        "enum": ["celsius", "fahrenheit"],
        "description": "温度单位,可以是'celsius'或'fahrenheit'"
      }
    },
    "required": ["location"]
  }
}

特殊的三个Tool

文档:https://docs.anthropic.com/en/docs/agents-and-tools/computer-use
以下三个tool的参数和基础common参数不一致,是特殊的处理

  • Computer tool: 截图,通过x,y坐标 挪动 鼠标, 多模态 这里面的很多操作也都是通过执行shell命令完成的
  • Bash tool:shell命令的tool
  • text-editor-tool

这三个tool都是模型本身训练过的,computer和text相对多模态比较难,bash可能出于安全考虑所以三个常用的tool都是训练过的,这里注意使用的时候的形态。

Collection设计

class ToolCollection:
    """A collection of anthropic-defined tools."""

    def __init__(self, *tools: BaseAnthropicTool):
        self.tools = tools
        self.tool_map = {tool.to_params()["name"]: tool for tool in tools}

    def to_params(
        self,
    ) -> list[BetaToolUnionParam]:
        return [tool.to_params() for tool in self.tools]

    async def run(self, *, name: str, tool_input: dict[str, Any]) -> ToolResult:
        tool = self.tool_map.get(name)
        if not tool:
            return ToolFailure(error=f"Tool {name} is invalid")
        try:
            return await tool(**tool_input)
        except ToolError as e:
            return ToolFailure(error=e.message)

to_params之后得到一个对应格式tool各个参数的list,直接送入model,进行判断,模型判断得到tool name再通过run,进行解析参数,并通过name拿到对应的tool执行

可以借鉴的tool

  • bash, 因为是模拟电脑运行,必不可少的就是shell
  • computer:控制鼠标的一些方式,通过给予的x和y坐标

http://www.kler.cn/a/599645.html

相关文章:

  • Lisp语言的学习路线
  • 使用现有三自变量和腐蚀速率数据拟合高精度模型,并进行预测和自变量贡献度分析的一般步骤
  • 聊聊langchain4j的HTTP Client
  • 力扣刷题78. 子集
  • python 中match...case 和 C switch case区别
  • 前端传来的不同类型参数,后端 SpringMVC 怎么接收?
  • 【Unity Shader编程】之透明物体渲染
  • 【VUE】day07 路由
  • FFmpeg6.1.1 MSYS2+GCC 源码编译
  • 【Java SE】单例设计模式
  • ngx_http_core_server_name
  • RocketMQ 面试备战指南
  • 在 IntelliJIDEA中实现Spring Boot多实例运行:修改配置与批量启动详解
  • java实现coze平台鉴权+工作流调用(踩坑记录)
  • Springboot的jak安装与配置教程
  • java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
  • 0324-项目
  • 豆包AI插件:提升浏览器使用效率的智能助手
  • 10分钟打造专属AI助手!ToDesk云电脑/顺网云/海马云操作DeepSeek哪家强?
  • 笔记:代码随想录算法训练营day60:并查集理论基础、寻找存在的路径