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

模型I/O

文章目录

    • 什么是模型I/O
    • 模型I/O功能之输出解析器
      • 输出解析器的功能
      • 输出解析器的使用
      • Pydantic JSON输出解析器
      • 结构化输出解析器

什么是模型I/O

    模型I/O在所有LLM应用中,核心元素无疑都是模型本身。与模型进行有效的交互是实现高效、灵活和可扩展应用的关键。LangChain提供了一系列基础构建块,使你能够与主流语言模型进行对接。

    LangChain可以说是大语言模型应用开发的“最后1公里”。2023年以来,大语言模型如同雨后春笋般一根接一根地冒出来。其中,知名度较高的几个模型包括OpenAI的GPT系列、Anthropic的Claude系列、谷歌的PaLM系列,以及Meta公司发布的LLaMA系列。这些模型都由各自的模型平台发布,并配备了接口供开发者使用。对于开发者来说,要想充分利用这些模型的能力,首先需要了解并掌握每个模型平台的API调用接口。有了这些知识,开发者就可以发起调用,向模型输人数据,并获取模型的输出结果。

    问题是,初学者面对众多的大语言模型平台和各自不同的API调用协议,可能会感到困惑甚至望而却步。毕竟,每个模型平台都有其特定的调用方式和规范,初学者需要投人大量的时间和精力去学习和理解。例如,OpenAI就发布了十几种不同的大语言模型,其中2023年发布的GPT-4模型需要使用Chat类型的API进行调用。这意味着,每当想要使用一个新的模型时,就需要重新学习和理解这个模型特定的API调用方式,这无疑增加了开发者的工作负担。这就像每当遇到一个新的语言环境就需要重新学习一门新的语言一样,既费时又费力。

图片名称

    对于那些想要利用大语言模型构建应用的开发者来说,同样如此。以应用程序为例,一个复杂的应用可能包含各种不同的功能需求,这就意味着可能需要调用不同类型的模型来满足这些需求。比如,在处理文本分类任务时,可能只需要一个参数较少、规模较小的模型就能够实现。但在处理聊天场景任务时,则需要一个能够理解用户输人并能让对话具有“说人话”感觉的模型,比如GPT-4。这就需要掌握和管理更多的模型调用方式,无疑增加了开发的复杂度。

    为了解决这些问题,LangChain推出了模型I/O,这是一种与大语言模型交互的基础组件。模型/O的设计目标是使开发者无须深入理解各个模型平台的API调用协议就可以方便地与各种大语言模型平台进行交互(上图中的③)。本质上来说,模型I/O组件是对各个模型平台API的封装,这个组件封装了50多个模型接口。这就好比LangChain提供了通用包装器,无论你要和哪种模型进行交互,都可以通过这个包装器(上图中第③部分的LLM模型包装器和聊天模型包装器)来实现。

    开发者可以很方便地与最新、最强大的模型(如2023年7月的GPT-4)进行交互,也可以与本地私有化部署的语言模型,甚至在HuggingFace上找到的开源模型进行交互。只需要几行代码,开发者就可以与这些模型对话,无须关心模型平台的底层API调用方式。

图片名称

    那如何使用LangChain的基础组件模型I/O来访问各个平台的大语言模型呢?模型I/O组件提供了3个核心功能。模型包装器:通过接口调用大语言模型,见上图中的模型预测(Predict)部分。

图片名称

    提示词模板管理:将用户对LLM的输入进行模板化,并动态地选择和管理这些模板,即模型输人(Model I),见上图中的模板字符串(PromptTemplate)部分。输出解析器:从模型输出中提取信息,即模型输出(Model O),见上图中的输出解析器(Parse)部分。

模型I/O功能之输出解析器

    在使用GPT-4或类似的大语言模型时,一个常见的挑战是如何将模型生成的输出格式转化为可以在代码中直接使用的格式。对于这个问题,通常使用LangChain的输出解析器(OutputParsers)工具来解决。虽然大语言模型输出的文本信息可能非常有用,但应用与真实的软件数据世界连接的时候,希望得到的不仅仅是文本,而是更加结构化的数据。为了在应用程序中展示这些结构化的信息,需要将输出转换为某种常见的数据格式。可以编写一个函数来提取输出,但这并不理想。比如在模型指导提示词中加上“请输出JSON格式的答案”,模型会返回字符串形式的JSON,还需要通过函数将其转化为JSON对象。但是在实践中常常会遇到异常问题,例如返回的字符串JSON无法被正确解析。

    处理生产环境中的数据时,可能会遇到千奇百怪的输人,导致模型的响应无法解析,因此需要增加额外的补丁来进行异常处理。这使得整个处理流程变得更为复杂。另外,大语言模型目前确实存在一些问题,例如机器幻觉,这是指模型在理解或生成文本时会产生错误或误解。另一个问题是为了显得自己“聪明”而加人不必要的、冗长华丽的语句,这可能会导致模型输出过度详细,显得“话痨”。这时你可以在提示词的结尾加上“你的答案是:”,模型就不会“话痨”了。

    在真实的开发环境中,开发者不仅希望获取模型的输出结果,还希望能够对输出结果进行后续处理,比如解析模型的输出数据。这就是为什么在大语言模型的开发中,结构化数据,如数组或JSON对象,显得尤为重要。结构化数据在软件开发中起着至关重要的作用,它提高了数据处理的效率,简化了数据的存储和检索,支持数据分析,并且有助于提高数据质量。

    结构化数据可以帮助开发者更好地理解和处理模型的输出结果,比如通过解析输出的JSON对象,可以得到模型的预测结果,而不仅仅是一个长文本字符串。也可以根据需要对这些结果进行进一步的处理,例如提取关键信息、进行数据分析等,这样不仅可以得到模型的“直接回答”,还可以根据自己的需求进行定制化的后续处理,比如传递给下一个任务函数,从而更好地利用大语言模型。

输出解析器的功能

    输出解析器具有两大功能:添加提示词模板的输出指令和解析输出格式。看到这里你也许会感到很奇怪,解析输出格式很好理解,但是输出解析器跟提示词模板有什么关系呢?确实,从名字上看,输出解析器(OutputParser)似乎与提示词模板没有关系,因为它听起来更像用于处理和解析输出的工具。然而实际上,输出解析器是通过改变提示词模板,即增加输出指令,来指导模型按照特定格式输出内容的。换句话说,原本的提示词模板中不包含输出指令,如果你想得到某种特定格式的输出结果,就得使用输出解析器。这样做的目的是分离提示词模板的输入和输出,输出解析器会把增加“输出指令”这件事做好。如果不要求模型按照特定的格式输出结果,则保持原提示词模板即可。

    举例来说,下面这个输出指令要求模型输出一系列用逗号分隔的值(CSV),即模型的答案中应该含有多个值,这些值之间用逗号分隔。"Your response should be a list of comma separated values,"eg:'foo,bar,baz'"大语言模型接收到这条指令并且进行意图识别后,响应的结果是使用逗号分隔的值(CSV)。你可以直接将这个指令写人提示词模板,也可以构造好提示词模板后使用输出解析器的预设指令。两者的效果是等价的,区别在于亲自写还是使用预设指令,以及一起写还是分开写。

    这些区别决定了LangChain输出解析器的意义。输出解析器的便利性体现在,你想要某种输出格式时不需要手动写人输出指令,而是导人预设的输出解析器即可。除了预设大量的输出指令,输出解析器的parse方法还支持将模型的输出解析为对应的数据格式。总的来说,输出解析器已经写好了输出指令(注入提示词模板的字符串),也写好了输出数据的格式处理函数,开发者不需要“重复造轮子”。

    LangChain提供了一系列预设的输出解析器,这些输出解析器能够针对不同的数据类型给出合适的输出指令,并将输出解析为不同的数据格式。这些输出解析器包括:

  1. BooleanOutputParser:用于解析布尔值类型的输出。
  2. CommaSeparatedListOutputParser:用于解析以逗号分隔的列表类型的输出。
  3. DatetimeOutputParser:用于解析日期时间类型的输出。
  4. EnumOutputParser:用于解析枚举类型的输出。
  5. ListOutputParser:用于解析列表类型的输出。
  6. PydanticOutputParser:用于解析符合Pydantic大语言模型需求的输出。
  7. StructuredOutputParser:用于解析具有特定结构的输出。

    还是拿刚才的以逗号分隔的列表类型的输出指令举例,我们来看看LangChain是如何编写输出指令的。CommaSeparatedListOutputParser类的源码如下:

class CommaSeparatedListOutputParser(ListOutputParser):
"""Parse out comma separated lists."""def get_format instructions(self)->str:return"Your response should be a list of comma separated values,"eg:foo,bar,baz'")def parse(self,text:str)->List[str]:"""Parse the output of an LLM call."""return text.strip().split(","

    从以上代码中可以很直观地看到预设的输出指令:"Your response should be a list of comma separated values,"eg:'foo,bar,baz"实例化CommaSeparatedListOutputParser类之后,调用get_format_instructions()方法返回上述字符串。其实这个字符串就是前面示例中用逗号分隔的输出指令。同CommaSeparatedListOutputParse输出解析器一样,其他几种输出解析器也按照不同的数据类型预设了相应的输出指令,pase方法内处理了不同类型的数据,这些都是LangChain造好的“轮子”。

输出解析器的使用

    输出解析器的使用主要依靠提示词模板对象的partial方法注入输出指令的字符串,主要的实现方式是利用PromptTemplate对象的partial方法或在实例化PromptTemplate对象时传递partial variables参数。这样做可以提高代码的灵活性,使得提示词的占位符变量可以根据需要动态增加或减少。使用这种方式可为提示词模板添加输出指令,指导模型输出。

    具体操作是,首先使用output parser.get_format_instructions()获取预设的输出指令,然后在实例化PromptTemplate类时将format_instructions作为partial_variables的一部分传入,如此便在原有的提示词模板中追加了format instructions变量,这个变量是输出指令字符串。以下是相关的示例代码:

format instructions = output_parser.get_format instructions()
prompt = PromptTemplate(template="List five (subject}.\n(format instructions)",input_variables=["subject"],partial variables={"format instructions":format instructions))

    在这段代码中,PromptTemplate的模板字符串template中包含两个占位符变量{subject}和{format_instructions}。在实例化PromptTemplate对象时,除了要传人input_variables=["subject"门参数,还要通过partial_variables-={“format_instructions’”:format instructions}参数预先填充{format instructions}变量,这样就成功地为提示词模板添加了输出解析器所提供的输出指令。现在通过下面的示例完成输出解析器的两大功能:添加输出指令和解析输出格式,同时展示如何将输出解析器运用到链组件上。

    首先,采用CommaSeparatedListOutputParser输出解析器:

from langchain.output_parsers import CommaSeparatedListoutputParser
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
output_parser CommaSeparatedListOutputParser ()

    然后,使用output parser…get_format_instructions()方法获取预设的格式化输出指令。这个字符串输出指令会指导模型如何将输出格式化为以逗号分隔的消息列表。接下来,创建一个PromptTemplate提示词模板对象:

format_instructions = output parser.get format instructions()
prompt = PromptTemplatetemplate=("List five (subject}.\n(format instructions)",input_variables=["subject"],partial_variables=("format instructions":format instructions))

    这个提示词模板中定义了一个字符串模板,其中包含两个占位符变量{subject}和{format_instructions}。{subject}是希望模型产生的列表主题,例如“ice cream flavors’”,而{format instructions}是从输出解析器中获取的预设的输出指令。这里引入OpenAI的LLM模型包装器。打印format instructions的结果,内容是

Your response should be a list of commaseparated values,eg:'foo,bar,baz'"
from langchain.chains import LLMChain
chain=LLMChain(llm=OpenAI(openai_api_key="填人OpenAI的密钥",prompt=prompt)

    将subject的值设为ice cream flavors,然后调用prompt..format(subject="ice creamflavors'")方法,返回一个完整的提示词字符串,包含指导模型产生5种冰淇淋口味的指令。导入LLMChain链组件,为OpenAI模型类设置密钥,将PromptTemplate类实例化后的对象传人LLMChain链:output =chain ("ice cream flavors")运行这个链得到的是一个JSON对象,output['text]是模型回答的字符串,然后调用输出解析器的parse(0方法将这个字符串解析为一个列表。由于输出解析器是CommaSeparatedListOutputParser,所以它会将模型输出的以逗号分隔的文本解析为列表。

output_parser.parse(output['text'])最后得到的结果是一个包含5种冰淇淋口味的列表,代表口味的值用逗号隔开:['Vanilla','Chocolate','Strawberry','Mint Chocolate Chip','Cookies and Cream']

Pydantic JSON输出解析器

    PydanticOutputParser输出解析器可以指定JSON数据格式,并指导LLM输出符合开发者需求的JSON格式数据。可以使用Pydantic来声明数据模式。Pydantic的BaseModel就像一个Python数据类,但它具有实际的类型检查和强制转换功能。

    下面是最简单的Pydantic JSON输出解析器示例代码,导人OpenAI模型包装器和提示词模板包装器:

from langchain.prompts import (PromptTemplate)
from langchain.llms import OpenAI

    导人PydanticOutputParser类:

from langchain.output parsers import PydanticoutputParser
from pydantic import BaseModel,Field,validator
fromtyping import List

    这里使用LLM模型包装器,实现与机器人的对话:model=OpenAI(openai_api_key=("填入你的密钥")定义数据结构Joke,实例化PydanticOutputParser输出解析器,将该输出解析器预设的输出指令注人提示词模板:

#定义所需的数据结构
class Joke (BaseModel):setup:str Field(description="question to set up a joke")punchline:str Field(description="answer to resolve the joke")#使用Pydantic轻松添加自定义的验证逻辑("setup")def question_ends_with question mark(cls,field):if field[-1]!"?"raise ValueError ("Badly formed question!")return field#创建一个用于提示LLM生成数据结构的查询joke_query "Tell me a joke."#设置一个输出解析器,并将指令注人提示词模板parser PydanticOutputParser(pydantic_object=Joke)prompt = PromptTemplate(template="Answer the user query.\n{format instructions)\n(query)\n",input_variables=["query"],partial variables={"format instructions":parser.get_format_instructions ()},)_input =prompt.format prompt (query=joke_query)output =model(input.to string())parser.parse(output)

    将用户输人“ice cream flavors’”绑定到提示词模板的query变量上,使用LLM模型包装器与模型平台进行交互。将该输出解析器预设的输出指令绑定到提示词模板的format instructions变量上:

_input =prompt.format (subject="ice cream flavors")
output =model(input)

    调用输出解析器的parse方法,将输出解析为Pydantic JSON格式:output parser.parse (output)最终的结果是符合Joke定义的数据格式:Joke(setup='Why did the chicken cross the road?',punchline='To get to theother side!'

结构化输出解析器

    OutputParsers是一组工具,其主要目标是处理和格式化模型的输出。它包含了多个部分,但对于实际的开发需求来说,其中最关键的部分是结构化输出解析器(StructuredOutputParser)。这个工具可以将模型原本返回的字符串形式的输出,转化为可以在代码中直接使用的数据结构。特别要指出的是,通过定义输出的数据结构,提示词模板中加人了包含这个定义的输出指令,让模型输出符合该定义的数据结构。本质上来说就是通过告诉模型数据结构定义,要求模型给出一个符合该定义的数据,不再仅仅是一句话的回答,而是抽象的数据结构。

    使用结构化输出解析器时,首先需要定义所期望的输出格式。输出解析器将根据这个期望的输出格式来生成模型提示词,从而引导模型产生所需的输出,例如使用StructuredOutputParser来获取多个字段的返回值。尽管Pydantic/JSON解析器更强大,但在早期实验中,选择的数据结构只包含文本字段。首先从LangChain中导人所需的类和方法:

from langchain.output_parsers importStructuredOutputParser,ResponseSchema
from langchain.prompts importPromptTemplate,ChatPromptTemplate,HumanMessagePromptTemplate
from langchain.llms import OpenAI
from langchain.chat models import ChatopenAI

    然后定义想要接收的响应模式:

response schemas =[ResponseSchema(name="answer",description="answer to the user's question"),ResponseSchema(name="source",description=("source used to answer the user's question,"should be a website."))]
output parser =StructuredoutputParser.from response schemas(response schemas)

    接着获取一个format instructions,包含将响应格式化的输出指令,然后将其插人提示词模板:

format_instructions output_parser.get_format instructions()
prompt =PromptTemplate(template=("answer the users question as best as possible.\n""(format instructions)\n(question)",input variables=["question"],partial variables=("format instructions":format instructions))
model=OpenAI(openai_api_key="填人你的密钥")
_input =prompt.format prompt (question="what's the capital of france?"
output= model(input.to_string ()
output_parser.parse (output)

    返回结果如下:(‘answer’:‘Paris’,‘source’:·请参考本书代码仓库URL映射表,找到对应资
//www.worldatlas.com/articles/what-is-the-capital-of-france.html’接下来是一个在聊天模型包装器中使用这个方法的示例:

chat_mode1=ChatOpenAI(openai_api_key="填人你的密钥")
prompt =ChatPromptTemplate(messages=[HumanMessagePromptTemplate.from template("answer the users question as best as possible.\n""answer the users question as best as possible.\n")]
"(format instructions)\n(question)"
],
input_variables=["question"],
partial variables=(
"format instructions":format instructions
)
_input =prompt.format_prompt (question="what's the capital of france?")
output= chat model(input.to_messages ()
output_parser.parse(output,content)#多包一层content

    返回结果如下:(‘answer’:‘Paris’,‘source’:·请参考本书代码仓库URL映射表,找到对应资
源://en.wikipedia.org/wiki/Paris’)这就是使用PromptTemplate和StructuredOutputParser来格式化和解析模型输人及输出的完整过程。

相关文章:

模型I/O

文章目录 什么是模型I/O模型I/O功能之输出解析器输出解析器的功能输出解析器的使用Pydantic JSON输出解析器结构化输出解析器 什么是模型I/O 模型I/O在所有LLM应用中,核心元素无疑都是模型本身。与模型进行有效的交互是实现高效、灵活和可扩展应用的关键。LangChain…...

DeepSeek模型:开启人工智能的新篇章

DeepSeek模型:开启人工智能的新篇章 在当今快速发展的技术浪潮中,人工智能(AI)已经成为了推动社会进步和创新的核心力量之一。而DeepSeek模型,作为AI领域的一颗璀璨明珠,正以其强大的功能和灵活的用法&…...

git push到远程仓库时无法推送大文件

一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…...

初识ExecutorService

设计目的 ExecutorService是Java并发包(java.util.concurrent)的一部分,旨在提供一种更高层次的抽象来管理线程和任务执行。它解决了手动创建和管理线程带来的复杂性和资源浪费问题,通过复用固定数量的线程池来处理大量短生命周期的任务,从而…...

初二回娘家

昨天下午在相亲相爱一家人群里聊天,今天来娘家拜年。 聊天结束后,开始准备今天的菜肴,梳理了一下,凉菜,热菜,碗菜。 上次做菜,粉丝感觉泡的不透,有的硬,这次使用开水浸泡…...

js基础(黑马程序员)

Web APIs(day6) 一、正则表达式 1.介绍 正则表达式(Regular Expression):是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象 通常用来查找、替换那些符合正则表达式的文本&#x…...

Java---猜数字游戏

本篇文章所实现的是Java经典的猜数字游戏 , 运用简单代码来实现基本功能 目录 一.题目要求 二.游戏准备 三.代码实现 一.题目要求 随机生成一个1-100之间的整数(可以自己设置区间),提示用户猜测,猜大提示"猜大了",…...

Oracle Primavera P6 最新版 v24.12 更新 2/2

目录 一. 引言 二. P6 EPPM 更新内容 1. 用户管理改进 2. 更轻松地标准化用户设置 3. 摘要栏标签汇总数据字段 4. 将里程碑和剩余最早开始日期拖到甘特图上 5. 轻松访问审计数据 6. 粘贴数据时排除安全代码 7. 改进了状态更新卡片视图中的筛选功能 8. 直接从活动电子…...

【React】 react路由

这一篇文章的重点在于将React关于路由的问题都给搞清楚。 一个路由就是一个映射关系,key:value。key是路径,value 可能是function或者component。 安装react-router-dom包使用路由服务,我这里想要用的是6版本的包,因此后面加”6&q…...

Linux的常用指令的用法

目录 Linux下基本指令 whoami ls指令: 文件: touch clear pwd cd mkdir rmdir指令 && rm 指令 man指令 cp mv cat more less head tail 管道和重定向 1. 重定向(Redirection) 2. 管道(Pipes&a…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.18 逻辑运算引擎:数组条件判断的智能法则

1.18 逻辑运算引擎:数组条件判断的智能法则 1.18.1 目录 #mermaid-svg-QAFjJvNdJ5P4IVbV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QAFjJvNdJ5P4IVbV .error-icon{fill:#552222;}#mermaid-svg-QAF…...

C语言实现库函数strlen

size_t是 unsigned int fgets会读入\n&#xff0c;用strcspn函数除去 assert判读指针是否为空指针&#xff0c;使用前要引头文件<assert.h> #include <stdio.h> #include <assert.h> size_t mystrlen(const char* str) {assert(str);size_t count 0;while …...

18 大量数据的异步查询方案

在分布式的应用中分库分表大家都已经熟知了。如果我们的程序中需要做一个模糊查询&#xff0c;那就涉及到跨库搜索的情况&#xff0c;这个时候需要看中间件能不能支持跨库求交集的功能。比如mycat就不支持跨库查询&#xff0c;当然现在mycat也渐渐被摒弃了(没有处理笛卡尔交集的…...

FastExcel使用详解

文章目录 FastExcel使用详解一、引言二、环境准备与依赖引入1、Maven 依赖引入2、实体类定义 三、核心操作&#xff1a;读写 Excel1、读取 Excel1.1 自定义监听器1.2 读取文件 2、写入 Excel2.1 简单写入2.2 模板写入 四、Spring Boot 集成示例1、文件上传&#xff08;导入&…...

深度学习python基础(第四节) 元组、字符串、集合和字典

本节主要介绍元组,字符串,集合,字典的基本语法定义,以及相关的操作. 元组的定义和操作 元组一旦定义完成就不可修改. """ # 定义元组字面量 (元素&#xff0c;元素&#xff0c;....,元素) # 元素可以不同的数据类型# 定义元组变量 变量名称 (元素&#xff0c;…...

QT串口通信,实现单个温湿度传感器数据的采集

1、硬件设备 RS485中继器(一进二出),usb转485模块、电源等等 => 累计115元左右。 2、核心代码 #include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::...

绘制决策树尝试3

目录 代码解读AI 随机状态 种子 定义决策树回归模型 tree的decision regressor fit 还可用来预测 export 效果图 我的X只有一个特征 为何这么多分支 &#xff1f;&#xff1f;&#xff1f; 这是CART回归 CART回归 为什么说代码是CART回归&#xff1f; 不是所有的决…...

【逻辑学导论第15版】A. 推理

识别下列语段中的前提与结论。有些前提确实支持结论&#xff0c;有些并不支持。请注意&#xff0c;前提可能直接或间接地支持结论&#xff0c;而简单的语段也可能包含不止一个论证。 例题&#xff1a; 1.管理得当的民兵组织对于一个自由国家的安全是必需的&#xff0c;因而人民…...

qt-C++笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别

qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别 code review! 参考笔记 1.qt-C笔记之重写QGraphicsItem的paint方法(自定义QGraphicsItem) 文章目录 qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphic…...

[Java]泛型(二)泛型方法

1.定义 在 Java 中&#xff0c;泛型方法是指在方法声明中使用泛型类型参数的一种方法。它使得方法能够处理不同类型的对象&#xff0c;而不需要为每种类型写多个方法&#xff0c;从而提高代码的重用性。 泛型方法与泛型类不同&#xff0c;泛型方法的类型参数仅仅存在于方法的…...

ProfibusDP主机与从机交互

ProfibusDP 主机SD2索要数据下发&#xff1a;68 08 F7 68 01 02 03 21 05 06 07 08 1C 1668&#xff1a;SD2 08&#xff1a;LE F7&#xff1a;LEr 68&#xff1a;SD2 01:目的地址 02&#xff1a;源地址 03:FC_CYCLIC_DATA_EXCHANGE功能码 21&#xff1a;数据地址 05,06,07,08&a…...

jQuery小游戏(二)

jQuery小游戏&#xff08;二&#xff09; 今天是新年的第二天&#xff0c;本人在这里祝大家&#xff0c;新年快乐&#xff0c;万事胜意&#x1f495; 紧接jQuery小游戏&#xff08;一&#xff09;的内容&#xff0c;我们开始继续往下咯&#x1f61c; 游戏中使用到的方法 key…...

【MQ】如何保证消息队列的高可用?

RocketMQ NameServer集群部署 Broker做了集群部署 主从模式 类型&#xff1a;同步复制、异步复制 主节点返回消息给客户端的时候是否需要同步从节点 Dledger&#xff1a;要求至少消息复制到半数以上的节点之后&#xff0c;才给客户端返回写入成功 slave定时从master同步数据…...

简易计算器(c++ 实现)

前言 本文将用 c 实现一个终端计算器&#xff1a; 能进行加减乘除、取余乘方运算读取命令行输入&#xff0c;输出计算结果当输入表达式存在语法错误时&#xff0c;报告错误&#xff0c;但程序应能继续运行当输出 ‘q’ 时&#xff0c;退出计算器 【简单演示】 【源码位置】…...

AI大模型开发原理篇-4:神经概率语言模型NPLM

神经概率语言模型&#xff08;NPLM&#xff09;概述 神经概率语言模型&#xff08;Neural Probabilistic Language Model, NPLM&#xff09; 是一种基于神经网络的语言建模方法&#xff0c;它将传统的语言模型和神经网络结合在一起&#xff0c;能够更好地捕捉语言中的复杂规律…...

SpringBoot 基础特性

SpringBoot 基础特性 SpringApplication 相关特性 自定义 banner 在主配置文件写 banner.txt 的地址 #也可以不写默认路径就是 banner.txt #从类路径下找 banner #类路径就是 编译的target 目录 还有导入的第三方类路径。 spring.banner.locationclasspath:banner.txt#控制…...

网站快速收录:提高页面加载速度的重要性

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/32.html 网站快速收录中&#xff0c;提高页面加载速度具有极其重要的意义。以下从多个方面详细阐述其重要性&#xff1a; 一、提升用户体验 减少用户等待时间&#xff1a;页面加载速度直接…...

如何使用formlinker,重构微软表单创建的数字生产力法则?

仅需三步&#xff1a;上传文件-下载文件-导入文件到微软表单 凌晨两点的格式炼狱&#xff1a;被浪费的300万小时人类创造力 剑桥大学的实验室曾捕捉到一组震撼数据&#xff1a;全球教育工作者每年花在调整试题格式上的时间&#xff0c;足够建造3座迪拜哈利法塔。当北京某高校的…...

从零搭建一个Vue3 + Typescript的脚手架——day3

3.项目拓展配置 (1).配置Pinia Pinia简介 Pinia 是 Vue.js 3 的状态管理库&#xff0c;它是一个轻量级、灵活、易于使用的状态管理库。Pinia 是 Vue.js 3 的官方状态管理库&#xff0c;它可以帮助开发者更好地管理应用的状态。Pinia 是一个开源项目&#xff0c;它有丰富的文档…...

Three.js实战项目02:vue3+three.js实现汽车展厅项目

文章目录 实战项目02项目预览项目创建初始化项目模型加载与展厅灯光加载汽车模型设置灯光材质设置完整项目下载实战项目02 项目预览 完整项目效果: 项目创建 创建项目: pnpm create vue安装包: pnpm add three@0.153.0 pnpm add gsap初始化项目 修改App.js代码&#x…...

Linux——网络(tcp)

文章目录 目录 文章目录 前言 一、TCP逻辑 1. 面向连接 三次握手&#xff08;建立连接&#xff09; 四次挥手&#xff08;关闭连接&#xff09; 2. 可靠性 3. 流量控制 4. 拥塞控制 5. 基于字节流 6. 全双工通信 7. 状态机 8. TCP头部结构 9. TCP的应用场景 二、编写tcp代码函数…...

Ubuntu Server 安装 XFCE4桌面

Ubuntu Server没有桌面环境&#xff0c;一些软件有桌面环境使用起来才更加方便&#xff0c;所以我尝试安装桌面环境。常用的桌面环境有&#xff1a;GNOME、KDE Plasma、XFCE4等。这里我选择安装XFCE4桌面环境&#xff0c;主要因为它是一个极轻量级的桌面环境&#xff0c;适合内…...

分享|通过Self-Instruct框架将语言模型与自生成指令对齐

结论 在大型 “指令调整” 语言模型依赖的人类编写指令数据存在数量、多样性和创造性局限&#xff0c; 从而阻碍模型通用性的背景下&#xff0c; Self - Instruct 框架&#xff0c; 通过 自动生成 并 筛选指令数据 微调预训练语言模型&#xff0c; 有效提升了其指令遵循能…...

指针空值——nullptr(C++11)——提升指针安全性的利器

C11引入的nullptr是对指针空值的正式支持&#xff0c;它提供了比传统NULL指针更加安全和明确的指针空值表示方式。在C语言中&#xff0c;指针操作是非常基础且常见的&#xff0c;而如何安全地处理指针空值&#xff0c;一直是开发者关注的重要问题。本文将详细讲解nullptr的引入…...

C++游戏开发

C 是游戏开发中广泛使用的编程语言&#xff0c;因其高性能、灵活性和对硬件的直接控制能力而备受青睐。以下是 C 游戏开发的一些关键点&#xff1a; 1. 游戏引擎 Unreal Engine&#xff1a;使用 C 作为主要编程语言&#xff0c;适合开发高质量 3D 游戏。Unity&#xff1a;虽然…...

【Docker】ubuntu中 Docker的使用

之前记录了 docker的安装 【环境配置】ubuntu中 Docker的安装&#xff1b; 本篇博客记录Dockerfile的示例&#xff0c;docker 的使用&#xff0c;包括镜像的构建、容器的启动、docker compose的使用等。   当安装好后&#xff0c;可查看docker的基本信息 docker info ## 查…...

Linux C openssl aes-128-cbc demo

openssl 各版本下载 https://openssl-library.org/source/old/index.html#include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <openssl/rand.h> #include <openssl/evp.h>#define AES_KEY_BITS 128 #define GCM_IV_SIZ…...

【卫星通信】链路预算方法

本文介绍卫星通信中的链路预算方法&#xff0c;应该也适用于地面通信场景。 更多内容请关注gzh【通信Online】 文章目录 下行链路预算卫星侧参数信道参数用户侧参数 上行链路预算链路预算计算示例 下行链路预算 卫星侧参数 令卫星侧天线数为 M t M_t Mt​&#xff0c;每根天线…...

【Elasticsearch】 索引模板 ignore_missing_component_templates

解释 ignore_missing_component_templates 配置 在Elasticsearch中&#xff0c;ignore_missing_component_templates 是一个配置选项&#xff0c;用于处理索引模板中引用的组件模板可能不存在的情况。当您创建一个索引模板时&#xff0c;可以指定一个或多个组件模板&#xff0…...

Github 2025-01-30 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…...

Linux 下注册分析(4)

系列文章目录 Linux 设备树 Linux 下注册分析&#xff08;1&#xff09; Linux 下注册分析&#xff08;2&#xff09; Linux 下注册分析&#xff08;3&#xff09; Linux 下注册分析&#xff08;4&#xff09; 文章目录 系列文章目录1、device_create简介device_createdevice_c…...

PhotoShop中JSX编辑器安装

1.使用ExtendScript Tookit CC编辑 1.安装 打开CEP Resource链接&#xff1a; CEP-Resources/ExtendScript-Toolkit at master Adobe-CEP/CEP-Resources (github.com) 将文件clone到本地或者下载到本地 点击AdobeExtendScriptToolKit_4_Ls22.exe安装&#xff0c;根据弹出的…...

目前市场主流的AI PC对于大模型本地部署的支持情况分析-Deepseek

以下是目前市场主流AI PC对**大模型本地部署支持情况**的综合分析&#xff0c;结合硬件能力、软件生态及厂商动态进行总结&#xff1a; --- ### **一、硬件配置与算力支持** 1. **核心处理器架构** - **异构计算方案&#xff08;CPUGPUNPU&#xff09;**&#xff1a;主流…...

51单片机开发:独立键盘实验

实验目的&#xff1a;按下键盘1时&#xff0c;点亮LED灯1。 键盘原理图如下图所示&#xff0c;可见&#xff0c;由于接GND&#xff0c;当键盘按下时&#xff0c;P3相应的端口为低电平。 键盘按下时会出现抖动&#xff0c;时间通常为5-10ms&#xff0c;代码中通过延时函数delay…...

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…...

STM32 TIM输入捕获 测量频率

输入捕获简介&#xff1a; IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff0c;当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数 每个高级定时器…...

python | OpenCV小记(一):cv2.imread(f) 读取图像操作(待更新)

python | OpenCV小记&#xff08;一&#xff09;&#xff1a;cv2.imread&#xff08;f&#xff09;读取图像操作 1. 为什么 [:, :, 0] 提取的是第一个通道&#xff08;B 通道&#xff09;&#xff1f;OpenCV 的通道存储格式索引操作 [:, :, 0] 的解释常见误解 1. 为什么 [:, :,…...

解析静态链接

文章目录 静态链接空间与地址分配相似段合并虚拟地址分配符号地址确定符号解析与重定位链接器优化重复代码消除函数链接级别静态库静态链接优缺点静态链接 一组目标文件经过链接器链接后形成的文件即可执行文件,如果没有动态库的加入,那么这个可执行文件被加载后无需再进行重…...

Ollama 运行从 ModelScope 下载的 GGUF 格式的模型

本文系统环境 Windows 10 Ollama 0.5.7 Ollama 是什么&#xff1f; Ollama 可以让你快速集成和部署本地 AI 模型。它支持各种不同的 AI 模型&#xff0c;并允许用户通过简单的 API 进行调用 Ollama 的安装 Ollama 官网 有其下载及安装方法&#xff0c;非常简便 但如果希…...

【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)

文章目录 【2025年最新版】Java JDK安装、环境配置教程 &#xff08;图文非常详细&#xff09;1. JDK介绍2. 下载 JDK3. 安装 JDK4. 配置环境变量5. 验证安装6. 创建并测试简单的 Java 程序6.1 创建 Java 程序&#xff1a;6.2 编译和运行程序&#xff1a;6.3 在显示或更改文件的…...