彻底搞懂Function Calling 和 RAG:原理、流程与实战

253 阅读6分钟

大语言模型(LLM)的真正价值,不只是生成漂亮的文本,更重要的是连接外部世界的能力——能够调用工具、利用外部知识、执行任务。这种连接能力主要通过两种技术实现:Function Calling(函数调用)RAG(检索增强生成) 。本文将从原理、流程、误区到实战案例,全面剖析这两个关键技术。

一、Function Calling:让大模型“动手干活”

1. 核心概念

Function Calling 是指大模型根据用户输入自动判断是否需要调用某个“外部工具”,如天气 API、数据库、计算函数等。如果需要调用,就结构化地解析输入,生成调用参数,再根据工具返回的结果生成最终回答。

这个过程不是简单的接口调用,而是结合语言理解、意图识别、数据结构化和上下文管理的一整套机制。

2. 原理解析与流程详解

步骤拆解如下:

  1. System Prompt 配置
    指定有哪些函数可用、每个函数需要哪些参数、参数格式及示例。

  2. 意图识别
    大模型读取用户输入,判断:

    • 是直接生成回答,还是调用函数?
    • 如果调用,使用哪一个函数?
  3. 参数提取与结构化

    • 如果已提供足够参数:直接组装成 JSON 结构;
    • 如果缺少关键信息:主动追问用户补全。
  4. 调用外部工具
    根据结构化数据实际发起函数调用,等待返回结果。

  5. 再次交由大模型处理
    将 system prompt + tool response + user prompt 作为新的输入,最终由模型生成响应。

举个例子:

用户提问: 「明天北京天气怎样?」

流程如下:

  • 模型识别意图是查天气;
  • 判断需要调用 getWeather(city, date)
  • 提取参数:city=北京date=明天
  • 若参数不完整(如没说日期),就追问;
  • 调用接口返回结果,例如「晴,最高温度25°C」;
  • 模型根据原问题 + 返回结果进行自然语言生成:「明天北京是晴天,最高温度25°C。」

3. 常见误区

  • 误区1:Function Calling 只是语法功能。
    → 实则是语言理解 + 任务规划 + 结构化表达的能力测试。

  • 误区2:Function Calling = 插件机制。
    → 插件是部署层的机制,Function Calling 是语言建模能力的一部分。

    二、RAG:让大模型“读懂你的知识库”

1. 核心概念

RAG 全称是 Retrieval-Augmented Generation,即“检索增强生成”。它是解决大模型无法记住所有知识、又需要具备专有知识的典型方法:让大模型在生成回答前,先去知识库里“找资料”。

尤其适用于以下场景:

  • 私有资料问答(如企业文档、员工手册);
  • 法律、医学等专业场景;
  • 数据量大、频繁更新的知识体系。

2. 流程与关键步骤

(1)构建知识库

  1. 资料收集与格式化

    • 支持多种格式:PDF、Word、PPT、Excel等;
    • 使用工具转成纯文本;
    • 表格类信息若结构复杂,可以截图+多模态模型提取文字。
  2. 文本切片

    • 按逻辑单元拆分为片段(段落/标题/章节);
    • 可以交叠切分,提升召回精度。
  3. 向量化 Embedding

    • 每段文本生成一个向量,表示其语义;
    • 常用模型:OpenAI Embedding、BGE、E5等。
  4. 附加元信息

    • 文件名、来源、创建时间等;
    • 便于后续排序、溯源与展示。
  5. 向量数据库存储

    • 常见库:FAISS(本地)、Pinecone、Weaviate、Milvus等;
    • 可用于高速相似度检索。

(2)RAG 推理过程

  1. 用户提问
    → 输入 User Prompt。

  2. 是否需要查知识库?

    • 大模型判断用户的问题是否需要外部知识;
    • System Prompt 中定义触发条件(如“涉及产品知识”)。
  3. 语义检索

    • 将 User Prompt 向量化;
    • 在向量库中检索相似文本片段;
    • 通常召回 Top-K(如前5条)。
  4. 构建 Prompt
    将:

    • System Prompt + 检索片段 + User Prompt
      合并成完整输入,送入大模型生成回答。

举例说明:

用户提问:「公司请假流程是怎样的?」

→ 用户问题向量化 → 检索出知识库中“请假流程”的段落 →
→ 构建 Prompt:

markdown
复制编辑
System Prompt: 遇到员工政策相关的问题请从知识库中寻找答案;
知识片段:
1. 请假需先填写OA系统申请;
2. 部门主管审批;
3. HR最终备案。
User Prompt: 公司请假流程是怎样的?

→ 模型输出:「您需登录OA系统填写申请,等待主管审批,HR备案后即可请假。」

三、Function Calling vs RAG 的对比与结合

特性Function CallingRAG(检索增强生成)
用途执行具体任务 / 工具调用提供专业、丰富的上下文知识
数据来源实时API、数据库、函数预先构建的私有知识库
返回内容工具返回结构化结果文本段落(知识片段)
示例查天气、订票、计算税率企业问答、政策解析、法规解读
可否组合✅ 可在一个流程中结合使用✅ 可与Function Calling配合使用

例如:用户说“查下北京天气,并说明我是否需要带伞”,

  • Function Calling 查天气;
  • RAG 检索天气常识(下雨就要带伞);
  • 模型综合输出。

四、进阶知识与优化策略

1. 提高RAG准确率的技巧

  • 知识切片精细化:主题明确、上下文交叠;
  • 多粒度混合:有短段,也保留长段备用;
  • 多片段召回 + 重排序:用 reranker 模型做二次打分;
  • Hybrid检索:向量 + 关键词混合召回;
  • Prompt多样化:同一问题生成多种表达方式检索。

2. Embedding模型的选择

  • 语言相关:中文推荐 BGE、E5-multilingual;
  • 向量维度:高维更精确,但检索慢,需平衡;
  • Embedding质量影响最终结果:建议定期评估效果并更新模型。

五、总结

技术意义
Function Calling让模型“干活”,做结构化任务或执行调用
RAG让模型“有知识”,解决上下文短板与专业知识问题
二者结合使用大模型既能调API又能读文档,成为真正的AI智能体

这两项技术已经成为大模型应用中的“发动机”和“油箱”,一个解决执行力问题,一个解决知识储备问题。理解它们,就是理解大模型从“聊天机器人”到“智能体”的跨越。