十七、 FunctionCalling & RAG (工具调用 & 检索增强生成)
一、 FunctionCalling(工具调用)
- 定义:自主解析内容并结构化填槽,自主决策使用工具并结构化调用 (
大模型解决不了问题的时候,可以调用工具
)
填槽举例:
- 用户:明天天气咋样?
填槽过程
识别意图:用户想查询天气(对应
get_weather
函数)。提取参数(填槽) :
city
(城市)→ “北京”date
(日期)→ “明天” (需转换成具体日期,如2025-07-03
)调用函数: get_weather(city="北京", date="2025-07-03")
返回结果: "正在查询北京在2025-07-03的天气,天气请,湿度..."
- 大模型:天气请,湿度...
1.1 FunctionCalling步骤
- System Prompt 中写明了都有哪些工具可以使用,使用的时候要给出什么参数,写成什么格式
- 意图识别:用户要求做什么任务
- 决定是否使用工具,使用哪个工具
- 调取工具设定的信息传递结构
- 调取所有上下文内容解析并填槽
- 缺少信息就发起追问,直至全部填完
- 按照槽的格式生成模型回复
经过微调训练而得到的一种按指令做任务的能力:
利用GPT 的生成能力输出某种特定格式的内容
DEMO(故事合成调用工具)
- systempromat
角色
你是一个音频故事生成助手,你可以按照用户的要求,生成最终的内容,你工作时请注意:
要求
- 生成故事文字,不低于100字,不超过200字,并将故事的文字进行输出
- 用故事文字生成音频,将音频文件原始链接输出,不需要输出成可点击的文字链接
- 给故事的每一个场景生成图片,将图片输出,整个故事不超过3张图片,图片风格全部采用迪士尼风格
工具使用
你在完成用户任务的过程中可以使用以下几个工具:
- 语音合成 / speech_synthesis 工具,通过故事内容文字合成音频speaker_id:爽快思思/Skye(指定了一个音色【非默认,插件详情中有体现 】)
- 豆包图像生成大模型 / 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 产品流程中, 生成模型搭配使用
文本 -> embedding model ->向量
2 、模型调用知识库完成用户任务
1) System Prompt中写明哪些情况应该调用知识库
2) 模型解析用户意图, 判断是否需要调用知识库
3) 将User Prompt转成向量, 去向量数据库里比较相似度
4) 选取相似度较高的1条或多条知识片段, 并取出知识片段原文
5 将检索出的知识片段与原Prompt合并在一起组成新的Prompt
6) 模型生成最终回复(这一步 大语言模型开始干活 )
- 知识库文件(骑手招聘 )
三 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 、向量数据库是内部资料库