当前位置: 首页 > article >正文

深入理解蒸馏、Function Call、React、Prompt 与 Agent

AI基础概念与实操

    • 一、什么是蒸馏
    • 二、如何理解Function Call、React、Prompt与Agent
      • (一)Function Call与Agent
      • (二)Agent中的React概念
      • (三)Prompt与Agent的关联
    • 实操演练
      • function call
      • prompt

一、什么是蒸馏

在知识传授或模型训练等场景中,可类比为师傅带徒弟的过程。由于人的能力有限,即便师傅能力很强,也难以将所有本领毫无保留地传授给徒弟,而且徒弟也未必能全盘接收。所以,师傅往往会将一部分技能传授给第一个徒弟,另一部分传授给第二个徒弟等。在这个过程中,徒弟学习技能的阶段就被称为蒸馏。

在蒸馏过程里,存在硬标签和软标签两个重要概念。师傅传授给徒弟的是一种思维方式,从技术层面讲,是向徒弟传递一些概率分布,即针对每个类别的概率分布,这一专业术语叫做软标签。而徒弟在学习过程中,基于自身理解所形成的思维方式,被称为硬标签。为了让徒弟更好地掌握技能,就需要在软硬标签之间找到一个合适的标准,然后依据这个标准反复训练,直至徒弟学成出师。
在这里插入图片描述

二、如何理解Function Call、React、Prompt与Agent

(一)Function Call与Agent

Function Call和Agent本质上都是一种设计模式。简单来说,就是向大模型抛出一个既定套路。例如在测试场景中,有bbd cucumber.Given when then这样的规则,在运行代码时,会按照从given到when再到then的顺序,依次执行对应的代码逻辑。

(二)Agent中的React概念

在Agent体系里,有一个关键的React概念,其公式为React = reason + act,即思维链加上外部工具调用。ReAct思想具有独特的作用,它能引导大模型把复杂的大问题拆解成一个个小问题,然后逐步解决。在每一步的解决过程中,模型会尝试调用外部工具来辅助。并且,模型还会依据工具返回的反馈结果,判断工具调用是否出现问题。一旦判断有问题,大模型就会重新尝试调用其他合适的工具。经过一系列这样的工具调用和问题解决步骤,最终达成设定的目标。

(三)Prompt与Agent的关联

若想赋予大模型ReAct能力,使其转变为智能Agent,在向大模型提问时,就需要使用ReAct Prompt。通过这种特定的提问方式,大模型在思考如何解决所提问题时,就能运用ReAct思想,按照思维链结合外部工具调用的模式来处理问题,从而实现更高效、智能的问题解决过程 。 推荐的prompt网站: https://smith.langchain.com/hub

实操演练

function call

import json
import os
from openai import OpenAIclient = OpenAI(api_key='XXXX',base_url="https://api.siliconflow.cn/v1"#api_key=os.getenv("deepseek"),#base_url="https://api.deepseek.com"
)
def send_messages(messages):response = client.chat.completions.create(model="Qwen/QwQ-32B",messages=messages,tools=tools,tool_choice="auto")return responsetools = [{"type": "function","function": {"name": "get_closing_price","description": "使用该工具获取指定股票的收盘价","parameters": {"type": "object","properties": {"name": {"type": "string","description": "股票名称",}},"required": ["name"]},}},
]def get_closing_price(name):if name == "青岛啤酒":return "67.92"elif name == "贵州茅台":return "1488.21"else:return "未搜到该股票"if __name__ == "__main__":messages = [{"role": "user", "content": "青岛啤酒的收盘价是多少?"}]response = send_messages(messages)messages.append(response.choices[0].message)print("回复:")print(response.choices[0].message.content)print("工具选择:")print(response.choices[0].message.tool_calls)if response.choices[0].message.tool_calls != None:tool_call = response.choices[0].message.tool_calls[0]if tool_call.function.name == "get_closing_price":arguments_dict = json.loads(tool_call.function.arguments)price = get_closing_price(arguments_dict['name'])messages.append({"role": "tool","content": price,"tool_call_id": tool_call.id})print("messages: ",messages)response = send_messages(messages)print("回复:")print(response.choices[0].message.content)

最终的运行结果是:

青岛啤酒的最新收盘价是67.92元

说明是调用自己的工具返回的结果

prompt

首先目录结构如下:
在这里插入图片描述
llm:

from openai import OpenAIclient = OpenAI(api_key='',base_url="https://api.deepseek.com"
)

prompt:

REACT_PROMPT = """
{instructions}TOOLS:
------You are an expert in strictly following a tool - first approach. Always exhaust all relevant tools before providing a final answer. You have access to the following powerful tools:{tools}To use a tool, you must use the following precise format when first get the questions from user:Thought: Analyze the input query. Based on its nature, determine if a tool can enhance the answer. Yes, as [briefly explain the connection between the query and the tool].
Action: the action to take, which must be one of [{tool_names}]
Action Input: the input to the action, provided in a JSON - like format that adheres to the tool's parameter requirementsWhen you are certain that no more tools are required and you are ready to provide a response to the user, you MUST use the following format:Thought: After thorough analysis and utilization of relevant tools, I have gathered all necessary information.
Final Answer: [your comprehensive response here]

tools:

# 定义与测试领域及相关概念相关的工具列表
tools = [{"name": "get_precise_test_info","description": "使用该工具获取精准测试的相关信息,精准测试是一种聚焦于软件变更影响范围,通过分析代码依赖、变更数据等,精准定位需要测试的模块和用例,以提高测试效率和覆盖率的测试方法。","parameters": {"type": "object","properties": {"query": {"type": "string","description": "关于精准测试的具体查询内容,如精准测试的流程、优势等"}},"required": ["query"]}},{"name": "get_defensive_programming_info","description": "使用该工具获取防御式编程的相关信息,防御式编程是一种编程范式,它强调在编写代码时预测可能出现的错误和异常情况,并采取相应的措施来避免程序崩溃或产生不可预期的结果。","parameters": {"type": "object","properties": {"query": {"type": "string","description": "关于防御式编程的具体查询内容,如防御式编程的技巧、应用场景等"}},"required": ["query"]}},{"name": "check_precise_test_coverage","description": "使用该工具检查精准测试对代码的覆盖情况,了解精准测试是否有效地覆盖了软件变更所影响的代码区域。","parameters": {"type": "object","properties": {"project_name": {"type": "string","description": "要检查精准测试覆盖率的项目名称"}},"required": ["project_name"]}},{"name": "verify_defensive_programming_usage","description": "使用该工具验证代码中防御式编程的使用情况,判断代码是否采用了合理的防御式编程策略来增强健壮性。","parameters": {"type": "object","properties": {"code_path": {"type": "string","description": "要验证防御式编程使用情况的代码文件路径"}},"required": ["code_path"]}}
]# 精准测试相关信息字典
precise_test_info_dict = {"流程": "精准测试流程通常包括变更分析、测试用例筛选、执行测试和结果评估等步骤。","优势": "精准测试的优势在于提高测试效率、降低测试成本,能快速定位变更影响范围,提升测试覆盖率。",
"精准测试的流程和优势":"精准测试的优势在于提高测试效率、降低测试成本,能快速定位变更影响范围,提升测试覆盖率。"
}# 防御式编程相关信息字典
defensive_programming_info_dict = {"技巧": "防御式编程的技巧有输入验证、边界检查、异常处理等。","应用场景": "防御式编程适用于对可靠性要求较高的系统,如金融系统、航空航天系统等。"
}# 模拟精准测试覆盖率数据
precise_test_coverage_data = {"projectA": "80%","projectB": "60%"
}# 模拟防御式编程使用验证结果
defensive_programming_usage_data = {"path/to/code1.py": "采用了合理的防御式编程策略","path/to/code2.py": "部分使用了防御式编程,但仍有改进空间"
}# 获取精准测试相关信息的函数
def get_precise_test_info(query):return precise_test_info_dict.get(query, "未找到相关精准测试信息")# 获取防御式编程相关信息的函数
def get_defensive_programming_info(query):return defensive_programming_info_dict.get(query, "未找到相关防御式编程信息")# 检查精准测试覆盖率的函数
def check_precise_test_coverage(project_name):return precise_test_coverage_data.get(project_name, "未找到该项目的精准测试覆盖率信息")# 验证防御式编程使用情况的函数
def verify_defensive_programming_usage(code_path):return defensive_programming_usage_data.get(code_path, "未找到该代码路径的防御式编程使用信息")

agent

import json
from llm import client
from prompt import REACT_PROMPT
from tools import tools, get_precise_test_info, get_defensive_programming_info, check_precise_test_coverage, \verify_defensive_programming_usage
import redef send_messages(messages):response = client.chat.completions.create(# model="Qwen/QwQ-32B",model="deepseek-chat",messages=messages,)return responseif __name__ == "__main__":instructions = "你是一个测试专家,可以回答测试领域的相关问题"query = "什么是防御式编程"prompt = REACT_PROMPT.format(instructions=instructions, tools=tools,tool_names="get_precise_test_info,get_defensive_programming_info,check_precise_test_coverage,verify_defensive_programming_usage",input=query)messages = [{"role": "user", "content": prompt}]while True:response = send_messages(messages)response_text = response.choices[0].message.contentprint("大模型的回复:")print(response_text)final_answer_match = re.search(r'Final Answer:\s*(.*)', response_text)if final_answer_match:breakmessages.append(response.choices[0].message)action_match = re.search(r'Action:\s*(\w+)', response_text)action_input_match = re.search(r'Action Input:\s*({.*?}|".*?")', response_text, re.DOTALL)if action_match and action_input_match:tool_name = action_match.group(1)params = json.loads(action_input_match.group(1))if tool_name == "get_precise_test_info":observation = get_precise_test_info(params['query'])elif tool_name == "get_defensive_programming_info":observation = get_defensive_programming_info(params['query'])elif tool_name == "check_precise_test_coverage":observation = check_precise_test_coverage(params['project_name'])elif tool_name == "verify_defensive_programming_usage":observation = verify_defensive_programming_usage(params['code_path'])print("人类的回复:Observation:", observation)messages.append({"role": "user", "content": f"Observation: {observation}"})

最后输出的结果是:

大模型的回复:Thought: Analyze the input query. Based on its nature, determine if a tool can enhance the answer. Yes, as the user is asking about the process and advantages of precise testing, which directly relates to the tool that provides information on precise testing.
Action: get_precise_test_info
Action Input: {"query": "精准测试的流程和优势"}人类的回复:Observation: 精准测试的优势在于提高测试效率、降低测试成本,能快速定位变更影响范围,提升测试覆盖率。
大模型的回复:Thought: After thorough analysis and utilization of relevant tools, I have gathered all necessary information.
Final Answer: 精准测试的优势主要包括以下几点:
1. **提高测试效率**:通过精准定位变更影响范围,减少不必要的测试用例执行,从而加快测试速度。
2. **降低测试成本**:减少冗余测试,优化资源利用,降低测试过程中的人力、时间和设备成本。
3. **快速定位变更影响范围**:通过分析代码依赖和变更数据,精准识别受影响的模块和功能,确保测试重点明确。
4. **提升测试覆盖率**:确保测试覆盖所有受影响的代码区域,避免遗漏关键测试点,从而提高软件质量。这些优势使得精准测试在现代软件开发中成为一种高效且可靠的测试方法。

可以看出大模型按照react prompt ,按照思维链,寻找对应工具,最后输出结果。

相关文章:

深入理解蒸馏、Function Call、React、Prompt 与 Agent

AI基础概念与实操 一、什么是蒸馏二、如何理解Function Call、React、Prompt与Agent(一)Function Call与Agent(二)Agent中的React概念(三)Prompt与Agent的关联 实操演练function callprompt 一、什么是蒸馏…...

CVPR2025自动驾驶端到端前沿论文汇总

自动驾驶 文章目录 自动驾驶前言自动驾驶的轨迹预测论文端到端自动驾驶论文 前言 汇总CVPR2025自动驾驶前沿论文 自动驾驶的轨迹预测论文 Leveraging SD Map to Augment HD Map-based Trajectory PredictionModeSeq: Taming Sparse Multimodal Motion Prediction with Seque…...

Qt6.8实现麦克风音频输入音频采集保存wav文件

一.本文目的 实现在Qt中接收麦克风数据并保存为WAV文件,使用QAudioInput来录音,并使用QFile来保存数据到WAV文件。 开发环境:QT6.8 本文用极简代码实现,核心代码只需不到100行。 二.代码实现...

记录一个SQL自动执行的html页面

在实际工作场景中,需要运用到大量SQL语句更新业务逻辑,对程序员本身,写好的sql语句执行没有多大问题(图1),但是对于普通用户来说还是有操作难度的。因此我们需要构建一个HTML页面(图2&#xff0…...

分布式唯一ID

微服务 分布式唯一主键ID生成方案_微服务主键生成-CSDN博客 uid-generator-spring-boot-starter 教程-CSDN博客 https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md GitCode - 全球开发者的开源社区,开源代码托管平台...

在图像/视频中裁剪出人脸区域

1. 在图像中裁剪人脸区域 import face_alignment import skimage.io import numpy from argparse import ArgumentParser from skimage import img_as_ubyte from skimage.transform import resize from tqdm import tqdm import os import numpy as np import warnings warni…...

LuaJIT 学习(5)—— string.buffer 库

文章目录 Using the String Buffer LibraryBuffer ObjectsBuffer Method Overview Buffer Creation and Managementlocal buf buffer.new([size [,options]]) local buf buffer.new([options])buf buf:reset()buf buf:free() Buffer Writersbuf buf:put([str|num|obj] [,……...

qt介绍图表 charts 一

qt chartsj基于Q的Graphics View框架,其核心组件是QChartView和QChart.QChartView是一个显示图表的独立部件,基类为QGraphicsView.QChar类管理图表的序列,图例和轴示意图。 绘制一个cos和sin曲线图,效果如下 实现代码 #include…...

Transformer:GPT背后的造脑工程全解析(含手搓过程)

Transformer:GPT背后的"造脑工程"全解析(含手搓过程) Transformer 是人工智能领域的革命性架构,通过自注意力机制让模型像人类一样"全局理解"上下文关系。它摒弃传统循环结构,采用并行计算实现高…...

S32K144入门笔记(十):TRGMUX的初始化

目录 1. 概述 2. 代码配置 1. 概述 书接上回,TRGMUX本质上是一个多路选择开关,根据用户手册中的描述,它可以实现多个输入的选择输出,本篇文章将验证如何通过配置工具来生成初始化配置代码。 2. 代码配置 笔者通过配置TRGMUX实现…...

有了大模型为何还需要Agent智能体

一、什么是Agent? Agent(智能体) 是一种能感知环境、自主决策、执行动作的智能实体,当它与大语言模型(如通义千问QWen、GPT)结合时,形成一种**“增强型AI系统”**。其核心架构如下:…...

DNS主从服务器

1.1环境准备 作用系统IP主机名web 服务器redhat9.5192.168.33.8webDNS 主服务器redhat9.5192.168.33.18dns1DNS 从服务器redhat9.5192.168.33.28dns2客户端redhat9.5192.168.33.7client 1.2修改主机名和IP地址 web服务器 [rootweb-8 ~]# hostnamectl hostname web [rootweb-8…...

Flume详解——介绍、部署与使用

1. Flume 简介 Apache Flume 是一个专门用于高效地 收集、聚合、传输 大量日志数据的 分布式、可靠 的系统。它特别擅长将数据从各种数据源(如日志文件、消息队列等)传输到 HDFS、HBase、Kafka 等大数据存储系统。 特点: 可扩展&#xff1…...

一个简单的 **猜数字游戏** 的 C 语言例程

一个简单的 猜数字游戏 的 C 语言例程&#xff0c;代码包含详细注释&#xff0c;适合学习和练习基础语法&#xff1a; #include <stdio.h> #include <stdlib.h> #include <time.h> // 用于生成随机数种子int main() {int target, guess, attempts 0;srand…...

解决diffusers加载stablediffusion模型,输入prompt总是报错token数超出clip最大长度限制

1. StableDiffusion1.5 在加载huggingface中的扩散模型时&#xff0c;输入prompt总是会被报错超过clip的最大长度限制。 解决方案&#xff1a;使用compel库 from diffusers import AutoPipelineForText2Image import torch import pdb from compel import Compeldevice torc…...

mysql-查看binlog日志

mysql目前binlog_format默认是row格式&#xff0c; 找到binlog日志文件&#xff0c;通过命令查看 >mysqlbinlog binlog日志路径内容大致如下&#xff1a; /*!*/; # at 1163 #250317 14:13:43 server id 1 end_log_pos 1194 CRC32 0x09c8bcfd Xid 14 COMMIT/*!*…...

【Linux系列】文件压缩

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

微服务架构中10个常用的设计模式

​在当今的微服务架构中&#xff0c;常见的十种设计模式&#xff0c;分别是服务发现模式、API网关模式、断路器模式、边车模式、负载均衡模式、Saga事务模式、CQRS模式、分片模式、分布式日志跟踪模式、熔断与降级模式 。其中&#xff0c;服务发现模式十分关键&#xff0c;通过…...

Vue3组件+leaflet,实现重叠marker的Popup切换显示

一、前言 GIS开发过程中&#xff0c;经常需要绘制marker&#xff0c;这些marker很大概率会有坐标相同导致的叠加问题&#xff0c;这种情况下会降低使用体验感。所以我们可以将叠加的marker的popup做一个分页效果&#xff0c;可以切换显示的marker。 二、技术要点 我们以leaf…...

将COCO格式的物体检测数据集划分训练集、验证集和测试集

目录 导入所需库 定义数据集路径 创建输出目录 读取JSON注释文件 随机打乱图像列表 计算划分大小 复制图像到相应文件夹 完整代码 导入所需库 我们需要以下Python库&#xff1a; os&#xff1a;处理文件路径。 json&#xff1a;读取和写入JSON文件。 numpy&#xff…...

机器学习之距离度量方法

常见的距离度量方法及相关函数、图示如下: 1. 欧几里得距离(Euclidean Distance) 函数公式:对于两个 ( n ) 维向量 ( x = ( x 1 , x 2 , ⋯   ,...

3.1 在VisionPro脚本中添加CogGraphicLabel

本案例需要实现如下功能&#xff1a; 1.加载toolBlock 2.加载图片&#xff0c; 3.运行Block 4.VisionPro中添加脚本显示数值。 见下图&#xff1a;详细代码&#xff08;C#以及visionPro&#xff09;见下面链接&#xff1a; https://download.csdn.net/download/qq_340474…...

自动化APP测试APPium的元素等待

在使用Appium进行移动应用自动化测试时&#xff0c;有三种等待。 隐式等待driver.implicitly_wait() 显式等待&#xff08;常用&#xff09; time.sleep() 隐式等待&#xff08;Implicit Wait&#xff09; 应用场景&#xff1a; 当你希望对所有元素定位操作设置统一的超时…...

AI:Machine Learning Data Science

机器学习与数据科学 左侧 机器学习 Machine Learning 机器学习是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知…...

软件需求分类、需求获取(高软46)

系列文章目录 软件需求分类&#xff0c;需求获取 文章目录 系列文章目录前言一、软件需求二、获取需求三、真题总结 前言 本节讲明软件需求分类、需求获取的相关知识。 一、软件需求 二、获取需求 三、真题 总结 就是高软笔记&#xff0c;大佬请略过&#xff01;...

vue3vue-elementPlus-admin框架中form组件的upload写法

dialog中write组件代码 let ImageList reactive<UploadFile[]>([])const formSchema reactive<FormSchema[]>([{field: ImageFiles,label: 现场图片,component: Upload,colProps: { span: 24 },componentProps: {limit: 5,action: PATH_URL /upload,headers: {…...

嵌入式Linux | 什么是 BootLoader、Linux 内核(kernel)、和文件系统?

01 什么是 BootLoader 呢&#xff1f; 它是个引导程序&#xff0c;也就是硬件复位以后第一个要执行的程序&#xff0c;它主要工作就是初始化操作系统运行的环境&#xff0c;比如说内存、定时器、缓冲器等&#xff0c;当这个工作做完以后&#xff0c;再把操作系统的代码加载…...

【ARM中R0寄存器】

ARM中R0寄存器 1 RO介绍1.1 R0 的主要作用1 函数返回值2 函数参数3 通用寄存器4 与其他寄存器的区别 1.2 示例 1 RO介绍 在ARM架构中&#xff0c;R0寄存器是一个通用寄存器&#xff1b;是16 个通用寄存器&#xff08;R0 到 R15&#xff09;中的第一个&#xff0c;通常用于存储…...

【JDK17】Jlink一秒生成精简的JRE

之前介绍了 Java17模块化的JDK&#xff0c;模块化后按需使用Jlink 用于精简生成 JRE 环境&#xff0c;这让快速的开发环境增强了编码的愉悦感。在实际生产环境中使用 mave 进行项目的构建&#xff0c;其次再是精简 JRE 缩小容器镜像体积&#xff0c;为实现一体化的流程&#xf…...

【第9章】亿级电商平台订单系统-整体技术架构设计

1-1 本章导学 课程主题:系统蓝图描绘与整体技术架构设计核心学习内容: ▶️ 订单系统的整体技术架构设计 ▶️ 架构设计核心方法论与实践应用本章核心内容架构 1. 技术预研 架构设计的基础支撑环节关键技术可行性分析与选型依据2. 整体技术架构设计方法与步骤 结构化设计方法…...