为什么你的Function Calling总失败?4大底层逻辑揭秘+调试技巧

第一章:大模型函数调用教程

在构建智能应用时,大模型的函数调用能力是实现外部工具集成的关键机制。通过定义结构化函数描述,模型可识别用户意图并生成符合规范的调用请求,进而触发实际功能执行。

函数描述定义

需向模型提供JSON格式的函数元信息,包括名称、描述及参数类型。以下为查询天气的函数示例:
{
  "name": "get_weather",
  "description": "获取指定城市的当前天气信息",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "城市名称"
      }
    },
    "required": ["city"]
  }
}
该定义告知模型当用户提及“查看天气”等语义时,应构造包含 city 参数的调用请求。

调用流程控制

模型输出函数调用指令后,系统需解析并执行对应逻辑。典型处理步骤如下:
  1. 接收模型返回的 function_call 字段
  2. 提取函数名与参数值
  3. 执行本地函数或远程API
  4. 将结果以 message 形式回传模型进行最终回复生成

响应整合策略

执行结果需按特定格式重新输入模型,以完成上下文闭环。例如:
{
  "role": "function",
  "name": "get_weather",
  "content": "{\"temperature\": 25, \"condition\": \"晴\"}"
}
模型将基于此内容生成自然语言回答,如:“当前气温25℃,天气晴朗。”
角色类型用途说明
user用户原始输入
assistant模型生成的函数调用或回复
function函数执行结果回传
graph LR A[用户提问] --> B{模型判断} B -->|需调用函数| C[生成function_call] C --> D[执行函数逻辑] D --> E[回传结果] E --> F[生成最终回复] B -->|无需调用| G[直接回复]

第二章:Function Calling的核心机制解析

2.1 函数调用的底层通信协议与消息格式

在分布式系统中,函数调用依赖于底层通信协议实现跨节点交互。主流框架通常采用 gRPC 或 HTTP/JSON 作为传输协议,其中 gRPC 基于 HTTP/2 支持多路复用,显著提升调用效率。
典型通信协议对比
  • gRPC:使用 Protocol Buffers 序列化,性能高,适合内部服务间调用
  • HTTP/JSON:通用性强,易于调试,常用于外部 API 接口
消息格式结构
{
  "method": "getUser",        // 调用方法名
  "params": { "id": 123 },    // 参数对象
  "trace_id": "abc-123"       // 分布式追踪ID
}
该结构包含方法标识、序列化参数和上下文信息,确保调用可追溯。字段经 Protocol Buffers 编码后通过 HTTP/2 传输,实现低延迟通信。
字段类型说明
methodstring目标函数名称
paramsobject序列化后的参数
trace_idstring用于链路追踪

2.2 模型如何理解并解析函数描述(Function Schema)

模型在调用外部工具时,依赖结构化的函数描述(Function Schema)来理解其用途与参数。该Schema通常遵循JSON格式,明确声明函数名、功能说明及输入参数类型。
函数Schema示例
{
  "name": "get_weather",
  "description": "获取指定城市的当前天气",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "城市名称"
      }
    },
    "required": ["city"]
  }
}
上述代码定义了一个名为get_weather的函数Schema。模型通过name识别调用目标,借助description理解语义,并依据parameters中的结构化信息提取用户输入中的实体。
解析流程
  • 词法分析:将自然语言请求拆解为语义单元
  • 模式匹配:比对函数名与描述的关键词相似度
  • 参数抽取:根据参数类型约束从上下文中提取值

2.3 参数类型推断与上下文对齐原理

在现代编程语言中,参数类型推断通过分析调用上下文自动确定函数参数的类型,减少显式声明负担。编译器结合函数体内的使用方式与外部调用模式进行双向类型约束求解。
类型推断过程
  • 基于赋值右侧表达式推导变量类型
  • 根据函数调用的实参类型反向推断形参类型
  • 利用返回值上下文完成表达式类型闭合
代码示例:Go 泛型中的类型对齐

func Map[T, U any](slice []T, f func(T) U) []U {
    result := make([]U, len(slice))
    for i, v := range slice {
        result[i] = f(v) // T 和 U 由上下文自动推断
    }
    return result
}

// 调用时无需指定类型
nums := []int{1, 2, 3}
squared := Map(nums, func(x int) string { return fmt.Sprintf("%d", x*x) })
上述代码中,T 被推断为 int,U 为 string,函数参数与返回值在上下文中完成类型对齐。

2.4 调用决策过程:何时发起而非生成文本回复

在复杂系统交互中,决定是否调用外部服务而非直接生成文本回复,是提升响应准确性的关键机制。
决策触发条件
常见触发场景包括用户请求涉及实时数据、需执行操作或信息超出模型知识范围。此时系统应转向API调用。
判断逻辑实现
// 判断是否需要调用外部服务
func shouldInvokeAPI(query string) bool {
    keywords := []string{"天气", "股价", "查询订单"}
    for _, kw := range keywords {
        if strings.Contains(query, kw) {
            return true
        }
    }
    return false
}
该函数通过关键词匹配识别意图。若输入包含“天气”“股价”等实时性词汇,则返回true,触发后续服务调用。
  • 关键词策略适用于规则明确的场景
  • 更复杂场景可结合NLU置信度阈值判断

2.5 实战:构建高兼容性的函数定义规范

在跨平台与多语言协作的系统中,函数接口的兼容性直接影响集成效率。为确保函数定义具备良好的可读性、可维护性与广泛适配能力,需制定统一规范。
核心设计原则
  • 参数标准化:优先使用对象解构传参,提升调用灵活性;
  • 类型注解:在支持的语言中强制启用类型提示;
  • 向后兼容:禁止修改已有函数签名,新增功能通过可选参数扩展。
示例:TypeScript 中的高兼容函数

function fetchData(
  url: string,
  options?: {
    timeout?: number;
    withCredentials?: boolean;
    headers?: Record<string, string>;
  }
): Promise<Response> {
  const { timeout = 5000, withCredentials = false, headers = {} } = options || {};
  // 发起请求逻辑
  return fetch(url, { signal: AbortSignal.timeout(timeout), withCredentials, headers });
}
该函数采用可选配置对象,所有字段均有默认值,确保老调用方式仍有效。返回值使用标准 Promise 封装,便于异步链式调用。

第三章:常见失败场景的根源分析

3.1 函数描述模糊导致语义歧义的典型案例

在接口设计中,函数命名和文档描述不清晰极易引发调用方误解。例如,一个名为 UpdateUser(id, data) 的函数,若未明确说明是否更新关联字段,可能导致数据一致性问题。
典型错误场景
  • 函数名暗示“更新用户”,但未说明是否包含密码重置
  • 文档未定义空值字段的处理策略(忽略 or 清除)
  • 返回值含义模糊,如布尔值 true 表示“存在变更”还是“持久化成功”
代码示例与分析
func UpdateUser(id string, data map[string]interface{}) bool {
    // 若 data 中 email 为 nil,是否清除原邮箱?
    // 文档未说明,导致调用方行为不一致
    user := FindUser(id)
    if user == nil {
        return false
    }
    MergeUserData(user, data)
    return Save(user)
}
该函数返回 bool,但未通过文档或签名说明其语义是“用户存在”、“数据变更”还是“写入成功”,造成多系统集成时逻辑错乱。理想做法是返回结构体明确状态:{Success: bool, Modified: bool, Error: error}。

3.2 参数嵌套过深或类型不匹配的调试实录

在一次微服务接口联调中,前端传递的嵌套参数在后端解析时频繁报错。问题源于 JSON 结构层级过深且部分字段类型与预期不符。
典型错误场景
{
  "user": {
    "profile": {
      "address": {
        "detail": { "city": "Beijing", "zip": "100000" }
      }
    }
  },
  "age": "25"
}
后端期望 age 为整型,但实际传入字符串,导致反序列化失败。
调试策略
  • 使用日志逐层打印入参结构
  • 引入结构体标签进行类型强制转换
  • 前置校验中间件拦截非法请求
通过增加类型断言和默认值回退机制,系统稳定性显著提升。

3.3 上下文长度限制对多轮调用的影响与规避

在多轮对话系统中,模型的上下文长度限制直接影响历史信息的保留能力。当累计输入超过最大长度时,早期对话内容将被截断,导致语义连贯性下降。
常见规避策略
  • 上下文滑动窗口:保留最近N轮对话
  • 关键信息摘要:将历史对话压缩为结构化摘要
  • 外部记忆存储:利用向量数据库持久化长期记忆
基于摘要的上下文压缩示例

def summarize_history(conversation):
    # 使用轻量模型生成对话摘要
    summary_prompt = f"""
    请总结以下对话的核心信息:
    {conversation[-6:]}  # 最近三轮
    """
    return llm_generate(summary_prompt)
该函数仅保留最近几轮对话并生成语义摘要,显著降低token消耗,同时维持关键上下文连续性。

第四章:高效调试与稳定性优化策略

4.1 使用日志追踪函数调用链与中间状态

在复杂服务调用中,清晰的函数调用链与中间状态记录是排查问题的关键。通过结构化日志输出,可有效还原执行路径。
结构化日志示例
log.Printf("entering ProcessOrder, orderID=%s, userID=%s", orderID, userID)
result := validateOrder(order)
log.Printf("validation complete, status=%t", result)
上述代码在关键节点输出参数与状态,便于追溯流程执行情况。orderID 和 userID 作为上下文信息,帮助关联分布式调用。
调用链日志建议字段
  • trace_id:全局唯一追踪ID,贯穿整个调用链
  • function_name:当前函数名称,明确执行位置
  • input_params:输入参数摘要,用于复现场景
  • timestamp:高精度时间戳,辅助性能分析

4.2 构建模拟请求环境进行单元测试

在单元测试中,真实HTTP请求不可控且效率低下,需构建模拟请求环境以提升测试稳定性和执行速度。
使用 httptest 模拟 HTTP 服务
Go 的 net/http/httptest 包可创建临时服务器模拟接口行为:
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(200)
    w.Write([]byte(`{"status": "ok"}`))
}))
defer server.Close()

resp, _ := http.Get(server.URL)
上述代码创建一个返回 JSON 响应的模拟服务,server.URL 提供动态地址,确保测试隔离性。
测试场景对比
场景真实请求模拟请求
网络依赖强无
执行速度慢快
数据可控性低高

4.3 错误码解读与重试机制设计

在分布式系统中,正确解读错误码是实现稳定通信的前提。常见的错误码可分为客户端错误(4xx)与服务端错误(5xx),其中 5xx 类错误如 503(服务不可用)通常适合进行重试。
典型错误码分类
  • 429 Too Many Requests:触发限流,应结合退避策略重试
  • 503 Service Unavailable:临时性故障,推荐重试
  • 400 Bad Request:客户端数据错误,不应重试
指数退避重试示例
func retryWithBackoff(operation func() error, maxRetries int) error {
    for i := 0; i < maxRetries; i++ {
        if err := operation(); err == nil {
            return nil
        }
        time.Sleep(time.Second * time.Duration(1 << i)) // 指数退避:1s, 2s, 4s...
    }
    return errors.New("operation failed after max retries")
}
该函数通过左移运算实现指数级延迟,避免频繁请求加剧系统负载,适用于处理瞬时故障。

4.4 提升鲁棒性:降级方案与兜底响应设计

在高可用系统设计中,降级策略是保障核心功能稳定的关键手段。当依赖服务异常或响应超时时,系统应主动切换至预设的兜底逻辑,避免级联故障。
常见降级场景
  • 第三方接口超时或返回错误
  • 数据库主库不可用
  • 缓存穿透导致负载激增
兜底响应实现示例(Go)
func GetData(ctx context.Context) (*Response, error) {
    result, err := callExternalService(ctx)
    if err != nil {
        log.Warn("fallback triggered due to external error")
        return &Response{
            Data:   getDefaultData(), // 返回默认配置
            Source: "local-fallback",
        }, nil
    }
    return result, nil
}
上述代码中,当外部服务调用失败时,系统不会抛出异常,而是通过 getDefaultData() 返回本地缓存的默认值,确保响应可达。
降级策略控制表
场景降级方式兜底数据来源
支付网关异常关闭非核心支付入口静态提示页
推荐服务超时返回热门内容列表本地缓存

第五章:未来演进方向与生态展望

服务网格与云原生深度集成
随着 Kubernetes 成为容器编排的事实标准,服务网格(如 Istio、Linkerd)正逐步与云原生生态深度融合。例如,在多集群管理中,通过 Gateway API 实现跨集群流量调度已成为主流方案。
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: api-route
spec:
  parentRefs:
    - name: internal-gateway
  rules:
    - matches:
        - path:
            type: Exact
            value: /api/v1/users
      backendRefs:
        - name: user-service
          port: 80
边缘计算场景下的轻量化运行时
在 IoT 和 5G 推动下,边缘节点对资源敏感。KubeEdge 和 OpenYurt 提供了将 Kubernetes 能力下沉到边缘的解决方案。以下为 KubeEdge 部署轻量化 Pod 的资源配置示例:
组件CPU 请求内存请求适用场景
edgecore100m128Mi边缘代理
device-plugin50m64Mi设备接入
安全可信的运行环境构建
机密计算(Confidential Computing)结合硬件级加密(如 Intel SGX),正在被集成至容器运行时。gVisor 和 Kata Containers 双管齐下,提供强隔离与性能平衡。实际部署中,可通过以下方式启用 Kata:
  • 配置 containerd 使用 kata-runtime 作为 runtime handler
  • 在 Pod 注解中指定 runtimeClassName: kata
  • 验证 workload 是否运行于独立轻量虚拟机中
GPT-4.5 Function Calling 实战:构建稳定股票行情AI助手 大语言模型(LLM)在金融场景中面临结构化输出不可靠、数据实时性差、语义理解模糊等核心挑战。Function Calling 技术通过将模型角色从‘文本生成器’升级为‘任务调度中枢’,实现语义理解与数据执行的严格解耦,显著提升AI调用API的准确率与鲁棒性。结合GPT-4.5增强的工具描述解析能力与参数泛化识别,该方案可稳定支撑股价查询、新闻聚合等高频投研需求,并天然适配FastAPI服务化、Redis缓存、异常分级处理等工程实践。本文聚焦金融垂直领域,以Stock Data Integration为落地切 阅读详情

相关推荐

LangChain对接DeepSeek V4的function calling踩坑指南

大模型工具调用(tool calling)是构建智能Agent的核心能力,其底层依赖于模型与框架间严格的协议契约。OpenAI兼容API虽提供统一接口表象,但DeepSeek V4在thinking_mode启用、strict模式Schema校验、tool_call_id双向绑定等关键机制上采用原生强约束设计,与LangChain默认抽象存在深层不匹配。本文聚焦function calling落地中的高频断点:JSON Schema的additionalProperties限制、reasoning_effo

weixin_33907511的博客 400

LangChain工具调用避坑指南:为什么你的Function Calling总被模型忽略?

本文深入解析LangChain中Function Calling的常见问题与解决方案,涵盖工具注册、参数类型、多轮对话管理等核心难点。通过实战案例揭示Docstring编写、异步调用优化等关键技巧,帮助开发者避免模型忽略函数调用的典型陷阱,提升LLM工具调用效率。

weixin_30823001的博客 386

AI Agent 实战入门:从 Function Calling 到 MCP 工具开发

AI Agent 是具备感知、决策与执行能力的智能程序,其核心原理在于大模型通过结构化输出触发外部工具调用,形成闭环反馈。Function Calling 作为关键机制,使 LLM 能主动发起 HTTP 请求或本地函数执行;MCP 协议则进一步标准化了工具描述与通信方式,提升跨框架复用性。这种技术组合显著降低了本地化、可调试、可演进的智能体开发门槛,广泛应用于客服助手、数据查询、自动化运维等轻量级场景。本文聚焦真实开发链路,带你基于 Ollama 与 LangChain,从零实现一个支持联网查天气的 MCP

dianyin7770的博客 493

Undefined function or variable. The first assignment to a local variable determin its class.

matlab的coder工具箱能够把大多数matlab代码转换为c/c++代码或dll。今天在转换一个函数时出现了以下错误:Undefined function or variable 'imfs'. The first assignment to a local variable determines its class. 我的matlab代码如下: function [imfs, residual] = fun_vmd(data, num_imfs) [imfs, ...

youyingbo的专栏 1万+

任务与函数:从调度逻辑到Function Calling的排查与实践指南

在并发编程与后端开发中,任务(Task)与函数(Function)是两类基础但容易混淆的概念。函数作为代码组织单元,负责封装逻辑与接口契约;任务则作为调度单元,决定逻辑何时运行、如何并发。理解二者区别,能有效避免诸如“error running remote compact task”或“no matching member function for call to 'connect'”等典型报错。从C#的async/await、Python的asyncio与Celery,到JavaScript的Promi

weixin_33483304的博客 308

AI Agent工程落地核心:Function Calling与MCP实战解析

AI Agent并非拟人化数字员工,而是将人类高成本认知过程拆解为可验证、可回滚的机器指令流的工程系统。其底层依赖意图解析、工具调度、推理编排与结果封装四层严格耦合的架构。其中Function Calling作为神经突触,提供LLM输出结构化函数调用的能力;MCP协议则构建起动态发现、权限治理与成本可控的工具脊髓反射弧。二者差异本质是静态绑定与运行时演进的范式分野,直接决定Agent在电商导购、多轮教育、自主进化等场景中的扩展性与稳定性。本文基于200+真实业务压测经验,揭示从提示词宪法设计、Schema版

weixin_30654583的博客 325

强化学习(RL)实战:DPO RL 大幅提升 Agent Function-Calling 能力

本文介绍了使用强化学习中的DPO算法来提升AI Agent工具调用能力的实战方法。主要内容包括:1)记录Agent调用过程获取原始数据;2)通过AutoToolDPO自动生成DPO微调数据集,解决人工标注成本高的问题;3)使用LLaMA Factory进行模型微调。项目提供完整代码,可高效生成符合DPO格式的训练数据,显著提升Agent在工具选择、参数拼接和多轮对话中的准确性。

fufan_LLM的博客 1985

ReAct架构与Function Calling在智能客服中的实践

ReAct(Reasoning+Acting)是一种前沿的Agent架构范式,通过交替进行推理和行动,使大模型能够处理复杂任务。Function Calling作为大模型与外部工具对接的标准化协议,为ReAct提供了行动抓手。这种组合在智能客服、动态决策和专业工具操作等场景中表现出色。本文通过实际案例,展示了如何利用ReAct和Function Calling提升系统处理复杂工单的效率,并详细解析了架构原理、工程实现和性能优化。

611

Tool Calling/Function Calling

LLM 是一个"只会说话的大脑",Function Calling 就是给它装上了"手"。场景没有 Function Calling有 Function Calling你问“今天北京天气怎么样?“今天北京天气怎么样?LLM回答“我不知道,我的知识截止到2023年…”心里想:用户要查天气 → 我该调 get_weather() 函数 → 返回结果:“北京今天晴,25°C”本质:LLM 不自己回答,而是决定"该调用哪个函数",然后把结果拿回来说给你听。把 LLM 想象成一个。

Ycy的博客 405

手把手实现可调试的AI Agent:ReAct+Function Calling+RAG本地实战

AI Agent并非黑盒魔法,而是基于ReAct(推理-行动-观察)范式的可控决策循环。其核心原理在于大语言模型通过Function Calling精准调用工具,并借助RAG增强外部知识感知能力。这种架构显著提升任务准确性与可解释性,适用于客服问答、订单查询、智能运维等需强逻辑控制与实时响应的工程场景。本文聚焦本地化落地,以Ollama运行Qwen2模型、LangChain组件精用、手写ReAct主循环和双层RAG为关键实践路径,解决Function Calling解析不稳定、RAG幻觉放大、Agent死循

weixin_30615767的博客 397

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

ESP32S连接JY61P并通过WIFI把姿态数据发送给电脑1.采用Arduino IDE编译器;需要安装ESP32的开发板管理器;2.电脑接受数据是基于python的;

Doudou_Nai的博客 1132

从源码拆解Agent Skills与Function Calling,底层实现、核心差异与实操指南

摘要: 2026年Claude Code源码泄露揭示了Agent Skills与Function Calling的本质差异。Function Calling是原子化工具执行框架,通过结构化接口(Tool)实现严格校验与七步闭环流程,适用于单步操作。而Skills实为提示词注入器(PromptCommand),通过SkillTool适配器将动态生成的指令(SKILL.md模板)注入模型上下文,实现流程编排与执行控制。两者协作模式上,Function Calling是Agent的“手脚”,Skills则是“大脑

小程故事多的博客 737

VMware 15 虚拟机安装Ubuntu 18.04

这几年在自动化、计算机之间游来游去,最近又要做机器学习相关的课题,14年做的虚拟机实在不堪重用了,OK,我们重新开始。 VMware的安装就不再赘述了,目前最新版本是15.0.2,官方下载地址: https://my.vmware.com/en/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation_pro/15_0...

略懂 2万+

Function Calling本质:让大模型精准执行而非自由生成

Function Calling 是大语言模型(LLM)从文本生成迈向可控执行的关键范式升级,其核心在于通过结构化 Schema 将任务意图显式编码为模型可理解、可验证的契约。它绕开了传统 prompt engineering 中依赖关键词匹配与正则解析的脆弱路径,利用 OpenAI 模型原生支持的 tool use 机制,在推理层强制输出符合定义的参数结构,显著提升 JSON 合规率与字段完整率。该技术价值在客服工单、物流查询、CRM 同步等需强确定性的业务场景中尤为突出,本质是重构人机协作中的责任边界—

weixin_30411819的博客 589

英飞凌TC377的Flash管理、UCB配置与HSM安全机制解析

本文深入解析了英飞凌TC377微控制器的Flash存储结构、UCB配置机制与HSM安全模块。详细阐述了带Cache与不带Cache的PFlash地址访问差异、利用SOTA与AB Swap实现无感OTA更新的原理,以及如何通过UCB安全配置启动流程与写保护。重点剖析了HSM硬件安全模块在密钥管理、安全启动与安全OTA中的核心作用,为开发高可靠性嵌入式系统提供实战指南。

weixin_29170327的博客 523

LTspice 导入 PSpice 模型实战指南 --(解决语法兼容性与模型优化问题)

本文提供了将PSpice模型成功导入LTspice的详细实战指南。针对两者间的语法兼容性问题,文章以TI UCC23513为例,逐步讲解模型获取、符号创建、常见语法错误修改及仿真验证方法,并分享了模型优化与个人库管理技巧,帮助用户高效解决模型导入与仿真难题。

weixin_28278377的博客 821

Function Calling与MCP协议在智能体协作中的实践

函数调用(Function Calling)是将自然语言指令转化为结构化操作的核心技术,通过LLM实现意图识别和参数提取,为智能系统提供精准的功能调度能力。消息控制协议(MCP)作为通信保障层,解决了多智能体协作中的路由、同步和容错等关键问题。这两种技术的协同应用能显著降低通信开销,提升任务完成率,特别适合金融风控、智能客服等对实时性要求高的场景。在实际工程中,通过函数预加载、连接复用等优化手段,可使系统QPS提升78%,延迟降低63%。

weixin_33739541的博客 1215

Anaconda下安装LabelImg

Anaconda下安装LabelImg

LYH8543的博客 756

Function Calling的现状和未来的发展

Function Calling(函数调用)作为2023年大型语言模型(LLM)突破性技术,标志着AI从单纯的文本生成向具备实际行动能力的智能体系统的关键转变。本报告基于2024-2025年最新技术发展,系统分析Function Calling在AI助手应用中的技术原理、优劣势表现及演进趋势。核心观点概括:技术价值:Function Calling使AI助手能够突破知识边界,通过调用外部API实现实时数据访问和复杂任务自动化,构建完整的Agent执行链路[0†]。主要优势。

dingyuana的专栏 1261

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

笔试题-2023-紫光展锐-数字芯片设计【纯净题目版】

w0shishabi的博客 2923

基于互联网的智能旧衣回收箱设计与实现

本文介绍了基于嵌入式系统的智能旧衣回收箱的设计与实现,涵盖了硬件设计、软件开发、图像识别、物联网连接等方面的内容。通过利用最新的技术,如图像识别、物联网和云计算,实现了智能、便捷的旧衣物回收系统。未来,随着技术的不断进步,智能回收系统将会在环保领域发挥更大的作用。

2201_76125393的博客 908

MCP、Function Calling,到底有什么区别?它们和 AI Agent 有关系吗?

MCP(模型条件化提示)和Function Calling是大模型应用中的两项关键技术。MCP通过嵌入条件约束优化模型输出,适用于文本生成场景;Function Calling则让模型直接调用函数接口,实现系统操作自动化。二者在AI Agent中协同工作:MCP提升"思考"能力,Function Calling增强"执行"能力。实际应用中需注意提示设计、接口定义等挑战,通过调试验证和异常处理确保稳定性。这两项技术共同构成了现代智能体的核心能力框架。

霍格沃兹测试学院的博客 1072

STM32入门教程:智能储物柜控制

在这个例子中,我们将使用一个4x4的储物柜,共有16个储物格。我们了解了硬件准备、储物柜电路设计、STM32的基本配置、储物柜控制代码的编写以及测试和调试等方面的知识。根据我们的电路设计,我们需要将一些引脚配置为输出,并将其他引脚配置为输入。在本教程中,我们将使用STM32微控制器来实现一个基本的智能储物柜控制系统。在主函数中,我们将不断循环读取传感器数据,并根据数据的变化来控制储物柜的开关和显示相关信息。这个函数将读取人体感应传感器、温湿度传感器和光照传感器的数据,并将数据存储到相应的变量中。

m0_75244442的博客 662

FuncReAct:用OpenAI Function Calling落地ReAct智能体

ReAct(推理+行动)是大语言模型实现任务型智能的核心范式,其本质是将复杂问题分解为可验证的思考步骤与确定性工具调用。OpenAI Function Calling通过API级结构化输出契约,从根本上规避了传统文本解析导致的格式幻觉与调用失败,使模型‘想清楚再动手’成为工程现实。该技术显著提升Agent在企业自动化、工作流提效和低代码集成等场景中的稳定性与响应确定性,尤其适用于需高精度工具调度的金融、客服与数据处理任务。本文聚焦FuncReact这一轻量级实践方案,深入解析function calling

weixin_33892359的博客 382

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

AI Agent开发中的Function Calling核心技术解析

Function Calling是大语言模型(LLM)调用外部工具的核心技术,它使AI从单纯的对话能力升级为能执行实际任务的智能体(Agent)。该技术通过结构化请求和API调用,实现了用户意图识别、功能执行和结果整合的完整工作流。在AI Agent开发中,Function Calling与Tool Calling常被提及,前者侧重单个功能调用协议,后者则包含更完整的工具管理生态。这项技术在电商客服、智能家居控制等场景中展现出巨大价值,能有效提升系统的实用性和用户体验。随着多工具协作、自动工具学习等新趋势的

weixin_34037173的博客 351

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

大模型Function Calling实战:从聊天到执行的AI应用开发指南

在人工智能应用开发领域,大语言模型(LLM)的文本生成能力已广为人知,但其从“理解”到“执行”的跨越,则依赖于一种关键机制——函数调用(Function Calling)。这一机制的核心原理在于,通过指令微调(Instruction Tuning)和结构化输出训练,模型能够将用户的自然语言指令,精准映射到开发者预定义的工具函数上,并生成标准化的调用请求。其技术价值在于,它有效解决了大模型“幻觉”和无法操作外部系统的痛点,实现了智能规划与可靠执行的职责分离,成为构建生产级AI智能体(AI Agent)的基石。

weixin_34319111的博客 414
上一篇: 从单卡到千卡集群:PyTorch大模型并行训练的进阶之路
下一篇: 为什么你的Qwen部署总是失败?深度剖析常见故障与解决方案
FastSolve
博客等级 码龄1年 155粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值