Hello folks,我是 Luga,今天我们来聊一下人工智能应用场景落地 - 如何为
LLM 集成选择合适的策略?
众所周知,大型语言模型(LLMs)已经彻底改变了企业自动化、客户交互以及决策制定的方式,其强大的语言生成能力为各行业带来了前所未有的机遇。然而,要充分发挥 LLMs 的潜力,仅仅部署一个预训练模型是远远不够的。企业需要在实际应用中将 LLMs 无缝集成到现有系统中,确保其在释放创造力的同时,能够保持输出的可控性;在提供灵活性的同时,兼顾结构的严谨性;在推动创新的同时,确保系统的稳定性和可靠性。
然而,这种集成并非易事。LLMs 的输出通常具有一定的随机性和不可预测性,如何在满足业务需求的同时对其进行有效控制和结构化,成为企业在实际部署中面临的最大挑战之一。
随着技术的发展,两种主流的解决方案逐渐浮现:函数调用(Function-Calling)和模型上下文协议(Model Context Protocol,简称 MCP)。这两种方法虽然都旨在提升 LLMs 的可预测性和生产就绪状态,但它们在设计理念、实现方式和适用场景上有着显著差异。深入理解这些差异,不仅有助于企业在集成 LLM s时做出明智的技术选择,还能为构建更高效、更可靠的智能系统奠定基础。
—01 —
如何理解 Function Calling ?
众所周知,LLMs 本质上是一种生成式技术,其核心优势在于能够生成富有创意且高度契合上下文的输出。这种特性使得 LLMs 在诸多任务中表现出色,例如,进行生成代码片段,或是参与开放式的对话互动。无论是用于提升工作效率还是优化用户体验, LLMs 的创造力都展现了巨大的潜力。
然而,在企业环境中,这种生成能力却往往是一把双刃剑。企业通常需要的是可预测、结构化的输出,以确保其与特定的业务流程、监管要求或品牌规范保持一致,而 LLMs 的自由生成特性可能难以完全满足这些需求。
那么,该如何理解“
函数调用(Function-Calling)”?
本质上而言,无码可以一句话概括:为特定任务提供结构化输出。
通常而言,
函数调用是一种广受欢迎的 LLM 集成方法,其核心在于通过定义明确的函数签名,约束模型生成符合预设接口的结构化响应。通过这种方式,LLMs 的输出可以被精确地引导,从而更轻松地融入现有的企业系统,满足业务场景对一致性和规范化的要求。
作为一种更直接的机制,通常嵌入在大型语言模型(LLM)内部,Function Calling 用于在模型生成响应时动态调用外部函数或 API。其主要涉及如下组件:
-
用户:发起查询。
-
大型语言模型(LLM):直接解析查询,决定是否需要调用函数,并生成响应。
-
函数声明:预定义的外部函数接口(如天气API的调用方式)。
-
外部API:提供具体数据或服务。
以下是一个 OpenAI 函数调用的 JSON 定义示例,用于获取指定地点的当前天气信息,具体可参考如下:
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定地点的当前天气信息",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市名称,例如:香港、台北"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "温度单位"
}
},
"required": ["location"]
}
}
}
在实际的业务场景中,
在函数调用的框架下,开发者首先需要创建一组具有明确输入和输出参数的函数。当用户与 LLM 进行交互时,模型会根据用户的输入内容,智能地识别出需要调用的函数,并生成符合该函数预期格式的响应。例如,函数可能要求返回一个特定的数据类型(如字符串或 JSON 对象),而 LLM 则被限制在这一范围内生成输出。
因此,此种方法特别适合那些需要精确、结构化数据的任务,例如数据提取、分类或外部 API 调用等相关场景。
—02
—
如何理解 Model Context Protocol (MCP) ?
尽管函数调用(Function-Calling)在处理结构化任务时表现出色,但模型上下文协议(Model Context Protocol,简称 MCP)则采用了完全不同的设计思路。
作为一种分层式技术,通过系统性地组织上下文和提示,MCP 为大型语言模型(LLM)提供更加灵活且可控的交互方式。相较于函数调用的刚性约束,MCP 更擅长处理复杂、多步骤的对话场景,尤其是在需要维持上下文连贯性和动态适应用户需求的场景中,其优势尤为明显。
通常情况下,MCP 的设计更偏向于模块化和分布式系统,强调清晰的流程控制和中间状态管理。其主要涉及如下核心组件:
-
用户:发起查询(如“香港的天气如何?”)。
-
MCP Client:接收用户查询,协调工具选择和任务分配。
-
MCP Server:执行具体的工具调用(如调用天气API)。
-
LLM(大型语言模型):处理自然语言,生成最终输出。
-
工具(Tools):外部 API 或其他功能模块(如天气API)。
以下是一个使用 MCP 框架实现的简易服务器示例,用于获取指定地点的天气信息,具体代码可参考如下:
from mcp import MCPServer, Tool, Parameter
# 初始化MCP服务器
server = MCPServer()
@server.tool
class WeatherTool(Tool):
"""用于获取指定地点天气信息的工具"""
@server.function
def get_weather(self, location: Parameter(description="城市名称"),
unit: Parameter(description="温度单位", default="celsius")):
"""获取指定地点的当前天气"""
# 调用天气API的实现(此处为模拟数据)
return {"temperature": 22, "condition": "晴天", "humidity": 45}
# 启动服务器
server.start()
在实际的场景中,MCP 的核心在于通过分层的方式分解和组织交互过程。每一层上下文都为 LLM 提供了特定的指令、约束条件或背景信息,从而在模型生成响应时,既能保持其创造性,又能确保输出与业务目标高度契合。
具体来说,MCP 的每一层可能包含不同的信息模块,例如任务目标、用户背景、业务规则或历史对话记录。模型在生成响应时,会综合考虑所有上下文层的信息,确保输出的准确性和相关性。这种分层设计不仅为模型的行为提供了清晰的引导,还避免了过度限制其生成能力,使得 LLM 能够在复杂场景中展现更高的灵活性和智能性。
—03
—
MCP & Function Calling 设计理念差异性解析
1、MCP 设计理念:模块化、分布式与可控的智能任务执行框架
-
模块化与分布式架构:MCP 将任务划分为多个独立模块(如 Client、Server、LLM、Tools ),每个模块专注于特定功能。这种设计方式非常适合分布式系统,能够支持多个组件的协同工作,确保任务的高效完成。
-
中间状态管理:MCP 在每个处理步骤(例如工具选择、API 调用、数据处理)中都实现了明确的状态管理。这种管理方式有助于调试过程中的问题定位,并且能够有效进行错误处理。
-
安全性与控制:MCP 引入了“ API 请求审批”等安全控制机制,以增强系统的安全性和可控性,从而使得 MCP 特别适用于需要严格权限管理和高安全要求的应用场景。
2、Function Calling 设计理念:集成化、模型驱动与轻量级的功能扩展方案
-
集成化与高效性:Function Calling 将函数调用逻辑直接嵌入 LLM 中,从而简化了系统架构并减少了中间层。这种设计有助于提高系统的响应速度,并且适用于需要快速响应和高效执行的简单任务。
-
模型驱动:在 Function Calling 中,LLM 扮演着核心角色,负责从解析用户查询到生成响应的整个过程。该设计依赖于大型语言模型的智能能力,能够理解函数声明并基于此提供精确的功能调用。
-
轻量级架构:由于去除了复杂的中间层,Function Calling 显得更加轻量,适合嵌入式系统或单体应用,能够减少系统复杂度并提高维护效率。
—04
—
MCP vs Function Calling,该如何选 ?
函数调用(Function-Calling)和模型上下文协议(MCP)作为两种主流的大型语言模型(LLM)集成方法,各有其独特的应用场景和优势。它们并非互相替代,而是互为补充,能够在不同的业务需求和技术环境中发挥各自的价值。理解两者的适用场景,不仅有助于企业在 LLM 集成时做出明智的选择,还能为构建高效、可靠的智能系统提供清晰的指导方向。
那么,在实际的业务场景中,如何决策呢?
以下是关于如何选择 Function-Calling 或 MCP 的详细建议,并探讨如何结合两者以实现更优的解决方案。
1、使用 Function-Calling 的场景
Function-Calling 以其结构化和高效的特点,成为许多特定任务的首选方法。以下是其适用的典型场景,具体可参考:
-
需要结构化、可预测的输出:当任务对输出的格式和内容有严格要求时,函数调用能够通过预定义的函数签名,确保 LLM 生成的结果始终符合预期。例如,在需要返回固定格式的 JSON 数据时,函数调用可以有效约束模型行为。
-
任务边界清晰且需要特定数据格式:对于那些目标明确、数据格式固定的任务,函数调用表现出色。例如,在数据提取任务中,模型可能需要从文本中提取日期、金额等信息,并以特定格式(如“YYYY-MM-DD”)返回。
-
目标是将 LLM 无缝集成到现有系统:函数调用天然契合传统的软件架构,能够通过明确的接口(如 API )将 LLM 嵌入到企业系统中。例如,在一个需要调用外部服务的场景中,函数调用可以直接映射到 API 请求。
典型案例:
-
数据提取:从用户提交的文本中提取关键信息,如提取订单号或用户信息。
-
工单分类:如前文所述,将客户支持工单分类为“账单问题”或“技术支持”。
-
API 集成:通过调用天气 API 获取实时天气数据,并以结构化格式返回。
在上述这些场景中,Function-Calling 能够以较低的开发成本和较高的可控性,快速满足业务需求。
2、使用 MCP 的场景
相比之下,MCP 以其灵活性和上下文管理能力,更适合复杂、多步骤的交互场景。以下是其适用的典型场景:
-
涉及复杂、多步骤的交互:当任务需要跨越多个步骤,且每个步骤可能依赖于前一步的结果时,MCP 的分层上下文管理能够确保对话的连贯性和逻辑性。例如,一个智能助手可能需要先确认用户需求,再调用相关服务,最后生成总结性建议。
-
需要长时间维持上下文:在长时间对话或多轮交互中,MCP 通过分层上下文管理,确保模型能够记住历史信息并生成上下文相关的响应。例如,在客户支持场景中,MCP 可以帮助模型追踪用户之前的提问,避免重复或矛盾的回答。
-
任务需要在创造力与控制力之间取得平衡:MCP 允许模型在保持一定创造力的同时,受到上下文约束的引导,适合需要在开放性与规范性之间找到平衡的场景。例如,在品牌化的对话中,模型需要既展现自然语言的流畅性,又遵守品牌规范。
典型案例:
-
特定领域智能助手:如金融领域的合规性助手,需要在多轮对话中提供符合监管要求的建议。
-
监管合规工具:确保模型输出符合行业法规,例如医疗领域的隐私保护要求。
-
品牌化聊天机器人:在保持品牌声音一致性的同时,参与自然、开放式的对话。
在上述的这些类似场景中,MCP 的灵活性和上下文感知能力能够显著提升交互质量,满足复杂业务需求。
然而,在实际的业务场景中,可能面临某些复杂的应用,单独使用 Function-Calling 或 MCP 可能无法完全满足需求。此时,结合两种方法可以充分发挥它们的优势,同时弥补各自的局限性,形成更强大的混合解决方案。
例如,在一个客户支持系统中,可以通过以下方式结合两者:
Function-Calling 用于工单分类:利用 Function-Calling 的结构化特点,快速将用户提交的工单分类为“账单问题”或“技术支持”,确保分类结果的准确性和一致性。
而 MCP 用于后续问答和上下文管理:在工单分类后,用户可能会提出进一步的问题(如“如何解决账单问题?”)。此时,MCP 可以通过分层上下文管理,追踪之前的对话内容,生成连贯且个性化的回答,同时确保响应符合品牌规范。
这种混合方法能够在不同阶段发挥各自的优势:Function-Calling 确保了关键任务的效率和可控性,而 MCP 则增强了对话的灵活性和上下文连贯性。通过合理设计,开发者可以在系统架构中无缝集成这两种方法,例如在函数调用完成后将结果传递给 MCP 的上下文层,用于后续处理。
综上所述,Function-Calling 和 MCP 各有其擅长的领域,选择哪种方法取决于具体的业务需求和技术目标。
如果任务需要高度结构化的输出和快速集成,Function-Calling 是更优的选择;如果任务涉及复杂交互、长时间上下文管理或需要在创造力与控制力之间取得平衡,MCP 则更具优势。而在一些综合性场景中,结合两者可以实现更高的效率和灵活性,为 LLM 的实际应用提供更全面的解决方案。企业在选择时,应充分评估任务的复杂性、系统架构的兼容性以及对可控性和创造力的需求,以确保最终方案能够最大化地满足业务目标。
今天的解析就到这里,欲了解更多关于 Function-Calling 和 MCP 相关技术的深入剖析,最佳实践以及相关技术前沿,敬请关注我们的微信公众号:架构驿站,获取更多独家技术洞察!
Happy Coding ~
Reference :
[1] https://zenn.dev/taku\_sid/articles/20250408\_function\_comparison?redirected=1
[2] https://www.linkedin.cn/incareer/pulse/llm-function-calling-vs-mcp-server-basics-ganesh-ghag-3tyjf
Adiós !
··································
对云原生网关 Traefik 技术感兴趣的朋友们,可以了解一下我的新书,感谢支持!
Hello folks,我是 Luga,Traefik Ambassador,Jakarta EE Ambassador, 一个 15 年+ 技术老司机,从 IT 屌丝折腾到码畜,最后到“酱油“架构师。如果你喜欢技术,不喜欢呻吟,那么恭喜你,来对地方了,关注我,共同学习、进步、超越~