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

news2025/3/19 2:09:58

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 OpenAI

client = 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 response

tools = [
    {
        "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 OpenAI

client = 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 requirements


When 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 re

def send_messages(messages):
    response = client.chat.completions.create(
        # model="Qwen/QwQ-32B",
        model="deepseek-chat",
        messages=messages,
    )
    return response

if __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.content

        print("大模型的回复:")
        print(response_text)

        final_answer_match = re.search(r'Final Answer:\s*(.*)', response_text)
        if final_answer_match:
            break

        messages.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 ,按照思维链,寻找对应工具,最后输出结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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

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

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…

【Linux系列】文件压缩

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

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

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

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

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

机器学习之距离度量方法

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

3.1 在VisionPro脚本中添加CogGraphicLabel

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

AI:Machine Learning Data Science

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

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

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

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

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

函数(函数的概念、库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、函数的声明和定义、static和extern)

一、函数的概念 •C语⾔中的函数:⼀个完成某项特定的任务的⼀⼩段代码 •函数又被翻译为子函数(更准确) •在C语⾔中我们⼀般会⻅到两类函数:库函数 ⾃定义函数 二、库函数 1 .标准库和头文件 •C语⾔的国际标准ANSIC规定了⼀…

ImGui 学习笔记(五) —— 字体文件加载问题

ImGui 加载字体文件的函数似乎存在编码问题,这一点可能跟源文件的编码也有关系,我目前源文件编码是 UTF-16。 当参数中包含中文字符时,ImGui 内部将字符转换为宽字符字符集时候,采用的 MultiByteToWideChar API 参数不太对&#…

OpenCV计算摄影学(20)非真实感渲染之增强图像的细节函数detailEnhance()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 此滤波器增强特定图像的细节。 cv::detailEnhance用于增强图像的细节,通过结合空间域和频率域的处理,提升图像中特定细节…

Android PC 要来了?Android 16 Beta3 出现 Enable desktop experience features 选项

在之前的 《Android 桌面窗口新功能推进》 我们就聊过,Google 就一直在努力改进 Android 的内置桌面模式,例如添加了适当的窗口标题、捕捉窗口的能力、悬停选项、窗口大小调整、最小化支持、app-to-web 等。 比如在搭载 Android 15 QPR 1 Beta 2 的 Pix…

Git常用操作之GitLab

Git常用操作之GitLab 小薛博客官网:小薛博客Git常用操作之GitLab官方地址 1、GitLab安装 https://gitlab.cn/install/ 1、Docker安装GitLab https://docs.gitlab.cn/jh/install/docker.html 1、设置卷位置 在设置其他所有内容之前,请配置一个新的…