模型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来格式化和解析模型输人及输出的完整过程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言练习(31)

有5个学生,每个学生有3门课程的成绩,从键盘输入以上数据(包括学号、姓名、3门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件stud中。 设5名学生的学号、姓名和3门课程成绩如下&am…

【Block总结】DynamicFilter,动态滤波器降低计算复杂度,替换传统的MHSA|即插即用

论文信息 标题: FFT-based Dynamic Token Mixer for Vision 论文链接: https://arxiv.org/pdf/2303.03932 关键词: 深度学习、计算机视觉、对象检测、分割 GitHub链接: https://github.com/okojoalg/dfformer 创新点 本论文提出了一种新的标记混合器(token mix…

「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)

深度学习(DL)是现代人工智能(AI)的核心之一,但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用,深度学习经历了几乎一个世纪的不断探索与发展。今天,我们一起回顾深度学习的历史…

Axure PR 9 旋转效果 设计交互

大家好,我是大明同学。 这期内容,我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…

【外文原版书阅读】《机器学习前置知识》2.用看电影推荐的例子带你深入了解向量点积在机器学习的作用

目录 3.3 Where Are You Looking, Vector? The Dot Product 个人主页:Icomi 大家好,我是Icomi,本专栏是我阅读外文原版书《Before Machine Learning》对于文章中我认为能够增进线性代数与机器学习之间的理解的内容的一个输出,希望…

论文阅读(八):结构方程模型用于研究数量遗传学中的因果表型网络

1.论文链接:Structural Equation Models for Studying Causal Phenotype Networks in Quantitative Genetics 摘要: 表型性状可能在它们之间发挥因果作用。例如,农业物种的高产可能会增加某些疾病的易感性,相反,疾病的…

每日一题——序列化二叉树

序列化二叉树 BM39 序列化二叉树题目描述序列化反序列化 示例示例1示例2 解题思路序列化过程反序列化过程 代码实现代码说明复杂度分析总结 BM39 序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是将二叉树按照某种遍历方式…

JVM_程序计数器的作用、特点、线程私有、本地方法的概述

①. 程序计数器 ①. 作用 (是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令) ②. 特点(是线程私有的 、不会存在内存溢出) ③. 注意:在物理上实现程序计数器是在寄存器实现的,整个cpu中最快的一个执行单元 ④. 它是唯一一个在java虚拟机规…

Attention--人工智能领域的核心技术

1. Attention 的全称与基本概念 在人工智能(Artificial Intelligence,AI)领域,Attention 机制的全称是 Attention Mechanism(注意力机制)。它是一种能够动态分配计算资源,使模型在处理输入数据…

机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)

朴素贝叶斯模型 贝叶斯定理: 常见类型 算法流程 优缺点 集成学习算法 基本原理 常见方法 KNN(聚类模型) 算法性质: 核心原理: 算法流程 优缺点 matlab中的运用 朴素贝叶斯模型 朴素贝叶斯模型是基于贝叶斯…

智慧园区系统助力企业智能化升级实现管理效率与安全性全方位提升

内容概要 在当今数字化转型的浪潮中,企业面临着前所未有的挑战和机遇。智慧园区系统作为一种创新性解决方案,正在快速崛起,帮助企业实现全面的智能化升级。这套系统不仅仅是一个简单的软件工具,而是一个强大的综合管理平台&#…

【视频+图文详解】HTML基础4-html标签的基本使用

图文教程 html标签的基本使用 无序列表 作用&#xff1a;定义一个没有顺序的列表结构 由两个标签组成&#xff1a;<ul>以及<li>&#xff08;两个标签都属于容器级标签&#xff0c;其中ul只能嵌套li标签&#xff0c;但li标签能嵌套任何标签&#xff0c;甚至ul标…

电子电气架构 --- 在智能座舱基础上定义人机交互

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

SAP SD学习笔记27 - 请求计划(开票计划)之1 - 定期请求

上两章讲了贩卖契约&#xff08;框架协议&#xff09;的概要&#xff0c;以及贩卖契约中最为常用的 基本契约 - 数量契约和金额契约。 SAP SD学习笔记26 - 贩卖契约(框架协议)的概要&#xff0c;基本契约 - 数量契约_sap 框架协议-CSDN博客 SAP SD学习笔记27 - 贩卖契约(框架…

Ansible自动化运维实战--fetch、cron和group模块(5/8)

文章目录 一、fetch 模块1.1、功能1.2、常用参数1.3、测试1.4、注意事项 二、cron 模块2.1、功能2.2、常用参数2.3、注意事项 三、group模块3.1、功能3.2、常用参数3.3、例子3.4、注意事项 一、fetch 模块 1.1、功能 fetch 模块的主要功能是将远程主机上的文件复制到本地控制…

C++中常用的十大排序方法之1——冒泡排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之——冒泡排序的相关…

商密测评题库详解:商用密码应用安全性评估从业人员考核题库详细解析(8)

1. 重要领域网络和信息系统的范畴 题目 根据《商用密码应用安全性评估管理办法(试行)》,下列哪些属于重要领域网络和信息系统( )。 A. 基础信息网络 B. 面向社会服务的政务信息系统 C. 重要工业控制系统 D. 以上都是 答案 D 答案解析 依据《商用密码应用安全性评…

openssl 生成证书 windows导入证书

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

SpringBoot整合Swagger UI 用于提供接口可视化界面

目录 一、引入相关依赖 二、添加配置文件 三、测试 四、Swagger 相关注解 一、引入相关依赖 图像化依赖 Swagger UI 用于提供可视化界面&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactI…

Nuxt:利用public-ip这个npm包来获取公网IP

目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子&#xff1a; <template…