大模型 17/18 通过 Function Calling & RAG 让大模型连接外部系统和私有知识

0 阅读7分钟

十七、 FunctionCalling & RAG (工具调用 & 检索增强生成)

一、 FunctionCalling(工具调用)

截屏2025-07-02 13.55.20.png

  • 定义:自主解析内容并结构化填槽,自主决策使用工具并结构化调用 (大模型解决不了问题的时候,可以调用工具)
填槽举例:
  • 用户:明天天气咋样?

填槽过程

  1. 识别意图:用户想查询天气(对应 get_weather 函数)。

  2. 提取参数(填槽)

    • city(城市)→  “北京”
    • date(日期)→  “明天” (需转换成具体日期,如 2025-07-03
  3. 调用函数: get_weather(city="北京", date="2025-07-03")

  4. 返回结果: "正在查询北京在2025-07-03的天气,天气请,湿度..."

  • 大模型:天气请,湿度...
1.1 FunctionCalling步骤
  1. System Prompt 中写明了都有哪些工具可以使用,使用的时候要给出什么参数,写成什么格式
  2. 意图识别:用户要求做什么任务
  3. 决定是否使用工具,使用哪个工具
  4. 调取工具设定的信息传递结构
  5. 调取所有上下文内容解析并填槽
  6. 缺少信息就发起追问,直至全部填完
  7. 按照槽的格式生成模型回复

经过微调训练而得到的一种按指令做任务的能力:

利用GPT 的生成能力输出某种特定格式的内容

DEMO(故事合成调用工具)

截屏2025-07-01 14.43.12.png

  • systempromat

角色

你是一个音频故事生成助手,你可以按照用户的要求,生成最终的内容,你工作时请注意:

要求

  1. 生成故事文字,不低于100字,不超过200字,并将故事的文字进行输出
  2. 用故事文字生成音频,将音频文件原始链接输出,不需要输出成可点击的文字链接
  3. 给故事的每一个场景生成图片,将图片输出,整个故事不超过3张图片,图片风格全部采用迪士尼风格

工具使用

你在完成用户任务的过程中可以使用以下几个工具:

  1. 语音合成 / speech_synthesis 工具,通过故事内容文字合成音频speaker_id:爽快思思/Skye(指定了一个音色【非默认,插件详情中有体现 】)
  2. 豆包图像生成大模型 / gen_image,给一段文字生成配图

二、 RAG(检索增强生成)(Retrieval-Augmented Generation)

  • 将参考资料、样例放在 Prompt 中,就叫做 In-Context-Learning
  • 但上下文窗口宽度毕竟有限,所以需要一个知识库, 需要的时候就去知识库里找一些有用的信息
2.1 RAG定义:
  • 是一种结合信息检索与大语言模型(LLM)的技术,旨在通过外部知识库增强模型的生成能力,解决传统LLM的局限性(如实时性错误、知识更新延迟等)
2.2. RAG的核心概念
  • 检索(Retrieval) :从外部知识库(如数据库、文档、网页等)中检索与输入问题相关的信息。
  • 生成(Generation) :将检索到的信息与大模型的内部知识结合,生成更准确、可靠的回答。
2.3 RAG与提示词(Prompt)、大模型的调用关系

三者的协作流程如下:

原始问题提示词 -》 rag检索后的文献 -》 根据检索后的文献,回答原始问题提示词

步骤1:用户输入提示词(Prompt)

  • 用户提交一个问题或指令(例如:"量子计算的最新进展是什么?")。
  • 这个提示词会同时触发检索和生成两个环节。

步骤2:检索外部知识

  • RAG系统通过向量数据库(如Elasticsearch、FAISS等)检索与提示词相关的文档或片段。
  • 例如,找到2023年关于量子计算的论文摘要或新闻。

步骤3:构建增强的提示词

  • 将检索到的信息(上下文)与原始提示词结合,形成新的提示词: 原始提示词:"量子计算的最新进展是什么?" 增强后的提示词:"根据以下信息回答:{检索到的文档}。问题:量子计算的最新进展是什么?"

步骤4:大模型生成回答

  • 大模型(如GPT-4、Llama 2)基于增强后的提示词生成回答,确保答案既依赖模型的知识,又结合了最新外部信息。

PS: 与大模型打交道的永远只有提示词prompt

2.4 构建知识库 & 模型调用知识库完成用户任务 细节

1 、构建可检索的知识库

1) 知识整理: 以文件格式存储, pdf、word 、ppt、excel为主

2) 数据清理及格式化: 将不同格式的数据内容提取为纯文本

3) 内容切分: 将文本内容按段落 、主题或逻辑单元切分成较小的知识片段(Chunk)

4) 向量化: 将每个知识片段转化为向量表示(如OpenAI  的Embedding 接口)

5) 关联元数据: 给每个向量关联相关元数据(如文档名称 、创建时间 、作者 、来源等) 

6) 载入向量数据库, 并建立索引: 向量数据库如FAISS 、Pinecone 、Weaviate

7) 部署集成: 将向量数据库集成到 AI 产品流程中, 生成模型搭配使用

截屏2025-07-02 13.44.36.png

文本 -> embedding model ->向量

2 、模型调用知识库完成用户任务

1) System Prompt中写明哪些情况应该调用知识库

2) 模型解析用户意图, 判断是否需要调用知识库

3) 将User Prompt转成向量, 去向量数据库里比较相似度

4) 选取相似度较高的1条或多条知识片段, 并取出知识片段原文

5  将检索出的知识片段与原Prompt合并在一起组成新的Prompt

6) 模型生成最终回复(这一步 大语言模型开始干活 )

截屏2025-07-02 14.03.23.png

  • 知识库文件(骑手招聘 )

截屏2025-07-02 14.45.47.png

三 RAG检索相关问题

3.1 检索效率如何?

1 、不使用GPU的情况下,千万级知识片段,毫秒级返回

2 、使用GPU将得到更快的检索速度

3.2 不好用的常见原因:

1 、文档处理和切割情况 、颗粒度问题

2 、检索召回不准, 最希望被检索到的片段排序太靠后

3 、整合生成的过程有什么问题

3.3 提高准确率的常见方式:

1 、知识片段有明确主题 、交叠切分 、多颗粒度混合切分

2 、知识片段的上下相邻片段也可以一并取出,提高信息完整度

3 、检索时多召回一些结果, 再用单独的模型去做重排序

4 、向量+关键词混合检索(差几个字就差别非常大,除了匹配向量相似度,新增关键词检索)

5 、将User Prompt 重写成几种不同的表述方式(换个提示词表达 例如:薪资&工资&挣钱)

PS:

  • 1 交叠切分:相邻片段之间保留部分重叠内容(如后一段的开头重复前一段的结尾),避免因硬切分导致关键信息被截断。

  • 2 多颗粒度混合切分:将文本按不同长度切分(如短句、段落、章节),兼顾细粒度(细节)和粗粒度(上下文)的信息需求。

  • 3 检索时多召回一些结果,再用单独模型重排序

    • 多召回:初步检索时返回较多候选结果(如Top 100),而非直接限制为少量(如Top 3)。
    • 重排序:用更复杂的模型(如交叉编码器、LLM)对召回结果做精细化排序,综合考虑语义相关度、用户意图等。
      作用

    • 解决初步检索(如向量相似度)的粗粒度问题,避免漏掉低排名但实际相关的结果。

    • 重排序模型可融合更多特征(如关键词匹配、时效性、用户偏好)。

3.4 打通搜索引擎也是一种RAG

1 、搜索引擎是外部资料库

2 、向量数据库是内部资料库

3.5 向量数据库

截屏2025-07-02 15.21.57.png