AI Agent从无到有25: 大模型工具调用(Tool Call)实战指南

LangChain工具调用原理与调试实战:从tool_call_id到稳定Agent 工具调用(Tool Calling)是大语言模型连接现实世界的核心机制,其本质是通过结构化协议实现LLM推理能力与外部执行能力的解耦。LangChain将其工程化为标准化接口,涵盖@tool装饰器、Pydantic参数校验、tool_call_id消息绑定等关键组件。该机制显著提升开发效率,但也因抽象层级过高而加剧调试难度——尤其在ID匹配错位、invalid_tool_calls未拦截、流式chunk累积失当等场景下极易失效。本文聚焦真实项目中高频出现的工具注册一致性、消息链路完整性、少样本提示引导等实践 阅读详情

纲要

  • Tool Call 的核心定义与价值
  • 标准工具调用工作流程
  • 支持 Tool Call 的主流模型生态
  • LangChain 框架下的工具定义方法
    • 基于 @tool 装饰器的函数式定义
    • 基于 BaseTool 类的面向对象定义
  • 工具与模型的绑定机制
  • 工具调用的执行与结果回传
  • 完整可运行代码示例与解析

Tool Call 机制概述

Tool Call(工具调用)是指大语言模型在推理过程中,不直接生成最终文本答案,而是输出一个高度结构化的指令对象。该指令明确指定了需要调用的外部工具(函数、API、服务等)及其参数。这一机制使模型能够突破其训练数据的时间与领域限制,获取实时信息、执行精确计算、操控外部系统,从而真正承担起 AI Agent 决策核心的职能。

在实践层面,Tool Call 广泛支撑着以下场景:实时天气查询、复杂数学运算、数据库检索与更新、本地文件系统操作、IoT 设备控制等。可以认为,缺乏 Tool Call 能力的模型仅能进行信息复述与简单推理,而无法作为独立 Agent 完成实际任务。

标准工具调用流程

一次完整的工具调用交互遵循请求-响应-执行的循环模式。其核心在于:模型生成调用指令,开发者环境执行指令,执行结果回传模型进行下一步推理。这一流程通过以下时序图清晰展示:

Tool Executor Model User Tool Executor Model User 提交自然语言请求(例如:“北京今日天气如何?”) 返回 `AIMessage`,内含 `tool_calls` 字段 执行具体函数(例如:`get_weather("Beijing")`) 返回函数执行结果(天气数据) 将结果封装为 `ToolMessage` 回传 综合工具结果,生成自然语言回复

需要特别强调的是,模型本身并不具备执行工具的能力。它仅负责生成调用指令。开发者必须在应用层解析这些指令,调度并执行对应的本地函数,最后将执行结果封装为标准化消息,重新传递给模型。模型基于这些结果进行下一轮推理,直至生成最终答案。

支持 Tool Call 的模型生态

工具调用能力并非所有大模型的标配功能。以下主流模型及系列已提供官方支持(具体版本可能随时间更新,请以厂商最新文档为准):

厂商模型系列/名称备注
OpenAIGPT-4、GPT-3.5-turbo通过 Chat Completion API 提供 tools 参数
AnthropicClaude 3 系列(Opus, Sonnet, Haiku)支持 tools 定义与调用
GoogleGemini 系列(Pro, Ultra)通过 function_calling 配置启用
开源社区部分通过 Ollama 或 vLLM 部署的微调模型需确认具体模型变体是否支持

在接入前,务必查阅对应厂商的 API 参考文档,验证所选模型版本是否开放了 Tool Call 接口,并明确其参数定义规范。

在 LangChain 中定义工具

LangChain 框架提供了两种核心工具定义方式,开发者可根据项目复杂度与定制需求灵活选择。两种方式定义的工具在元数据结构上完全兼容,绑定到模型时的行为等价。

基于 @tool 装饰器的函数式定义

对于大多数简单到中等复杂度的场景,推荐使用 @tool 装饰器。该方式通过解析函数的类型注解与文档字符串(docstring)自动生成工具的名称、描述和参数 JSON Schema。

适用版本:langchain-core >= 0.1.0

from langchain_core.tools import tool

@tool
def multiply(a: int, b: int) -> int:
    """将两个整数相乘并返回结果。"""
    return a * b

@tool
def add(a: int, b: int) -> int:
    """将两个整数相加并返回结果。"""
    return a + b

关键点:

  • 函数名称自动成为工具名称。
  • 函数的 docstring 自动成为工具描述,模型将依据此描述决定调用时机。
  • 参数的类型注解(int、str 等)用于生成参数校验 Schema。

基于 BaseTool 类的面向对象定义

当需要更精细地控制参数校验规则、异步执行逻辑或复杂初始化过程时,推荐通过继承 BaseTool 类实现。

适用版本:langchain-core >= 0.1.0

from langchain_core.tools import BaseTool
from pydantic import BaseModel, Field

class MultiplyInput(BaseModel):
    a: int = Field(description="第一个乘数")
    b: int = Field(description="第二个乘数")

class MultiplyTool(BaseTool):
    name: str = "multiply"
    description: str = "将两个整数相乘"
    args_schema: type[BaseModel] = MultiplyInput

    def _run(self, a: int, b: int) -> int:
        """同步执行逻辑。"""
        return a * b

    async def _arun(self, a: int, b: int) -> int:
        """异步执行逻辑(可选实现)。"""
        return self._run(a, b)

关键点:

  • name、description 和 args_schema 为类属性,定义工具元数据。
  • _run 方法实现同步调用逻辑,_arun 实现异步逻辑。可根据需要只实现同步版本。
  • 通过 Pydantic BaseModel 定义参数结构,可添加详细的字段描述和校验器。

工具与模型的绑定

定义工具后,需要通过 bind_tools 方法将工具列表注入到 Chat Model 实例中。绑定后,模型在每次调用时会自动分析用户输入,并根据指令决定是否需要生成工具调用请求。

适用版本:langchain-openai >= 0.0.5(OpenAI 后端)

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0,
)
llm_with_tools = llm.bind_tools([multiply, add])

bind_tools 返回一个新的模型实例,该实例在每次 invoke 时会自动将工具定义附加到 API 请求中。模型若判断需要调用工具,则返回的 AIMessage 对象中将填充 tool_calls 属性。

执行工具调用与结果回传

当模型返回的 AIMessage 包含 tool_calls 属性时,开发者需要完成以下循环操作:

  1. 遍历 tool_calls 列表,解析每个调用的 name、args 和 id。
  2. 根据 name 调度并执行对应的本地函数。
  3. 将执行结果封装为 ToolMessage,并确保 tool_call_id 与原始请求 ID 一一对应。
  4. 将 ToolMessage 与历史对话消息一同发回模型,用于生成最终回复。

此循环可能执行多轮,直到模型不再生成 tool_calls 为止。

完整可运行代码示例

以下示例演示了从用户提问到模型最终回复的完整工具调用流程。代码包含工具定义、模型绑定、调用解析、工具执行和结果回传五个阶段。

环境准备

安装依赖包(建议使用 Python 3.9+ 环境):

pip install langchain-openai langchain-core

设置环境变量 OPENAI_API_KEY,或在代码中显式传入 api_key 参数。

完整代码

适用版本:langchain-openai == 0.0.5,langchain-core == 0.1.0

import os
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage, AIMessage, ToolMessage

# ---------- 1. 定义工具 ----------
@tool
def multiply(a: int, b: int) -> int:
    """计算两个整数的乘积。"""
    return a * b

@tool
def add(a: int, b: int) -> int:
    """计算两个整数的和。"""
    return a + b

# ---------- 2. 初始化模型并绑定工具 ----------
llm = ChatOpenAI(
    model="gpt-3.5-turbo",
    temperature=0,
    api_key=os.getenv("OPENAI_API_KEY")  # 建议从环境变量读取
)
llm_with_tools = llm.bind_tools([multiply, add])

# ---------- 3. 构造用户请求 ----------
user_question = "3乘以12再加上5的结果是多少?"
print(f"用户: {user_question}")

# ---------- 4. 第一次调用:模型生成工具调用指令 ----------
response = llm_with_tools.invoke([HumanMessage(content=user_question)])

# ---------- 5. 检查并处理工具调用 ----------
if response.tool_calls:
    print("模型请求的工具调用:")
    for tc in response.tool_calls:
        print(f"  {tc['name']}({tc['args']})")

    # 执行工具调用,并收集结果消息
    tool_messages = []
    for tc in response.tool_calls:
        # 根据工具名称调度执行
        if tc["name"] == "multiply":
            result = multiply.invoke(tc["args"])
        elif tc["name"] == "add":
            result = add.invoke(tc["args"])
        else:
            result = "未知工具"
        print(f"工具返回: {result}")

        # 封装为 ToolMessage,务必携带正确的 tool_call_id
        tool_messages.append(
            ToolMessage(
                content=str(result),
                tool_call_id=tc["id"]
            )
        )

    # ---------- 6. 第二次调用:传入工具结果,生成最终答案 ----------
    final_answer = llm_with_tools.invoke(
        [HumanMessage(content=user_question)] + [response] + tool_messages
    )
    print(f"助手: {final_answer.content}")
else:
    # 模型未请求工具,直接输出回答
    print(f"助手(直接回答): {response.content}")

运行输出示例

用户: 3乘以12再加上5的结果是多少?
模型请求的工具调用:
  multiply({'a': 3, 'b': 12})
  add({'a': 36, 'b': 5})
工具返回: 36
工具返回: 41
助手: 3乘以12等于36,再加上5等于41。

关键点解读

  • 自动分解任务:模型将复合算术问题自动拆解为乘法与加法两步独立调用。
  • 参数传递准确:第二次调用(加法)的参数依赖于第一次调用(乘法)的结果,模型在生成调用序列时已进行内部推理。
  • 消息关联:ToolMessage 中的 tool_call_id 必须与 AIMessage.tool_calls 中的 id 严格匹配,否则模型将无法正确关联工具结果与请求。
  • 结果综合:最终答案由模型基于工具返回的结构化数据进行组织,以自然语言形式呈现给用户。

API 速览

以下为本博客涉及的核心 API 及其用法概览,适用于 langchain-core >= 0.1.0。

tool 装饰器

属性说明
所属库langchain_core.tools
用法@tool 装饰一个函数,自动转换为 StructuredTool 实例
关键参数函数名称(自动)、docstring(自动)、类型注解(自动)
返回值StructuredTool 对象,具备 invoke 和 ainvoke 方法

BaseTool 基类

属性说明
所属库langchain_core.tools
关键属性name、description、args_schema
关键方法_run(同步执行)、_arun(异步执行)
返回值子类实例,具备 invoke 和 ainvoke 方法

ChatOpenAI.bind_tools

属性说明
所属库langchain_openai
方法签名bind_tools(tools: List[BaseTool]) -> Runnable
参数工具对象列表(StructuredTool 或 BaseTool 实例)
返回值绑定了工具定义的可运行对象(Runnable),支持 invoke、stream 等

ToolMessage

属性说明
所属库langchain_core.messages
构造方法ToolMessage(content: str, tool_call_id: str)
关键字段content:工具执行结果(字符串形式);tool_call_id:对应请求的 ID

Demo 示例

本博客的完整代码示例已集成于上一章节。此处提供一个可直接运行的 HTML + JavaScript 前端演示(使用浏览器原生 fetch 调用 OpenAI API),以便直观展示工具调用在前端应用中的形态。

运行说明

  1. 将以下 HTML 代码保存为 tool_call_demo.html。
  2. 在浏览器中打开该文件。
  3. 在输入框中填入 OpenAI API Key 和自然语言问题(例如“3乘以12再加5等于多少?”)。
  4. 点击“发送”按钮,查看控制台日志及最终结果。

代码说明

  • 前端直接调用 OpenAI Chat Completion API,传递 tools 参数定义算术工具。
  • 当模型返回 tool_calls 时,前端 JavaScript 解析并执行本地函数,再将结果作为 tool 角色消息回传。
  • 整个过程通过异步 fetch 实现,展示了 Tool Call 机制与前端交互的无缝集成。

完整 Demo 代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI Agent Tool Call 前端演示</title>
    <style>
        body { font-family: system-ui, sans-serif; max-width: 800px; margin: 40px auto; padding: 0 20px; }
        textarea { width: 100%; padding: 8px; margin: 8px 0; }
        button { padding: 10px 24px; background: #007bff; color: white; border: none; border-radius: 6px; cursor: pointer; }
        pre { background: #f5f5f5; padding: 12px; border-radius: 6px; overflow-x: auto; }
    </style>
</head>
<body>
    <h2>AI Agent Tool Call 演示</h2>
    <label>OpenAI API Key:</label><br>
    <input type="password" id="apiKey" style="width:100%; padding:8px; margin-bottom:12px;" placeholder="sk-...">
    <label>用户问题:</label><br>
    <textarea id="userQuestion" rows="2" placeholder="例如:3乘以12再加上5的结果是多少?">3乘以12再加上5的结果是多少?</textarea><br>
    <button id="sendBtn">发送</button>
    <h3>输出日志</h3>
    <pre id="logOutput">等待操作...</pre>

    <script>
        document.getElementById('sendBtn').addEventListener('click', async () => {
            const apiKey = document.getElementById('apiKey').value.trim();
            const question = document.getElementById('userQuestion').value.trim();
            const log = document.getElementById('logOutput');

            if (!apiKey) { log.textContent = '请填写有效的 OpenAI API Key。'; return; }
            if (!question) { log.textContent = '请输入用户问题。'; return; }

            log.textContent = '正在处理...';

            const tools = [
                {
                    type: "function",
                    function: {
                        name: "multiply",
                        description: "将两个整数相乘",
                        parameters: {
                            type: "object",
                            properties: {
                                a: { type: "integer", description: "第一个乘数" },
                                b: { type: "integer", description: "第二个乘数" }
                            },
                            required: ["a", "b"]
                        }
                    }
                },
                {
                    type: "function",
                    function: {
                        name: "add",
                        description: "将两个整数相加",
                        parameters: {
                            type: "object",
                            properties: {
                                a: { type: "integer", description: "第一个加数" },
                                b: { type: "integer", description: "第二个加数" }
                            },
                            required: ["a", "b"]
                        }
                    }
                }
            ];

            const messages = [{ role: "user", content: question }];

            try {
                // 第一次调用
                let response = await callOpenAI(apiKey, messages, tools);
                let assistantMessage = response.choices[0].message;

                if (assistantMessage.tool_calls) {
                    log.textContent = '模型请求工具调用:\n' + JSON.stringify(assistantMessage.tool_calls, null, 2);

                    // 执行工具
                    messages.push(assistantMessage);
                    for (const tc of assistantMessage.tool_calls) {
                        const funcName = tc.function.name;
                        const args = JSON.parse(tc.function.arguments);
                        let result;
                        if (funcName === 'multiply') {
                            result = args.a * args.b;
                        } else if (funcName === 'add') {
                            result = args.a + args.b;
                        } else {
                            result = '未知工具';
                        }
                        log.textContent += `\n工具 ${funcName} 返回: ${result}`;
                        messages.push({
                            role: "tool",
                            tool_call_id: tc.id,
                            content: String(result)
                        });
                    }

                    // 第二次调用
                    response = await callOpenAI(apiKey, messages, tools);
                    const finalAnswer = response.choices[0].message.content;
                    log.textContent += `\n助手最终回答: ${finalAnswer}`;
                } else {
                    log.textContent = '模型直接回答:\n' + assistantMessage.content;
                }
            } catch (err) {
                log.textContent = '错误:' + err.message;
            }
        });

        async function callOpenAI(apiKey, messages, tools) {
            const resp = await fetch('https://api.openai.com/v1/chat/completions', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': `Bearer ${apiKey}`
                },
                body: JSON.stringify({
                    model: 'gpt-3.5-turbo',
                    messages: messages,
                    tools: tools,
                    temperature: 0
                })
            });
            if (!resp.ok) {
                const errData = await resp.json();
                throw new Error(errData.error?.message || `HTTP ${resp.status}`);
            }
            return await resp.json();
        }
    </script>
</body>
</html>

参考文档

官方文档

参考链接

总结

本文系统梳理了大模型工具调用(Tool Call)的核心机制,从概念定义、工作流程、模型生态到 LangChain 框架下的具体实现,提供了完整的理论讲解与可运行的代码示例。关键要点如下:

  • Tool Call 使模型具备与外部世界交互的能力,是构建 AI Agent 的基石。
  • 标准流程为“模型生成调用指令 → 开发者执行工具 → 结果回传模型 → 综合生成最终答案”。
  • LangChain 提供 @tool 装饰器和 BaseTool 继承两种灵活的定义方式,推荐优先使用装饰器。
  • bind_tools 方法将工具列表绑定到模型,模型通过 AIMessage.tool_calls 返回调用请求。
  • 开发者必须正确解析 tool_calls,执行本地函数,并使用 ToolMessage 回传结果,确保 tool_call_id 匹配。
  • 实际项目应注重工具描述的准确性,以提升模型的调用决策质量。

通过本文的实战示例,开发者可以快速将 Tool Call 能力集成到自己的 Agent 系统中,实现从“能说”到“能做”的跨越。

Spring AI神器!原生Tool Calling让AI自动调用Java方法,代码简洁10倍_spring ai tool call-优快云博客 原生Tool Calling是大模型厂商(如OpenAI、Anthropic)在模型层面提供的功能。当开发者注册一组工具(包含名称、描述、参数结构)后,模型会在需要时返回一个结构化的tool_calls对象,而不是自然语言文本。这个对象明确指出了要调用的工具名和参数值,由服务端执行后,再将结果返回给模型生成最终回答。整个过程完全标准化,开发者只需关注工具的实现,无需操心格式解析。首先,我们创建一个工具类,用@Tool@Component。 阅读详情

相关推荐

AI Agent开发实战:从Tool到Workflow的完整构建指南

在人工智能应用开发领域,Agent架构正成为连接大语言模型与实际业务需求的关键技术范式。其核心原理在于通过模块化设计,将复杂任务分解为可执行的原子操作单元,从而实现自动化决策与执行。从技术价值角度看,这种架构显著提升了AI系统的可扩展性、可维护性和任务完成能力,使得单一模型能够处理多步骤、多工具的复杂场景。在实际工程实践中,开发者需要掌握从基础工具封装、技能组合到工作流编排的完整链路。本文聚焦于LangChain与LangGraph等主流框架,通过构建天气查询、旅行规划等具体案例,详细演示了如何实现Tool

weixin_34238633的博客 1185

大模型调用外部工具的实战指南

随着深度学习技术的飞速发展,特别是大型语言模型(Large Language Models, LLMs)的涌现,我们正步入一个全新的时代。这些模型通过大规模的训练,能够掌握丰富的语言知识和模式,具备回答复杂问题、生成多样文本的能力。然而,想象一下,大模型就像是一个拥有无尽知识库和卓越沟通能力的超级学者,它拥有非凡的才华。它可以为你详细列出制作美食的步骤,包括原料比例和烹饪技巧,但它自己却无法亲自拿下厨,因此,让大型AI模型与外部工具相结合,就如同给这位超级学者配备了实验室、工厂、厨房等一系列实践场所和工具。

aolan123的博客 4839

LangChain工具调用核心原理与tool_call_id致命细节

LangChain工具调用本质是LLM与外部系统间的协议桥接,其核心在于标准化的工具声明、结构化参数解析与异步结果回填机制。框架通过@tool装饰器实现工具元数据自动注入,依赖tool_call_id作为跨阶段唯一标识符,确保生成、执行、回传三环节精准锚定。该设计在提升开发效率的同时,也引入了协议抽象损耗、执行权移交与流式语义偏差等工程权衡。典型应用场景包括智能客服中台、多步骤数据查询Agent及数学计算服务编排——而所有稳定落地的前提,是对tool_call_id生命周期和args类型兼容性的深度理解。

weixin_30443747的博客 366

如何让大模型自由使用外部知识与工具

本文将分享为什么以及如何使用外部的知识和工具来增强视觉或者语言模型。全文目录:1. 背景介绍OREO-LM: 用知识图谱推理来增强语言模型REVEAL: 用多个知识库检索来预训练视觉语言模型AVIS: 让大模型用动态树决策来调用工具01背景介绍首先介绍示例“德州的 NBA 球队有哪些?他们分别在哪一年获得 NBA 总冠军?”对于这样的问题,ChatGPT 可以非常准确地回答。这个例子说明了类似 GPT 的模型,已经有非常强的世界知识记忆能力,并且存储在它们的参数当中,针对不同的问题,它能够准确地将其调用回答

机器学习社区 1800

基于LangChain构建本地大模型智能体:从工具调用到Agent实战

大语言模型(LLM)作为决策引擎,能够理解用户意图并生成文本,但其本身无法直接操作外部系统或数据。为解决这一局限,工具调用(Tool Calling)技术应运而生,它通过标准化接口将外部能力(如API、数据库、文件操作)封装成模型可理解的“技能”,使LLM能够结构化地请求并利用这些功能。这项技术的核心价值在于实现了“思考”与“行动”的结合,极大扩展了AI的应用边界,使其从单纯的对话助手升级为能够自主完成复杂任务的智能体(Agent)。在工程实践中,通过框架(如LangChain)协调LLM、工具和决策循环,

weixin_30388677的博客 434

大模型调用工具魔搭GPT——一键调用魔搭社区上百个AI模型的API

阿里云表示,将对外开放构建ModelScopeGPT 的数据集和训练方案,开发者可以根据需要对不同的大模型和小模型进行组合,构建自己的模型调用方案。它能够通过担任“中枢模型”的大语言模型一键调用魔搭社区其他的AI模型,实现大模型和小模型协同完成复杂任务。魔搭社区作为“模型自由市场”,展现了大模型生态的未来图景:通过降低大模型的研发和使用的门槛,让AI模型和开发者作为生产要素,既有集聚、更有流动,在自由市场上寻找最优配置,借助群体智慧探索大模型的商业化路径,让AI普惠成为可能。

实战AI智能体 2723

最近,大模型岗位爆了。。。

重磅消息,国资委打响了国内AI第一枪!这意味着传统行业又迎来了一次大洗牌,现在国内头部人工智能公司已经开始用AI数字人助力各行各业,。除此之外,知名大厂也都在布局AI市场。懂的程序员年薪已经翻到风口之下,与其焦虑被行业淘汰,不如先人一步掌握 AI 大模型技术。为帮助大家提升竞争力,为了帮助普通程序员享受时代红利,掌控AI大模型技术,成为超级个体,给大家带来了AI大模型全套资料。

2301_82275412的博客 1555

《UE4游戏开发》之 《查cook资源失败,问题记录》

当项目打包时,cook出错,但是从原始引擎提供的信息中,没有提示具体的那个资源出错,要查到出错资源,还是非常麻烦。 下面就材质cook出错,增加一些日志,方便查找问题做简单记录 材质cook的一个阶段,是收集MaterialShaderMap,如果在这个阶段收集的信息出错,将会在FShaderMapContent::GetOutdatedTypes函数中,因为Shaders指针指向的内存有问题而出错,通过断点发现,FShaderMapContent这个类对象指针为null,而这个类对象的来源于AllMat.

qq_21919621的博客 2581

大模型工具/函数调用原理和实践

大模型工具调用技术演进与实践指南 摘要:OpenAI从Function Calling升级为更通用的Tool Calling机制,使大模型能够调用多样化工具集。本文系统介绍了工具调用的核心原理、技术架构与实现方法。工具调用将大模型转变为"规划者"角色,通过结构化请求与外部系统交互,弥补LLMs在时效性、精确性和系统集成方面的局限。关键技术包括提示工程和函数调用两种方式,其中函数调用因标准化JSON输出成为主流方案。文章详细演示了使用LangChain定义工具、转换OpenAI接口规范及实

Q2024107的博客 2659

从零开始掌握OBD-II:汽车诊断开发的核心技术与实战解析

本文深入解析OBD-II汽车诊断系统的核心技术,包括ECU通信协议、故障码解析及诊断工具开发实战。通过详细的协议分析和代码示例,帮助开发者快速掌握汽车诊断开发技能,实现从零到精通的进阶。特别适合从事汽车电子开发和OBD检测的技术人员参考学习。

weixin_42528780的博客 441

自然语言处理:稀疏向量表示

稀疏向量表示是指运用特定的方法和技术,将数据(如文本、图像、信号等)转化为向量形式,且该向量具有大部分元素值为零,仅少数元素值非零的特征,以此来实现对数据的高效存储、处理和分析。

老赵爱学习的博客 1444

零基础学AI大模型之LangChain Tool工具

工藤学编程是一位专注于编程技术分享的博主,涵盖C++、SpringBoot、分库分表、消息队列等技术领域。近期推出"零基础学AI大模型"系列教程,从大模型基础概念到LangChain框架应用、RAG技术、向量数据库(Milvus)实战等36篇深度解析,系统讲解AI大模型开发全流程,包括Prompt工程、文档处理、Embedding优化、相似度搜索等核心内容,适合开发者从入门到进阶学习AI大模型开发技术。

chandfy的博客 1341

电路研究9.4——合宙Air780EP的LuatOS、CSDK跟标准AT

 C-SDK、AT指令、LuatOS

esmember的博客 1116

大模型开发 - 27 Tool Calling:Spring AI 中的工具调用指南

本文介绍了Spring AI中的工具调用(Tool Calling)机制,帮助AI模型扩展外部能力。工具调用分为信息检索(如查询时间)和执行动作(如设置闹钟)两类。通过@Tool注解定义工具,如获取用户时区时间的DateTimeTools类,注册工具后模型可智能调用。这种机制实现了模型决策+应用执行的隔离架构,既扩展了AI功能又保障了系统安全。文中提供了完整代码示例,展示从工具定义到调用的全流程。

小工匠 1815

【AI Agent 记忆共享实战】【下篇】多 Agent 会话 Session 统一共享实战:全链路工程落地、采集归一、MCP 服务、私有化部署、源码级实战

中篇我们已经锁定最终最优架构方案: 非侵入式、外部旁路采集、只读归一、中心化存储、MCP 按需检索注入。摒弃「改 Agent 源码」「软链接互通」「原生 Session 互导」等不现实方案。本篇直接落地可上线、可简历复用、可个人私有化部署多 Agent 异构 Session专属采集器(Claude/CODex/DSH/OpenCode/Kimi/WorkBuddy/ 豆包)统一消息归一化解析层(解决所有 Schema 异构)增量同步、去重、时间戳对齐核心逻辑。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 485

FPGA实践教程: 使用HLS将C程序生成IP核心进行FPGA开发

请根据您使用的FPGA开发板和供应商选择适当的HLS工具,并按照他们的安装指南进行安装。根据您使用的FPGA开发板和供应商选择适当的HLS工具,并按照他们的安装指南进行安装。通过本教程,您了解了如何使用HLS工具将C程序生成IP核心,并将其用于FPGA开发。在HLS项目中,您可以对C程序进行设计和优化,以生成对应的IP核心。在HLS项目中,您可以对C程序进行设计和优化,以生成相应的IP核心。将导出的IP核心导入到FPGA项目中。使用FPGA开发环境的菜单中的"导入"或"添加文件"选项导入IP核心。

CqpFsharp的博客 455

大模型开发 - 30 Tool Calling:Spring AI Tool Calling 工作原理及源码详解

Spring AI中的Tool Calling机制解析 Spring AI的Tool Calling机制实现了大模型与企业业务逻辑的安全交互,包含两个核心阶段: 工具注册与描述注入 通过反射与注解解析,将Java方法转换为LLM可理解的JSON Schema(如OpenAI格式),并随请求发送给模型。例如带@Tool注解的方法会被自动转译为标准化工具描述。 模型决策与自动调用 当模型判断需调用工具时,会返回结构化指令而非自然语言。典型流程为:模型返回包含tool_calls字段的响应→系统解析指令→执行对应

小工匠 2246

YOLOv11改进策略【SPPF】| AIFI : 基于Transformer的尺度内特征交互,在降低计算成本的同时提高模型的性能

本文记录的是基于AIFI模块的YOLOv11目标检测改进方法研究。AIFI是RT-DETR中高效混合编码器的一部分,利用其改进YOLOv11模型,

Limiiiing的博客 2241

从Function Call到多Agent系统:大模型应用开发实战指南

大语言模型(LLM)通过Function Calling技术,实现了从封闭的文本生成系统到能与外部世界交互的智能体的关键跨越。其核心原理是为模型定义一套标准化的JSON Schema接口,使其能够“决策”调用哪个外部函数并解析参数,而具体的“执行”则由开发者的代码控制,从而在保证安全性的前提下扩展了模型的能力边界。这一技术价值在于将大模型的强大推理与规划能力与精准、实时的外部工具(如数据库、API)相结合,极大地拓展了AI的应用场景,使其从聊天对话走向自动化任务处理、智能助手和企业级业务流程编排。本文聚焦于

weixin_33895475的博客 378

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2057

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

大模型小白必看:收藏!揭秘AI如何调用外部工具,解锁Agent核心能力

本文深入解析了AI大模型如何通过“工具调用”机制感知和操作外部世界,即使训练数据已截止。从最底层的Function Call(函数调用)到标准化的Tool(工具)概念,再到MCP(模型上下文协议)的统一接口设计,以及Skill(技能)的工作流封装和CLI(命令行界面)的系统级操作,文章详细阐述了这五大核心概念的演变与协作关系。通过实例说明,AI助手如何整合这些能力完成复杂任务,展现了工具调用在构建能自主行动的AI Agent中的核心地位,为想要深入了解AI工程化的小白提供了清晰的进阶路径。 ---

2401_85154887的博客 797

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

AI大模型-工具调用(Tool Calling):Agent的“超能力”来源

工具调用(Tool Calling):Agent的“超能力”来源

m0_73165198的博客 1120

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

大模型开发 - 29 Tool Calling:大模型与业务系统集成的利器 _Tool Calling 实战指南

本文介绍了大模型开发中的Tool Calling功能及其在智能票务场景下的应用。Tool Calling允许大模型主动调用外部函数,实现业务操作和信息增强。文章以Spring AI框架为例,展示了如何通过@Tool和@ToolParam注解将业务方法注册为大模型工具,并给出了具体代码实现。该技术解决了大模型无法访问私有数据和执行操作的问题,使其能够完成退票等实际业务需求,同时保证安全可控。

小工匠 1493

一文秒懂AI核心:Agent、RAG、Function Call与MCP全解析

如今大语言模型(LLM)的风头一时无两,它们能写诗、能聊天、能编程,简直无所不能!但你有没有发现,有时候它们也挺“傻白甜”的?比如问它今天的天气,它可能给你一个“根据我的知识库…”的过时答案;让它帮你整理本地文件,它只能表示爱莫能助。这是因为 LLM 本身像一个博学但与世隔绝的大脑。,以及一个新晋的潜力股——。今天,我们就用大白话+生动比喻,带你一次搞懂这四大金刚,看看它们是如何协同作战,让 AI 从“理论派”变身“实干家”的!之前。

m0_48891301的博客 1781

零基础学AI大模型之LLM绑定Tool工具实战

工藤学编程博主专注于AI大模型与编程技术分享,最新文章涵盖C++图书管理系统、SpringBoot整合MinIO等技术实战。特别推出"零基础学AI大模型"系列教程,包含35篇从入门到实战的完整指南,内容涵盖大模型原理、LangChain框架、Prompt工程、RAG技术、向量数据库(Milvus)等核心知识,并提供Docker部署、Python整合等实战案例。适合开发者系统学习AI大模型应用开发。

chandfy的博客 1529

AI Agent 工程实践(13):Tool Calling——Agent 为什么要学会用工具?

文章摘要: 本文探讨了AI Agent工具调用(Tool Calling)的核心设计,提出让Agent从“顾问”(仅分析)升级为“工程师”(可执行)的关键在于工具治理四件套:Schema(契约声明)、Registry(统一管理)、Selection(安全裁剪)和Retry(分类兜底)。工具能力分六层梯度(LLM内嵌→Database),越往外风险越高,需严格约束。通过声明式管理(如JSON Schema)和结构化调用(如动态路由),解决工具选择、格式漂移和失败重试等问题。

2401_85223846的博客 451
上一篇: AI Agent从无到有24: 本地大模型部署与LangChain接入实战
下一篇: AI Agent从无到有26: 基于LangChain标准事件驱动大模型实践
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值