[LangChain智能体本质论-06]赋予Agent执行力的工具是个什么东西?

AI智能体数据安全实战:五大泄漏场景与asqav防护方案 在人工智能技术快速发展的今天,AI智能体作为能够感知、决策和执行的自动化系统,正被广泛应用于企业流程自动化、智能客服、数据分析等场景。其核心原理是通过大语言模型(LLM)结合检索增强生成(RAG)、工具调用等技术,实现对复杂任务的自主处理。然而,这种强大的自主性也带来了独特的数据安全挑战,其风险根植于“感知-决策-执行”的闭环架构中,每个环节的自动化都可能成为数据泄漏的放大器。从技术价值看,保障AI智能体安全不仅是防范数据泄露,更是确保其可靠、可控地发挥商业价值的基础。在应用场景中,无论是企业内部知识库问答 阅读详情

工具是连接大语言模型与外部世界的桥梁。它们赋予了模型行动的能力,使其能够超越文本生成的范畴,去执行搜索、计算、运行代码或调用API等实际任务。工具本质上是带有名称、描述和Schema的函数。LLM并不直接运行工具(服务单工具除外),而是根据用户的查询,参考工具的描述来决定是否需要调用某个工具,并输出该工具所需的结构化参数。Agent接收到模型生成的参数后,在本地或服务器端执行该工具,并将结果返回给LLM,供其进行后续推理或总结。

从create_agent函数的定义可以看出,注册的工具具有三种形式:BaseTool、Callable[..., Any]和dict[str, Any]。提供的字典表示注册工具的声明,也就是以这种方式注册的工具只包含描述工具的JSON Schema,并不具有执行的能力。由于工具是由Agent负责执行的(服务端工具除外)的,所以当它接收到携带ToolCall的AIMessage后,如果待执行的是这种类型的工具,可以利用中间件调用对应的工具,我们将在介绍中间件的时候演示这种实现方式。BaseTool是具体工具类型的基类,以Callable[..., Any]对象形式提供的可执行对象最终也会转换成BaseTool对象。

def create_agent(
    ...
    tools: Sequence[BaseTool | Callable[..., Any] | dict[str, Any]] | None = None,
    ...
) 

1. BaseTool

BaseTool是LangChain中所有工具的基类。它继承自RunnableSerializable,这意味着它不仅是一个可调用的函数,还可以成为LCEL链上的一环。作为一个Runnable对象,它的输入可以是一个ToolCall对象,我们知道模型生成的AIMessage中利用该对象描述工具调用,我们可以从之提取工具名称、参数以及唯一标识工具调用的ID。输入也可以是一个字符串或者字典,它们承载着调用工具的输入参数。

class BaseTool(RunnableSerializable[str | dict | ToolCall, Any]):
    name: str
    description: str
    args_schema: Annotated[ArgsSchema | None, SkipValidation()] = Field(default=None, description="The tool schema.")
    @property
    def args(self) -> dict
    @property
    def is_single_input(self) -> bool:
    @property
    def tool_call_schema(self) -> ArgsSchema:
ArgsSchema = TypeBaseModel | dict[str, Any]

工具的名称通过name字段表示,它的description字段提供了描述工具的文本。如果将描述理解成可有可无的补充性说明性文本,那就大错特错了。这是最重要的字段之一,因为它作为提示词的一部分传给LLM,指导模型在什么场景下使用该工具。标准的描述应该回答When/Why/How三个问题,即工具在何时被调用?调用工具可以达到什么目的?如何调用?并且最好提供少样本示例。BaseTool提供了几个与Schema相关的字段和属性,很难区分:

  • args_schema:描述参数结构的原始Schema形式,可以是一个Pydantic类型或者描述JSON Schema的字典,它是下面两个属性的源头;
  • args: 描述输出参数JSON Schema的字典,如果该字典的长度为1,is_single_input属性返回True。
    • 如果args_schema自身就是一个字典,那么两者一致;
    • 如果args_schema是一个Pydantic类型,会将每个成员解析为JSON Schema,并生成返回的字典。
  • tool_call_schema:它与args_schema的表现形式一致(同为表示JSON Schema的字典或者Pydantic类型),它是为LLM生成ToolCall服务的,所以会加上description成员。它会剔除自动注入的参数,因为ToolCall的参数列表只提供外部指定的参数。

如下的字段成员用于控制工具的执行。如果将return_direct字段设为True,工具执行后的结果将直接返回给用户,而不再发回给LLM进行后续的文本生成(常用于跳转或终结类工具)。handle_tool_error字段决定了如何处理工具执行抛出的ToolException。它可以是布尔值(表示是否再次抛出异常)、字符串(报错时返回给LLM的文本)或用于处理异常的回调函数。handle_validation_error字段的定义方式与之类似,但是它处理的是参数校验失败的情况。

class BaseTool(RunnableSerializable[str | dict | ToolCall, Any]):
    return_direct: bool = False
    handle_tool_error: bool | str | Callable[[ToolException], str] | None = False
    handle_validation_error: (bool | str | Callable[[ValidationError | ValidationErrorV1], str] | None) = False
    response_format: Literal["content", "content_and_artifact"] = "content"

response_format决定了工具执行后返回给LLM的数据结构以及是否保留中间过程的原始数据。它目前支持两个选项:

  • content(default):工具执行完毕后,返回值会被转化为字符串,并封装在ToolMessage的content字段中,并强制视为传给LLM的上下文。如果返回的是一张图片、一个复杂的DataFrame或一个数据库连接对象,这些内容都会被尝试字符串化。这会导致LLM 接收到大量无用(甚至乱码)的文本,下游的程序也会丢失了原始的对象引用;
  • content_and_artifact:这是为了解决既要给LLM看简报,又要给程序留原始数据而设计的。在这种模式下,执行工具必须返回一个包含两个元素的元组(content, artifact),分别存储与AIMessage的content和artifact节点。前者通常是字符串,后者可以是任何形式的内容,包括图像、Base64、复杂的JSON、模型实例等。只有content部分会传递给LLM,所以这样可以降低Token的消费。

如下的字典成员涉及调试和跟踪。verbose用于控制是否打印详细的执行日志。我们可以利用callbacks提供工具在开始、完成和出错时会自动执行的回调。tags和metadata字段提供的标签和元数据会出现在捕捉的跟踪信息中。

class BaseTool(RunnableSerializable[str | dict | ToolCall, Any]):
    verbose: bool = False
    callbacks: Callbacks = Field(default=None, exclude=True)
    tags: list[str] | None = None
    metadata: dict[str, Any] | None = None

我们最后来看看作为一个Runnable,它的invoke方法是如何实现的。如下面的代码片段所示,invoke方法会直接调用run方法,传入的参数利用私有方法_prep_run_args根据指定的输入和配置生成。BaseTool是一个基类,它将工具调用的实现利用抽象方法_run下放给子类。run方法最终会调用_run方法,并在此基础上完成一些回调执行和异常处理相关的操作。BaseTool也重写了ainvoke方法,并定义了arun和_arun形成了一条异步调用链。

class BaseTool(RunnableSerializable[str | dict | ToolCall, Any]):
    @override
    def invoke(
        self,
        input: str | dict | ToolCall,
        config: RunnableConfig | None = None,
        **kwargs: Any,
    ) -> Any:
        tool_input, kwargs = _prep_run_args(input, config, **kwargs)
        return self.run(tool_input, **kwargs)
    
    def run(
        self,
        tool_input: str | dict[str, Any],
        verbose: bool | None = None,  # noqa: FBT001
        start_color: str | None = "green",
        color: str | None = "green",
        callbacks: Callbacks = None,
        *,
        tags: list[str] | None = None,
        metadata: dict[str, Any] | None = None,
        run_name: str | None = None,
        run_id: uuid.UUID | None = None,
        config: RunnableConfig | None = None,
        tool_call_id: str | None = None,
        **kwargs: Any,
    ) -> Any

    @abstractmethod
    def _run(self, *args: Any, **kwargs: Any) -> Any:

2. Tool

Tool类是对BaseTool最简单的实现。它利用func和coroutine字段分别提供了同步和异步可执行对象,实现的_run方法和重写的_arun方法会分别调用它们完成工具的调用。它还提供了类方法from_function作为创建Tool对象的工厂方法。

class Tool(BaseTool):
    description: str = ""
    func: Callable[..., str] | None
    coroutine: Callable[..., Awaitable[str]] | None = None

    @override
    async def ainvoke(
        self,
        input: str | dict | ToolCall,
        config: RunnableConfig | None = None,
        **kwargs: Any,
    ) -> Any:
        if not self.coroutine:
            return await run_in_executor(config, self.invoke, input, config, **kwargs)
        return await super().ainvoke(input, config, **kwargs)

    def _run(
        self,
        *args: Any,
        config: RunnableConfig,
        run_manager: CallbackManagerForToolRun | None = None,
        **kwargs: Any,
    ) -> Any:
        if self.func:
            if run_manager and signature(self.func).parameters.get("callbacks"):
                kwargs["callbacks"] = run_manager.get_child()
            if config_param := _get_runnable_config_param(self.func):
                kwargs[config_param] = config
            return self.func(*args, **kwargs)
        msg = "Tool does not support sync invocation."
        raise NotImplementedError(msg)

    async def _arun(
        self,
        *args: Any,
        config: RunnableConfig,
        run_manager: AsyncCallbackManagerForToolRun | None = None,
        **kwargs: Any,
    ) -> Any:
        if self.coroutine:
            if run_manager and signature(self.coroutine).parameters.get("callbacks"):
                kwargs["callbacks"] = run_manager.get_child()
            if config_param := _get_runnable_config_param(self.coroutine):
                kwargs[config_param] = config
            return await self.coroutine(*args, **kwargs)
        return await super()._arun(
            *args, config=config, run_manager=run_manager, **kwargs
        )

    @classmethod
    def from_function(
        cls,
        func: Callable | None,
        name: str,  # We keep these required to support backwards compatibility
        description: str,
        return_direct: bool = False,  # noqa: FBT001,FBT002
        args_schema: ArgsSchema | None = None,
        coroutine: Callable[..., Awaitable[Any]]
        | None = None,  # This is last for compatibility, but should be after func
        **kwargs: Any,
    ) -> Tool:
        if func is None and coroutine is None:
            msg = "Function and/or coroutine must be provided"
            raise ValueError(msg)
        return cls(
            name=name,
            func=func,
            coroutine=coroutine,
            description=description,
            return_direct=return_direct,
            args_schema=args_schema,
            **kwargs,
        )

在如下的演示程序中,我们根据函数greet创建了一个Tool对象,然后分别以字符串、字典和ToolCall对象作为输入对它进行调用。

from langchain_core.tools import Tool
from langchain_core.messages.tool import tool_call

def greet(name: str) -> str:
    return f"Hello, {name}!"

tool = Tool.from_function(
    func = greet,
    name = "greet",
    description = "Greet a person by name.")

result = tool.invoke("Alice")
assert result == "Hello, Alice!"

result = tool.invoke({"name": "Alice"}) 
assert result == "Hello, Alice!"

result = tool.invoke(tool_call(name="greet", args={"name": "Alice"}, id=None))
assert result == "Hello, Alice!"

Tool这种简单的实现只支持单输入参数的函数,一旦输入参数超过两个就会出错。如下这个演示程序试图根据一个Lambda表达式创建一个执行加法运算的Tool,invoke方法执行的时候会抛出ToolException,并提示Too many arguments to single-input tool add. Consider using StructuredTool instead. Args: [1, 2]

from langchain_core.tools import Tool
tool = Tool.from_function(
    func = lambda x, y: x + y,
    name = "add",
    description = "Add two numbers together.")
tool.invoke({"x": 1, "y": 2}) 

3. StructuredTool

当我们调用Tool的类方法from_function试图根据一个具有多个参数的函数创建对应Tool对象的时候,抛出的ToolException提示使用StructuredTool。StructuredTool和Tool其实很类似,它们都是利用指定的同步函数和coroutine作为同步和异步执行体。除了提供针对多参数的支持外,StructuredTool还可以利用Pydantic模型类型定义输入结构,自动为LLM生成符合规范的参数描述(对应于args_schema字段),并对输入进行实时校验。它还可以直接从指定的函数创建,自动推断参数类型和文档说明。

class StructuredTool(BaseTool):
    description: str = ""
    args_schema: Annotated[ArgsSchema, SkipValidation()] = Field(
        ..., description="The tool schema."
    )
    func: Callable[..., Any] | None = None
    coroutine: Callable[..., Awaitable[Any]] | None = None

    @override
    async def ainvoke(
        self,
        input: str | dict | ToolCall,
        config: RunnableConfig | None = None,
        **kwargs: Any,
    ) -> Any:
        if not self.coroutine:
            return await run_in_executor(config, self.invoke, input, config, **kwargs)
        return await super().ainvoke(input, config, **kwargs)

    def _run(
        self,
        *args: Any,
        config: RunnableConfig,
        run_manager: CallbackManagerForToolRun | None = None,
        **kwargs: Any,
    ) -> Any:
        if self.func:
            if run_manager and signature(self.func).parameters.get("callbacks"):
                kwargs["callbacks"] = run_manager.get_child()
            if config_param := _get_runnable_config_param(self.func):
                kwargs[config_param] = config
            return self.func(*args, **kwargs)
        msg = "StructuredTool does not support sync invocation."
        raise NotImplementedError(msg)

    async def _arun(
        self,
        *args: Any,
        config: RunnableConfig,
        run_manager: AsyncCallbackManagerForToolRun | None = None,
        **kwargs: Any,
    ) -> Any:
        if self.coroutine:
            if run_manager and signature(self.coroutine).parameters.get("callbacks"):
                kwargs["callbacks"] = run_manager.get_child()
            if config_param := _get_runnable_config_param(self.coroutine):
                kwargs[config_param] = config
            return await self.coroutine(*args, **kwargs)
        return await super()._arun(
            *args, config=config, run_manager=run_manager, **kwargs
        )

    @classmethod
    def from_function(
        cls,
        func: Callable | None = None,
        coroutine: Callable[..., Awaitable[Any]] | None = None,
        name: str | None = None,
        description: str | None = None,
        return_direct: bool = False,  
        args_schema: ArgsSchema | None = None,
        infer_schema: bool = True,  
        *,
        response_format: Literal["content", "content_and_artifact"] = "content",
        parse_docstring: bool = False,
        error_on_invalid_docstring: bool = False,
        **kwargs: Any,
    ) -> StructuredTool

它也定义了类方法from_function作为创建StructuredTool对象的工厂方法。在调用此方法的时候,我们可以手工指定表示输入参数Schema的args_schema。如果没有指定,但是infer_schema参数为True(默认为True),则会通过分析函数签名对输入参数Schema进行推断。如果args_schema没有指定、并且infer_schema也被设置为False,此时args和tool_call_schema属性对应的Schema将由_run方法的签名进行推断。由于_run方法签名的固定的,推断出来的Schema根本不能体现输入参数的结构,它将使工具将变成一个参数黑洞。

对于前面执行失败的演示程序,如果将Tool类型替换成StructuredTool就没问题。

from langchain_core.tools import StructuredTool
tool = StructuredTool.from_function(
    func = lambda x, y: x + y,
    name = "add",
    description = "Add two numbers together.")
assert tool.invoke({"x": 1, "y": 2}) == 3

4. @tool装饰器

如果我们调用create_agent指定的工具是一个函数,它会利用@tool装饰器函数将其转换成一个BaseTool对象。由于BaseTool的description是通过函数的docstring创建的,鉴于此字段的重要性,如果指定的函数没有定义docstring,转换过程将会失败。我们也可以将这个装饰器显式应用到自定义的函数上,并指定相应的参数对创建的BaseTool作相应的定制。LangChain为@tool装饰器函数定义了很多重载,最终调用的则是如下这个。

def tool(
    name_or_callable: str | Callable | None = None,
    runnable: Runnable | None = None,
    *args: Any,
    description: str | None = None,
    return_direct: bool = False,
    args_schema: ArgsSchema | None = None,
    infer_schema: bool = True,
    response_format: Literal["content", "content_and_artifact"] = "content",
    parse_docstring: bool = False,
    error_on_invalid_docstring: bool = True,
    extras: dict[str, Any] | None = None,
) -> BaseTool | Callable[[Callable | Runnable], BaseTool]:

从tool函数的定义可以看出,被转换成BaseTool对象的原始对象不仅可以是一个函数(同步或者异步),还可以是一个Runnable对象。通过相应关键字参数,我们可以指定BaseTool绝大部分的字段。infer_schema和args_schema这两个参数很重要,如果infer_schema为True或者显式指定了args_schema,最终创建的是一个StructuredTool对象。否则创建的就是一个Tool对象,由于Tool对象支持单参数函数,函数一旦违反这个约定就会报错,所以要么显式指定args_schema,要么保持infer_schema为True,永远使用StructuredTool来表示注册的工具。

AI Agent核心架构解析:从LLM工具调用到自主智能体实战 在人工智能领域,智能体(Agent)是指能够感知环境、自主决策并执行行动以实现目标的实体。其核心原理基于感知-决策-行动-目标的闭环框架,通过大型语言模型(LLM)作为认知核心,赋予系统自然语言理解和任务规划能力。这一技术的核心价值在于将传统被动响应的聊天机器人升级为能主动调用工具、处理复杂任务的操作系统级助手。在实际应用场景中,AI Agent已广泛应用于智能客服、自动化办公、数据分析等领域,通过工具调用实现日程管理、信息检索等具体功能。本文聚焦于**工具调用型助手**和**自主目标驱动型智能体**两大关 阅读详情

相关推荐

腾讯Agent Suite办公智能体套件:让智能体从“回答问题”到“执行任务”

AI Agent正从“问答式对话”迈向“任务自动化执行”,其核心在于将大模型与工作流编排、企业系统连接能力结合。基于RAG的知识库让智能体理解企业内部数据,通过统一接入网关(如MCP协议)调用异构系统,实现跨系统业务动作。这种技术路径在办公场景中极具价值:审批流转、周报生成、客户服务等重复性流程可交由智能体自动处理,同时保留人工确认与审计追踪。以腾讯Agent Suite为代表的办公智能体套件,正是将上述原理工程化落地,提供从流程设计、工具接入到权限治理的一体化平台,帮助企业高效实现智能化改造。

weixin_34054866的博客 410

从功能App到AI智能体:实战构建旅行规划Agent的技术架构与实现

最近在技术社区和开发者圈子里,一个话题被反复提及:“AI将会取代90%的App”。这听起来像是一个大胆的预言,但作为一名长期关注技术演进和工程实践的开发者,我认为这背后反映的是一种深刻的范式转移趋势,而不仅仅是简单的功能替代。我们正处在一个从“功能驱动”的App时代,向“智能驱动”的AI Agent时代过渡的十字路口。对于开发者而言,这既是挑战,更是前所未有的机遇。本文将从一个技术实践者的角度,深入剖析这一趋势背后的技术逻辑、当前的应用形态,并提供一个完整的实战案例,展示如何将一个传统的“功能型”App重构

HJ921004的博客 339

智能体平台选型难?基于Agent Playground的跨平台评测方法论

大模型应用开发进入深水区后,智能体已不再是“能不能做出来”的问题,而是“用哪个平台做更合适”。面对Dify、Coze、LangChain等各具特色的智能体平台,团队常因缺失统一评测标准而陷入选型困境。Agent Playground的定位正是补齐这一环,它提供可控的对比环境,将主流智能体放在相近任务下观察输出、延迟、稳定性和成本。本文从智能体评测的概念与原理出发,剖析平台定位、模型接入、工具调用与多智能体协作四个关键维度,给出可落地的跨平台评测脚本和任务集设计方法,并结合工程实践总结高频排错方案。无论是否使

weixin_34377919的博客 351

从大模型到AI智能体:核心架构、实战开发与进阶路线全解析

大语言模型(LLM)作为强大的内容生成与推理引擎,其核心价值在于理解和生成自然语言。然而,要让其从“虚拟大脑”转变为能解决实际问题的“实干家”,关键在于为其赋予感知、规划和执行能力,这正是AI智能体(AI Agent)的核心原理。通过整合规划、记忆和工具调用三大模块,智能体能够自主分解复杂任务、利用外部工具并积累经验,从而在自动化办公、数据分析、智能客服等场景中创造巨大技术价值。本文以ReAct(推理+行动)模式为例,结合LangChain等主流框架,深入剖析了智能体的工作循环与多智能体协作系统,并提供了从

weixin_30236595的博客 600

AI Agent架构演进与工程实践:从对话到行动的核心技术解析

在人工智能领域,大语言模型(LLM)作为核心的认知引擎,其能力已从静态的文本生成演进到动态的任务执行。这一转变的核心原理在于引入了‘感知-思考-行动’的循环范式,使AI具备了规划与执行能力。其技术价值在于将AI从信息处理者升级为任务执行者,实现了业务流程的自动化与智能化。在应用场景上,这催生了智能客服、自动化运维、数据分析助手等一系列能实际‘做事’的应用。本文聚焦于实现这一能力的AI Agent架构,深入剖析其从ReAct框架到多智能体系统的演进路径,并分享在工具设计、记忆管理、规划反思等关键组件上的工程实

weixin_30591551的博客 380

Manus独立运营背后:通用AI Agent的技术底座与工程化突围

AI Agent正从演示级走向生产级应用,其核心能力取决于任务分解、工具调用与记忆系统的深度耦合。通用AI Agent需在无预设边界场景下自主规划、调用外部工具并动态调整策略,而多模态感知与长期记忆进一步决定其任务完成质量。随着技术成熟与工程化落地,独立团队在决策链路、路线连续性与中立模型调度上的优势愈发凸显,推动Agent从单点工具演变为系统级生产力。本文以Manus恢复独立运营为引,拆解通用Agent的技术栈演进与2026年量产趋势,为开发者提供从零搭建与避坑的实践视角。

weixin_34152820的博客 211

Hermes Agent 智能体框架入门:从函数调用到工具编排实战

大模型应用正在从单纯的问答生成走向自主执行任务,而智能体(Agent)框架正是这一范式转换的关键支撑。函数调用作为大模型连接外部世界的行动接口,让模型不仅能理解意图,还能调用工具完成实际操作。Hermes Agent 作为一套目标明确的智能体执行框架,围绕任务抽象,整合模型、工具、记忆与执行循环,为开发者提供了清晰稳定的工具编排体验。本文从函数调用原理出发,讲解智能体与聊天机器人的本质区别,分析短期记忆与长期记忆的分工,并给出安装配置、最小会话示例及时间查询工具调用的完整实践路径。无论你尚未区分 Agent

weixin_29065791的博客 151

AI浪潮下程序员如何破局?从RAG到Agent的进阶路线

在AI技术快速迭代的今天,代码生产方式与程序员岗位能力模型正经历深刻变革。文章从大模型应用开发的基础概念出发,剖析AI辅助编程、RAG检索增强生成、Agent智能体等关键技术原理,指出AI并非取代程序员,而是重新分配精力杠杆。结合Java后端、Python数据、C++基础设施等不同技术方向,梳理出各岗位的转型机遇与学习路径。通过掌握API调用、Prompt工程、向量数据库及Agent工作流,普通开发者也能构建完整的AI应用,在行业调整期找到自身定位。本文旨在提供理性、可执行的应对策略,帮助技术人员在AI浪潮

weixin_33901641的博客 382

Agent指令集:从RISC-V到智能体开发的关键设计

在计算机体系结构中,指令集是软硬件之间可执行操作的契约,RISC-V、x86皆为此道。当这一概念延伸至Agent开发,便成为连接大模型与外部工具、决定智能体行为边界的核心。若模型能跑、API能调,Agent却始终缺乏执行力,往往是因为没有一套清晰定义的“Agent指令集”。它涵盖系统提示词、工具注册、技能封装、记忆策略与安全标签,是模型决策与真实操作之间的桥梁。理解指令集设计,不仅能让Agent稳定完成“查天气、算算术”等基础任务,也能在Function Calling、Agent框架与本地部署中游刃有余,

weixin_30247781的博客 344

AI 和 Agent 到底差在哪?一张对比表 + 一段代码讲透

本文针对新手易混淆大模型AI与Agent的问题,点明二者核心区分标准并非智能强弱,而是是否具备自主执行、循环决策能力:AI仅为纯文本应答的“大脑”,被动输出文字方案,无工具调用、持续行动能力;Agent是搭载AI大脑,叠加工具、记忆与「规划-行动-观察-反思」闭环流程的执行助理,可自主拆解任务、调用外部工具迭代完成完整业务。

2501_93897731的博客 311

Orange Pi 3B+刷入EmuELEC全过程:手把手教程

手把手教你如何在Orange Pi 3B+上成功刷入emuelec系统,涵盖烧录工具、镜像下载到启动设置的完整流程,让复古游戏体验轻松实现。

weixin_35732273的博客 1090

AI智能体为何能攻入Hugging Face却做不好PPT?

AI智能体与大语言模型虽能处理复杂技术任务,却在日常创作任务中表现不佳,根源在于任务的可验证性。当任务具备明确规则、可量化反馈时,Agent能高效闭环;而像PPT制作这类开放目标缺乏客观评价标准,导致Agent能力失焦。理解这一原理,开发者可基于可验证性设计工作流,将模糊任务拆解为可验证子步骤,或引入人工节点。从渗透测试、API调用的工程实践到Hugging Face生态中的Agent应用,这一框架正成为AI智能体落地与Agent工作流设计的关键。

weixin_34034670的博客 303

立创星火计划:基于STM32H743VIH6的Maverick_H743_MK1.0高性能开源飞控硬件全解析

本文详细解析了基于STM32H743VIH6核心的Maverick_H743_MK1.0高性能开源飞控硬件设计。重点阐述了采用双IMU冗余设计、高精度气压计、多路独立电源管理以及丰富接口(如CAN总线)的考量,旨在为穿越机、科研无人机等平台提供强大、可靠的飞行控制解决方案。

weixin_28787801的博客 195

AI开发工具能力进阶:从补全、Agent到本地模型与多智能体编排

AI辅助编程正在从单纯的代码补全,进化为具备项目级理解、任务自动执行和多智能体协作的工程能力。其技术原理涵盖仓库索引、上下文建模、本地模型量化部署以及Agent编排机制,这让开发工具不仅能生成代码片段,还能自主完成跨文件重构、测试驱动开发等复杂任务。在私有化与离线场景中,本地开源模型与Ollama等工具提供了数据安全和高可用性的技术价值;在需求拆解与团队协作中,多智能体框架则进一步扩展了AI的工作边界。从实际经验出发,分享四款进阶工具的能力特点、配置过程与避坑要点,帮助开发者系统理解如何把AI真正纳入研发流

weixin_26812607的博客 321

数据去重复_京东商品评论情感分析|文本数据预处理

本文爬取了十款热销手机的文本评论数据后,首先对文本评论数据做文本预处理,文本评论数据中存在大量的无价值信息,引入无用的文本数据,对其作情感分析,显然没有价值,得出的文本挖掘结果也不尽人意。所以对于文本评论数据先进行文本预处理是必不可少的一步,把大量的、冗余的、无价值的信息去除,可以极大提高文本数据的质量,精确文本分析结果。1 文本去重1.1文本去重的原因文本数据预处理时,首先应去除文本评论数据中反...

weixin_34556808的博客 2073

【多媒体交互】Unity+普通摄像头实现UI事件分析

利用摄像头捕捉用户的手势或动作,结合坐标映射与事件系统触发UI交互

qq_38350004的博客 1312

DynaMate2:动态集成专家工具,让AI智能体自动化科学工作流

在科学计算与AI智能体(Agent)领域,如何将高度定制化的专业工具与追求通用性的智能体系统无缝连接,是提升科研自动化效率的关键挑战。其核心原理在于通过一套标准化的接口描述与动态注册机制,将领域专家(如计算化学、生物信息学)的专用脚本和工具封装成智能体可理解、可调用的标准化服务。这项技术的核心价值在于实现了工具的“热插拔”,无需重写或大量胶水代码,即可将现有工具链快速融入智能体系统,从而自动化复杂的科学工作流,如高通量材料模拟、多组学数据分析等。DynaMate2项目正是这一理念的工程实践,它通过定义精密的

weixin_34050519的博客 302

光纤布拉格光栅(FBG)笔记【1】:波导结构和布拉格波长推导

引言 本文是光纤布拉格光栅(FBG)的笔记【1】,主要介绍了光纤布拉格光栅的波导结构,并且利用动量和能量守恒推导了光纤布拉格波长的表达式 普通光纤中让折射率发生周期性变化就是结构最简单的均匀光纤布拉格光栅(FBG),其波导结构如下图所示。 其传感原理描述可以分为以下的三点: ①光纤纤芯传播的光会在每个光栅面进行反射和透射; ②如果不满足布拉格条件,依次排列的光栅平面反射的光会逐渐变得不同直到最后相互抵消;同时由于系数不匹配,与布拉格波长不相符的光在每个光栅平面的反射也很微弱,这些光大部分在光纤中发生透.

subtitle_的博客 2万+

AI Agent 正式上岗!企业不再只聊天,小白程序员必备收藏指南

本文介绍了企业级 AI Agent 在真实业务场景中的应用,以腾讯云的案例展示 AI Agent 如何在企业中落地并产生实际效果。文章强调企业级 AI 更注重场景、执行和协作,而非简单的聊天功能。通过分析腾讯云提供的解决方案,文章总结了 AI Agent 的三大驱动力:场景连接力、工程驱动力和模型驱动力,并为企业提供了如何准备迎接 AI Agent 时代的建议。💡 AI Agent 上岗了,企业不再只聊天去年你还在拿 AI 写周报、做 PPT。

youmaob的博客 268

Windows MCP 安装教程:让 AI 代理与 Windows 系统无缝交互

通过以上步骤,你已经成功安装和配置了 Windows MCP 服务。现在你的 Cursor 编辑器可以通过 MCP 协议与 Windows 系统进行深度交互,AI 代理能够:启动和控制应用程序执行系统命令自动化 UI 操作获取系统状态信息这为 AI 辅助开发和工作流程自动化提供了强大的基础。如果你在使用过程中遇到任何问题,欢迎在评论区讨论或查看项目的官方文档。

chenchihwen的专栏 3349

某手短视频用户主页视频列表爬虫实战:从原理到完整实现

随着短视频平台的迅猛发展,某手(为保护平台隐私,本文以“某手”代指实际目标)已经成为国内最大的短视频社交平台之一,拥有数亿日活用户。对于数据分析师、内容创作者和市场营销人员而言,获取某个用户主页的视频列表具有重要的研究价值——无论是分析头部创作者的内容策略,还是监测竞品的发布频率与互动数据,爬虫技术都成为不可或缺的工具。然而,在2024-2025年的技术环境下,某手已经构建了多层次的反爬机制:包括接口签名加密、请求参数动态混淆、设备指纹检测、IP行为分析以及Web端无限滚动加载的异步数据获取方式。

2201_76125261的博客 539

智能客服 Agent 评测指南:怎么判断它到底能不能上岗

如今,智能客服Agent早已不是简单的自动回复工具,而是能自主理解意图、调用工具、闭环解决问题的业务智能体。但很多企业落地后都面临同一个难题:怎么判断自家的客服Agent是真好用,还是“看起来能用”?

Python_cocola的博客 290

YOLOv8优化:独家创新(SC_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

独家创新(SC_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 4864

Agent开发实战:从ReAct原理到企业制度问答助手搭建

AI Agent由大模型与规划、工具调用、记忆等模块组合而成,其核心运行机制依赖ReAct模式——模型交替进行思考与行动,借助外部工具获取信息后再生成回答。这种“不懂就查”的架构让大模型从单纯的聊天机器人升级为能执行多步任务的智能体,在知识检索、流程问答等企业场景中显著提升准确性与可控性。围绕Agent落地,开发者在框架选型上可在手写ReAct、LangChain、LangGraph与Dify等低代码平台之间权衡,并通过工具描述优化、上下文记忆裁剪、循环上限与安全权限等手段规避高频踩坑。本文以一套制度条例学

weixin_29051149的博客 186

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

智能体架构解析:从核心组件到工程实践,构建可靠AI伙伴

在人工智能领域,智能体(Agent)作为一种新兴的能力范式,正推动AI从被动工具向主动伙伴转变。其核心原理在于构建一个具备感知、规划、决策与行动循环能力的系统,通过目标驱动在动态环境中完成任务。从技术价值看,智能体通过集成大语言模型的推理能力与外部工具调用,实现了复杂工作流的自动化与智能化,显著提升了任务处理的灵活性和适应性。在应用场景上,智能体广泛应用于自动化流程、个性化服务、数据分析及资源优化等多个领域。本文聚焦于智能体的核心架构,深入剖析其感知规划、记忆工具使用及评估反思等关键模块,并结合ReAct模

weixin_34178244的博客 376

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AI测试开发实战:用LangChain和Agent自动生成UI自动化脚本

AI测试开发正在重塑软件测试的岗位结构,其核心并非让测试人员转行算法,而是将大模型应用工程与自动化测试能力深度融合。理解大模型如何通过结构化输出、Function Calling与Agent框架,实现自然语言测试用例到可执行脚本的转换,是掌握这项技术的关键。借助LangChain编排智能体,结合Playwright执行验证,能够形成“用例解析—脚本生成—自动执行—失败修复”的闭环,显著提升自动化覆盖率和回归测试效率。这一能力已落地于真实项目,从测试用例数字化到脚本生成与自动修复,提供了可复制的工程方法论。本

weixin_29057065的博客 236

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: [拆解LangChain执行引擎-18]Agent状态是如何从通道读取的?
下一篇: [LangChain智能体本质论-07]如何在工具函数中注入各种运行时对象?
JaydenAI
博客等级 码龄1年 241粉丝 319原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值