AI技术前沿:Function Calling、RAG与MCP的深度解析与应用实践
随着人工智能技术的迅猛发展,大型语言模型(LLM)正逐步从单纯的文本生成工具进化为能够与外部世界交互的智能系统。在这一演进过程中,Function Calling、RAG(检索增强生成)和MCP(模型上下文协议)三大技术扮演着关键角色。本文将深入探讨这三种技术的核心原理、应用场景以及它们如何共同推动AI应用进入新阶段,同时提供实用的代码示例和行业趋势分析,帮助开发者把握AI技术的最新发展方向。
引言:AI技术发展的新阶段
2025年,人工智能技术迎来了前所未有的发展浪潮。从AIGC(人工智能生成内容)到智能体(Agent),从AI+RPA到推理模型优化,AI的应用场景不断拓展和深化2。在这一背景下,如何让大型语言模型突破自身局限,实现与外部世界的高效交互,成为技术发展的关键挑战。
传统的大型语言模型虽然具备强大的文本理解和生成能力,但仍存在明显局限:无法获取实时信息、缺乏垂直领域专业知识、不能直接操作系统或工具完成任务。为解决这些问题,行业先后发展出了三种关键技术方案:
- Function Calling:让模型能够调用预定义的外部函数或API
- RAG(检索增强生成):通过检索外部知识库增强模型的生成能力
- MCP(模型上下文协议):提供标准化的模型与外部工具交互协议
这三种技术各有侧重又相互补充,共同构成了现代AI应用的基础设施。Function Calling解决了"如何调用"的问题,RAG解决了"知识不足"的问题,而MCP则解决了"如何标准化调用"的问题。它们的出现使得AI系统从封闭的问答机器人逐步进化为能够自主完成复杂任务的智能助手。
本文将系统性地介绍这三种技术的核心概念、工作原理、典型应用场景以及未来发展趋势,并通过实际代码示例展示如何将它们应用于真实业务场景中。无论您是AI领域的初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和实践指导。
Function Calling:让大模型学会"动手"
Function Calling(函数调用)是特定大模型(如OpenAI的GPT-4、Qwen2等)提供的一种机制,使模型能够主动生成结构化输出,以调用外部系统中预定义的函数或API3。这项技术最初由OpenAI在2023年6月推出,最初在GPT-3.5和GPT-4模型上实现,如今已成为各大模型厂商的标配功能。
Function Calling的工作原理
Function Calling的执行流程可以分解为以下步骤3:
- 注册外部函数:开发者预先向大模型注册可用的外部函数接口(建议不超过20个)
- 用户发起请求:用户通过自然语言提出需求,AI程序(Agent)接收请求
- 模型解析评估:Agent将请求提交给大模型,模型解析语义并评估是否需要调用外部工具
- 生成调用指令:如需调用函数,模型生成包含工具ID和输入参数的调用指令并返回
- 执行函数调用:Agent程序接收调用指令并执行对应的工具函数
- 返回处理结果:工具函数执行后将结果返回给Agent程序
- 模型二次处理:Agent将函数返回结果和自定义提示词一起反馈给大模型
- 生成最终响应:大模型融合工具返回数据与原始上下文,生成最终结果
- 呈现给用户:Agent程序将最终结果输出给终端用户
这一流程的核心在于大模型能够理解何时需要调用外部函数,并正确生成结构化调用指令,而非直接执行函数调用。实际执行仍由外部程序完成,确保了安全性和可控性。
Function Calling的代码示例
以下是一个完整的天气查询Function Calling示例,展示了从配置工具到二次处理的完整流程:
import openai # 1.75.0
import json
def get_weather(location):
"""模拟天气查询函数"""
return '{"Celsius": 27, "type": "sunny"}'
def main():
client = openai.OpenAI(
api_key="xxxxx",
base_url="https://api.siliconflow.cn/v1"
)
# 定义可供调用的工具
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名"
}
},
"required": ["city"],
}
}
}]
# 第一次请求:获取模型生成的函数调用指令
res = client.chat.completions.create(
model="Qwen/Qwen2.5-32B-Instruct",
messages=[
{"role": "system", "content": "你是一个天气查询助手"},
{"role": "user", "content": "帮我查询上海的天气"}
],
tools=tools,
tool_choice="auto"
)
print("第一次响应:", res.choices[0].message.to_dict())
# 准备二次请求的上下文
messages = [
{"role": "system", "content": "你是一个天气查询助手"},
{"role": "user", "content": "帮我查询上海的天气"},
res.choices[0].message.to_dict() # 加入第一次的模型响应
]
# 执行函数调用
tool_call = res.choices[0].message.tool_calls[0]
arguments = json.loads(tool_call.function.arguments)
messages.append({
"role": "tool",
"content": get_weather(arguments['city']),
"tool_call_id": tool_call.id
})
# 第二次请求:让模型处理函数返回结果
res = client.chat.completions.create(
model="Qwen/Qwen2.5-32B-Instruct",
messages=messages,
tools=tools,
tool_choice="auto"
)
print("最终响应:", res.choices[0].message.content)
if __name__ == "__main__":
main()
执行上述代码后,输出将分为两个阶段:
- 第一次响应中,模型识别出需要调用
get_weather函数,并提供了参数{"city": "上海"} - 第二次响应中,模型根据模拟的天气数据生成最终的自然语言回复
使用OpenAI Java SD

最低0.47元/天 解锁文章
1028

被折叠的 条评论
为什么被折叠?



