LLM大模型学习:探索LLM的精髓-理解Prompts概念与LangChain快速应用技巧”

news2024/11/15 17:51:01

LLM 中什么是Prompts?如何使用LangChain 快速实现Prompts 一

Prompt是一种基于自然语言处理的交互方式,它通过机器对自然语言的解析,实现用户与机器之间的沟通。 Prompt主要实现方式是通过建立相应的语料库和语义解析模型,来将自然语言转换为机器可识别的指令。 Prompt是一种计算机编程语言,它被广泛用于自然语言处理(NLP)和人工智能(AI)领域。

image.png

Prompt templage 是用于生成语言模型提示的预定义方案。

模板可以包括说明、少量示例以及适合给定任务的特定上下文和问题。

LangChain 提供了创建和使用提示模板的工具。

LangChain 致力于创建与模型无关的模板,以便能够轻松地跨不同语言模型重用现有模板。

通常LLM 期望提示是字符串或聊天消息列表。

PromptTemplate

用于PromptTemplate创建字符串提示的模板。

默认情况下,PromptTemplate使用 Python 的 str.format 语法进行模板化。

该模板支持任意数量的变量,包括无变量:

 from langchain.prompts import PromptTemplate
 ​
 prompt_template = PromptTemplate.from_template(
     "Tell me a {adjective} joke about {content}."
 )
 prompt_template.format(adjective="funny", content="chickens")
 ​
 # > 'Tell me a funny joke about chickens.'

 # 无变量
 prompt_template = PromptTemplate.from_template("Tell me a joke")
 prompt_template.format()
 # > 'Tell me a joke'

PromptTemplate 一般使用在单轮对话中。不需要历史记忆的场景.

ChatPromptTemplate

ChatPromptTemplate 聊天消息列表,每条聊天消息都与内容以及附加参数相关联role。例如聊天消息可以与 AI 助手、人类或系统角色相关联。

创建一个这样的聊天提示模板:

 from langchain_core.prompts import ChatPromptTemplate
 ​
 chat_template = ChatPromptTemplate.from_messages(
     [
         ("system", "You are a helpful AI bot. Your name is {name}."),
         ("human", "Hello, how are you doing?"),
         ("ai", "I'm doing well, thanks!"),
         ("human", "{user_input}"),
     ]
 )
 ​
 messages = chat_template.format_messages(name="Bob", user_input="What is your name?")

ChatPromptTemplate.from_messages接受各种消息表示形式。

例如除了使用上面使用的 (type, content) 的二元组表示之外,我们还可以传入 MessagePromptTemplate的实例BaseMessage

 chat_template = ChatPromptTemplate.from_messages(
     [
        # 这里跟上面的 system 的作用是一致的
         SystemMessage(
             content=(
                 "You are a helpful assistant that re-writes the user's text to "
                 "sound more upbeat."
             )
         ),
         HumanMessagePromptTemplate.from_template("{text}"),
     ]
 )
 messages = chat_template.format_messages(text="I don't like eating tasty things")
 print(messages)

这样为我们构建聊天提示的方式提供了很大的灵活性。

LECL 方式

PromptTemplateChatPromptTemplate都实现Runnable接口。这意味着它们支持invokeainvokestreamastreambatchabatchastream_log 函数的调用。

PromptTemplate接受(提示变量的)字典并返回一个StringPromptValue. ChatPromptTemplate接受一个字典并返回一个ChatPromptValue

 prompt_val = prompt_template.invoke({"adjective": "funny", "content": "chickens"})
 # StringPromptValue(text='Tell me a funny joke about chickens.')
 prompt_val.to_string()
 # > Tell me a funny joke about chickens.
 ​
 prompt_val.to_messages()
 #> [HumanMessage(content='Tell me a joke')]
 ​

另一个例子

 chat_val = chat_template.invoke({"text": "i dont like eating tasty things."})
 chat_val.to_messages()
 ​
 #> [SystemMessage(content="You are a helpful assistant that re-writes the user's text to sound more upbeat."),HumanMessage(content='i dont like eating tasty things.')]
 ​
 # 转换为字符串
 chat_val.to_string()
 ​
 #> "System: You are a helpful assistant that re-writes the user's text to sound more upbeat.\nHuman: i dont like eating tasty things."

使用类型消息

聊天提示由消息列表组成。纯粹为了创建这些提示方便我们开发人员添加的一种的便捷方法。在此管道中,每个新元素都是最终提示中的一条新消息。

 from langchain_core.messages import AIMessage, HumanMessage, SystemMessage

首先,让我们使用系统消息初始化基本 ChatPromptTemplate。不一定要从系统开始,但这通常是比较好的做法。

 prompt = SystemMessage(content="You are a nice pirate")

然后我们可以轻松创建将其与其他消息或消息模板相结合的管道 。

当没有要格式化的变量时使用Message,当有要格式化的变量时使用MessageTemplate。还可以仅使用一个字符串(注意:这将自动推断为 HumanMessagePromptTemplate

 new_prompt = (
     prompt + HumanMessage(content="hi") + AIMessage(content="what?") + "{input}"
 )


这样LangChain会创建 ChatPromptTemplate 类的一个实例,因此我们可以像以前一样使用它!

 new_prompt.format_messages(input="i said hi")
 ​
 # 输出
 [SystemMessage(content='You are a nice pirate', additional_kwargs={}),
  HumanMessage(content='hi', additional_kwargs={}, example=False),
  AIMessage(content='what?', additional_kwargs={}, example=False),
  HumanMessage(content='i said hi', additional_kwargs={}, example=False)]


也可以在LLMChain一样在使用它。

 from langchain.chains import LLMChain
 from langchain_openai import ChatOpenAI
 llm = ChatOpenAI()
 chain = LLMChain(prompt=new_prompt, llm=llm)
 chain.run("I said HI!")


选择器

名称描述
相似 similarity使用输入和示例之间的语义相似性来决定选择哪些示例。
MMR使用输入和示例之间的最大边际相关性来决定选择哪些示例。
length_based根据一定长度内可以容纳的数量来选择示例
Ngram使用输入和示例之间的 ngram 重叠来决定选择哪些示例。

长度选择

长度选择器根据长度选择要使用的示例。当我们担心构建的提示会超过上下文窗口的长度时,这非常有用。对于较长的输入,它将选择较少的示例来包含,而对于较短的输入,它将选择更多的示例。

 from langchain.prompts import FewShotPromptTemplate, PromptTemplate
 from langchain.prompts.example_selector import LengthBasedExampleSelector
 ​
 # 制作反义词的任务示例。
 examples = [
     {"input": "happy", "output": "sad"},
     {"input": "tall", "output": "short"},
     {"input": "energetic", "output": "lethargic"},
     {"input": "sunny", "output": "gloomy"},
     {"input": "windy", "output": "calm"},
 ]
 ​
 example_prompt = PromptTemplate(
     input_variables=["input", "output"],
     template="Input: {input}\nOutput: {output}",
 )
 example_selector = LengthBasedExampleSelector(
     # 可供选择的示例。
     examples=examples,
     #用于格式化示例的PromptTemplate。
     example_prompt=example_prompt,
     # 格式化示例的最大长度。长度由下面的get_text_length函数来衡量。
     max_length=25,
     # 用于获取字符串长度的函数,用于确定要包含哪些示例。因为如果未指定,默认值将会提供。
     # get_text_length: Callable[[str], int] = lambda x: len(re.split("\n| ", x))
 )
 dynamic_prompt = FewShotPromptTemplate(
     # 我们提供一个示例选择器
     example_selector=example_selector,
     example_prompt=example_prompt,
     prefix="Give the antonym of every input",
     suffix="Input: {adjective}\nOutput:",
     input_variables=["adjective"],
 )


 print(dynamic_prompt.format(adjective="big"))


 Give the antonym of every input
 ​
 Input: happy
 Output: sad
 ​
 Input: tall
 Output: short
 ​
 Input: energetic
 Output: lethargic
 ​
 Input: sunny
 Output: gloomy
 ​
 Input: windy
 Output: calm
 ​
 Input: big
 Output:


一个包含长输入的示例,所以它只选择了一个示例。

 long_string = "big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else"
 print(dynamic_prompt.format(adjective=long_string))


 Give the antonym of every input
 ​
 Input: happy
 Output: sad
 ​
 Input: big and huge and massive and large and gigantic and tall and much much much much much bigger than everything else
 Output:


(MMR) 选择

MaxMarginalRelevanceExampleSelector根据与输入最相似的示例的组合来选择示例,同时还针对多样性进行优化。它通过查找与输入具有最大余弦相似度的嵌入示例来实现这一点,然后迭代地添加它们,同时排除它们与已选择示例的接近程度。

看个例子:
 from langchain.prompts import FewShotPromptTemplate, PromptTemplate
 from langchain.prompts.example_selector import (
     MaxMarginalRelevanceExampleSelector,
     SemanticSimilarityExampleSelector,
 )
 from langchain_community.vectorstores import FAISS
 from langchain_openai import OpenAIEmbeddings
 ​
 example_prompt = PromptTemplate(
     input_variables=["input", "output"],
     template="Input: {input}\nOutput: {output}",
 )
 ​
 #创建反义词的假装任务的示例。
 examples = [
     {"input": "happy", "output": "sad"},
     {"input": "tall", "output": "short"},
     {"input": "energetic", "output": "lethargic"},
     {"input": "sunny", "output": "gloomy"},
     {"input": "windy", "output": "calm"},
 ]


 example_selector = MaxMarginalRelevanceExampleSelector.from_examples(
     # 可以选择的示例列表。
     examples,
     # 用于生成嵌入的嵌入类,用于衡量语义相似性。
     OpenAIEmbeddings(),
     # 用于存储嵌入并进行相似度搜索的VectorStore类。
     FAISS,
     # 需要生成的示例数量。
     k=2,
 )
 mmr_prompt = FewShotPromptTemplate(
     #我们提供 ExampleSelector
     example_selector=example_selector,
     example_prompt=example_prompt,
     prefix="Give the antonym of every input",
     suffix="Input: {adjective}\nOutput:",
     input_variables=["adjective"],
 )


输入worried 是一种感觉类的词汇,所以应该选择愉快/悲伤的例子作为第一个。

 print(mmr_prompt.format(adjective="worried"))


 # 让我们将这与仅仅基于相似性得到的结果进行比较。请使用SemanticSimilarityExampleSelector代替MaxMarginalRelevanceExampleSelector。
 example_selector = SemanticSimilarityExampleSelector.from_examples(
     # 可供选择的示例列表。
     examples,
     #向量相似性检索
     OpenAIEmbeddings(),
     #用于存储嵌入并进行相似性搜索的 VectorStore 类。
     FAISS,
     k=2,
 )
 similar_prompt = FewShotPromptTemplate(
     # 供了一个示例选择器,而不仅仅是具体的示例。
     example_selector=example_selector,
     example_prompt=example_prompt,
     prefix="Give the antonym of every input",
     suffix="Input: {adjective}\nOutput:",
     input_variables=["adjective"],
 )
 print(similar_prompt.format(adjective="worried"))


Ngram重叠选择

NGramOverlapExampleSelector根据 ngram 重叠分数,根据与输入最相似的示例来选择示例并对其进行排序。ngram 重叠分数是 0.0 到 1.0 之间的浮点数(含 0.0 和 1.0)。

选择器允许设置阈值分数。ngram 重叠分数小于或等于阈值的示例被排除。默认情况下,阈值设置为 -1.0,因此不会排除任何示例,只会对它们重新排序。将阈值设置为 0.0 将排除与输入没有 ngram 重叠的示例。

 from langchain.prompts import FewShotPromptTemplate, PromptTemplate
 from langchain.prompts.example_selector.ngram_overlap import NGramOverlapExampleSelector
 ​
 example_prompt = PromptTemplate(
     input_variables=["input", "output"],
     template="Input: {input}\nOutput: {output}",
 )
 ​
 # 翻译任务的示例
 examples = [
     {"input": "See Spot run.", "output": "Ver correr a Spot."},
     {"input": "My dog barks.", "output": "Mi perro ladra."},
     {"input": "Spot can run.", "output": "Spot puede correr."},
 ]


 example_selector = NGramOverlapExampleSelector(
     # 可以选择的示例。
     examples=examples,
     # 正在使用的 PromptTemplate 用于格式化示例。
     example_prompt=example_prompt,
     # 选择器停止的阈值。默认是 -1.0
     threshold=-1.0,
 )
 dynamic_prompt = FewShotPromptTemplate(
     #  我们提供一个示例选择器。
     example_selector=example_selector,
     example_prompt=example_prompt,
     prefix="Give the Spanish translation of every input",
     suffix="Input: {sentence}\nOutput:",
     input_variables=["sentence"],
 )


对于负阈值:Selector按ngram重叠分数对示例进行排序,不排除任何示例。对于大于1.0的阈值:选择器排除所有示例,并返回一个空列表。对于等于0.0的阈值:Selector根据ngram重叠分数对示例进行排序,并且排除与输入没有ngram重叠的那些。

similarity 选择器

该对象根据与输入的相似性来选择示例。它通过查找与输入具有最大余弦相似度的嵌入示例来实现这一点。

 from langchain.prompts import FewShotPromptTemplate, PromptTemplate
 from langchain.prompts.example_selector import SemanticSimilarityExampleSelector
 from langchain_community.vectorstores import Chroma
 from langchain_openai import OpenAIEmbeddings
 ​
 example_prompt = PromptTemplate(
     input_variables=["input", "output"],
     template="Input: {input}\nOutput: {output}",
 )
 ​
 #创建反义词的任务的示例。
 examples = [
     {"input": "happy", "output": "sad"},
     {"input": "tall", "output": "short"},
     {"input": "energetic", "output": "lethargic"},
     {"input": "sunny", "output": "gloomy"},
     {"input": "windy", "output": "calm"},
 ]


 example_selector = SemanticSimilarityExampleSelector.from_examples(
     # 可供选择的示例列表。
     examples,
     # 用于生成嵌入的嵌入类,这些嵌入类用于衡量语义相似性。
     OpenAIEmbeddings(),
     #用于存储嵌入并进行相似度搜索的VectorStore类。
     Chroma,
     k=1,
 )
 similar_prompt = FewShotPromptTemplate(
     # 我们提供一个 ExampleSelector
     example_selector=example_selector,
     example_prompt=example_prompt,
     prefix="Give the antonym of every input",
     suffix="Input: {adjective}\nOutput:",
     input_variables=["adjective"],
 )


总结:

本篇文章我们主要介绍了一下内容:

  • 什么是 promptprompt template
  • Langchain 中 构建 prompt template 的方式以及类型:PromptTemplateChatPromptTemplate
  • 使用 langchain 构建消息类型。
  • prompt 选择器的类型,以及为什么需要选择器。

在这里插入图片描述

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

《A Few Useful Things to Know about Machine Learning》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl机器学习作为人工智能领域的重要分支,近年来得到了广泛的关注和应用。Pedro Domingos的经典论文《A Few Useful Things to Know about Machine Learning》为我们提供了对机器学习深入且全面的理解…

Java方法的定义,即“函数“的定义!

方法的作用 提高代码的复用性,写一次,你需要的时候直接去调用即可。 定义一个函数方法 [修饰符1 修饰符2 ...] 返回值类型 方法名(形参){Java语句;... ... ... }初次接触方法的举例:两个整数的求和方法 根据上面的例子我们来分…

虚拟机扩充磁盘空间

本人使用的VMware首先关闭虚拟机在设置中进行磁盘扩展,输入扩展的空间 具体扩展步骤 fdisk /dev/sda输入p,查看分区情况输入n新建一个分区,还有之后两步,全部默认输入w保存分区fdisk -l使用vgdisplay查看卷组信息:vgdi…

动手学深度学习(pytorch)学习记录26-卷积神经网路(LeNet)[学习记录]

目录 LeNet模型训练 LeNet 总体来看,LeNet(LeNet-5)由两个部分组成: 卷积编码器:由两个卷积层组成; 全连接层密集块:由三个全连接层组成。 每个卷积块中的基本单元是一个卷积层、一个sigmoid激活函数和平均…

Docker 清理和查看镜像与容器占用情况

查看容器占用磁盘大小 docker system df 查看单个image、container大小: docker system df -v 清理所有废弃镜像与Build Cache docker system prune -a

【解决内存泄漏的问题】 Qt 框架中的父子对象关系会自动管理内存,父对象会在其销毁时自动销毁所有子对象。

修改前的代码 这段代码可能会出现内存泄漏问题,主要原因是构造函数中创建的 LoginDialog 和 RegisterDialog 对象未在合适的地方被正确释放。具体分析如下: 1. 构造函数中的问题 _login_dlg new LoginDialog(); setCentralWidget(_login_dlg); _login…

【北京迅为】《STM32MP157开发板使用手册》- 第十二章 编译Linux内核

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

运算放大器中的反馈

运算放大器中的反馈:原理、类型与应用 运算放大器(Operational Amplifier, 简称Op-Amp)是现代电子电路中的重要组成部分,被广泛应用于信号处理、放大、滤波等场合。而反馈技术则是运算放大器电路的核心之一,直接影响其…

代码随想录算法训练营第二十二天| 491. 递增子序列、46. 全排列、47. 全排列Ⅱ

今日内容 Leetcode. 491 递增子序列Leetcode. 46 全排列Leetcode. 47 全排列Ⅱ Leetcode. 491 递增子序列 文章链接:代码随想录 (programmercarl.com) 题目链接:491. 非递减子序列 - 力扣(LeetCode) 本题也是一个子集问题&#…

【AI绘画】Midjourney后置指令--seed、--tile、--q、--chaos、--w、--no详解

博客主页: [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯Midjourney后置指令--seed测试1测试2如何获取未指定种子图片的随机种子注意点 💯Midjourney后置指令--tile测试 💯Midjourney后置指令--q(or-…

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用&a…

chrome浏览器如何设置自动播放音视频

使用场景: 有些场景需要打开页面后,自动播放视频或者视频流,这时候发现无法播放,打开浏览器控制台发现有下面的错误提示:NotAllowedError: play() failed because the user didnt interact with the document first 。…

顶级出图效果!免费在线使用FLux.1 模型,5s出图无限制!

最近发现一个可以在线免费使用 FLux.1 模型 生成图片的AI工具。 先看效果图: 工具不需要登录即可使用,目前还是完全免费的,国内可以直接使用。 在提示词输入框直接输入提示词即可,选择图片比例之后,直接生图。 出图的…

安全运营之浅谈SIEM告警疲劳

闲谈: 刚开始学习SIEM、态势感知这类产品的时,翻阅老外们的文章总是谈什么真阳性,假阳性告警、告警疲劳,当时在国内资料中没找到很合理的解释,慢慢就淡忘这件事了。随着慢慢深入工作,感觉大概理解了这些概念…

‌技术人必看!如何科学规划,从需求出发打造完美技术方案

引言 在互联网架构师的角色中,我们面临的挑战不仅仅是编写代码,更重要的是深入理解需求、设计系统,并确保我们的解决方案能够稳定、高效地运行。本文将详细介绍从新需求提出到技术方案发布的全过程。 1. 理解现有需求和场景 在开始一个新的…

信息学奥赛初赛天天练-87-NOIP2014普及组-完善程序-矩阵、子矩阵、最大子矩阵和、前缀和、打擂台求最大值

1 完善程序 最大子矩阵和 给出 m行 n列的整数矩阵,求最大的子矩阵和(子矩阵不能为空)。 输入第一行包含两个整数 m和 n,即矩阵的行数和列数。之后 m行,每行 n个整数,描述整个矩阵。程序最终输出最大的子矩阵和。 (最…

SAP中mmpv自动过账—附带源码

想省事儿的直接拖到后面查看代码 思路分析 实现逻辑:初版 前台测试:选择屏幕确认公司代码。必要情况手动开账勾选前台执行按钮 1.1去marv表找公司代码的当前账期,简单运算获取下一个账期。1.2执行bdc,模拟前台手动开账期1.3执行的必要信息存日志表。例:修改人(开账期的人…

FastAPI 进阶:使用 BackgroundTasks 处理长时间运行的任务

在 FastAPI 中,BackgroundTasks 是一个功能,它允许你在发送响应给客户端之后执行后台任务。这些任务对于不需要客户端等待的操作非常有用,比如发送电子邮件通知或处理数据。然而,当服务器重启时,由于 BackgroundTasks …

C++: set与map容器的介绍与使用

本文索引 前言1. 二叉搜索树1.1 概念1.2 二叉搜索树操作1.2.1 查找与插入1.2.2 删除1.2.3 二叉搜索树实现代码 2. 树形结构的关联式容器2.1 set的介绍与使用2.1.1 set的构造函数2.1.2 set的迭代器2.1.3 set的容量2.1.4 set的修改操作 2.2 map的介绍与使用2.2.1 map的构造函数2.…

基于python的mediapipe姿态识别 动作识别 人体关健点 实现跳绳状态判别 计数功能

基于Python的MediaPipe姿态识别实现跳绳状态判别与计数功能 项目概述 本项目旨在利用Google的MediaPipe库,结合姿态识别技术,实现对跳绳动作的实时检测与计数功能。通过识别人体关键点,系统能够准确判断跳绳动作的状态,并实时统…