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

LangChain学习二:提示-实战(下半部分)

文章目录

  • 上一节内容:LangChain学习二:提示-实战(上半部分)
  • 学习目标:提示词中的示例选择器和输出解释器
  • 学习内容一:示例选择器
    • 1.1 LangChain自定义示例选择器
    • 1.2 实现自定义示例选择器
      • 1.2.1实战:定义一个类继BaseExampleSelector并且承实现方法
      • 1.2.2实战:使用示例选择器
    • 1.3 实现基于长度的选择器
    • 1.4 最大边际相关性示例选择器
    • 1.5 gram重叠
      • 1.5.1 创建示例集
      • 1.5.2 选择示例
        • 1.5.2.1 threshold=-1.0,示例排序、不排除任何示例
        • 1.5.2.2 threshold=0.0,`排除`具有与输入无ngram重叠的示例
        • 1.5.2.3 threshold大于0小于1意味着只有相似度大于 设置值的示例才会被选择
        • 1.5.2.4 threshold大于1,不会选择任何
    • 1.6 相似度
  • 学习内容二:输出解析器

上一节内容:LangChain学习二:提示-实战(上半部分)

LangChain学习二:提示-实战(上半部分)

学习目标:提示词中的示例选择器和输出解释器


  1. 示例选择器:在写提示词的时候给与少量的示例在前面,在上一节的最后提到,这一节细化说一下
  2. 输出解释器:语言模型输出文本。但是很多时候,你可能想要获得比文本更结构化的信息。这就是输出解析器的作用。

学习内容一:示例选择器

1.1 LangChain自定义示例选择器

自定义示例选择器它的英文名叫做few shot examples:就像我们教小朋友一样,比如教小朋友分类水果,先给他演示一下水果怎么分类的,红色的放哪一个框框,白色的放哪一个框框,然后在给它一个新的水果,小朋友根据你教的示范,就会自己去分类了

具体在上一节的2.5有介绍

在这里插入图片描述
在这里插入图片描述

1.2 实现自定义示例选择器

具体步骤如下

  • 定义一个类,继承BaseExampleSelector
  • 实现add_example方法,它接受一个示例并将其添加到该ExampleSelector中。
  • 实现select_examples方法,它接受输入变量(这些变量应为用户输入),并返回要在few-shot提示中使用的示例列表。

1.2.1实战:定义一个类继BaseExampleSelector并且承实现方法

from langchain.prompts.example_selector.base import BaseExampleSelector
from typing import Dict, List
import numpy as npclass CustomExampleSelector(BaseExampleSelector):def __init__(self, examples: List[Dict[str, str]]):self.examples = examplesdef add_example(self, example: Dict[str, str]) -> None:"""为密钥添加要存储的新示例。"""self.examples.append(example)def select_examples(self, input_variables: Dict[str, str]) -> List[dict]:"""根据输入选择要使用的示例。 你可以在这里写你自己的算法,我这里就表示随机从examples里拿两个示例,replace表示不会重复"""return np.random.choice(self.examples, size=2, replace=False)

1.2.2实战:使用示例选择器

 
examples = [{"foo": "1"},{"foo": "2"},{"foo": "3"}
]# 初始化示例选择器。
example_selector = CustomExampleSelector(examples)#选择示例
example_selector.select_examples({"foo": "foo"})
# -> array([{'foo': '2'}, {'foo': '3'}], dtype=object)# 将新示例添加到示例集
example_selector.add_example({"foo": "4"})
print(f"======查看现在有哪些示例\n{example_selector.examples}\n")
# -> [{'foo': '1'}, {'foo': '2'}, {'foo': '3'}, {'foo': '4'}]# 选择示例
llm_example=example_selector.select_examples({"foo": "foo"})
print(f"======选择示例\n{llm_example}\n")

在这里插入图片描述
在这里插入图片描述
因为这里选择写的是随机的,所以这里就是随机的找两条

1.3 实现基于长度的选择器

总长度是由max_length控制的,如果我们输入的长一些,就会少从examples 拿一些,输入短,则反之

from langchain import PromptTemplate, FewShotPromptTemplate# 首先,创建少数快照示例的列表。
from langchain.prompts import LengthBasedExampleSelectorexamples = [{"word": "开心", "antonym": "悲伤"},{"word": "高", "antonym": "低"},
]# 接下来,我们指定模板来格式化我们提供的示例。
# 为此,我们使用“PromptTemplate”类。
example_formatter_template = """
单词: {word}
反义词: {antonym}\n
"""
example_prompt = PromptTemplate(input_variables=["word", "antonym"],template=example_formatter_template,
)
#我们将使用' LengthBasedExampleSelector '来选择示例。
example_selector = LengthBasedExampleSelector(# 这些是可供选择的例子。examples=examples,#这是用于格式化示例的PromptTemplate。example_prompt=example_prompt,# 这是格式化示例的最大长度。# 长度由下面的get_text_length函数测量。max_length=25,
)
# 我们现在可以使用' example_selector '来创建' FewShotPromptTemplate '。
dynamic_prompt = FewShotPromptTemplate(# We provide an ExampleSelector instead of examples.example_selector=example_selector,example_prompt=example_prompt,prefix="给出每个输入的反义词",suffix="单词: {input}\n反义词:",input_variables=["input"],example_separator="",
)# We can now generate a prompt using the `format` method.
print(dynamic_prompt.format(input="大"))

在这里插入图片描述
这个是上一节举的例子,当然上一节没有提到现在的示例添加新的示例方法

#您也可以将示例添加到示例选择器中。
new_example = {"word": "大", "antonym": "小"}
dynamic_prompt.example_selector.add_example(new_example)
print(dynamic_prompt.format(input="多"))

在这里插入图片描述

1.4 最大边际相关性示例选择器

这种示例选择器基于与输入之间的边际相关性来选择示例。它计算每个示例与输入之间的相关性,并选择具有最高相关性的示例作为回答。

这种方法适用于输入和示例之间有很强相关性的情况,例如问答系统中的问题和答案。

这里我们要借助一个类MaxMarginalRelevanceExampleSelector

MaxMarginalRelevanceExampleSelector:基于哪些示例与输入最相似以及优化多样性的组合选择示例。

这里我们用m3e-base作为向量化引擎
下载

from modelscope.hub.snapshot_download import snapshot_downloadlocal_dir_root = "/root/autodl-tmp/models_from_modelscope"
snapshot_download('Jerry0/m3e-base', cache_dir=local_dir_root)
from langchain.prompts.example_selector import MaxMarginalRelevanceExampleSelector
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
embeddings = HuggingFaceEmbeddings(
model_name = "/root/autodl-tmp/models_from_modelscope/Jerry0/m3e-base",
model_kwargs = {'device': 'cuda'})
example_prompt = PromptTemplate(input_variables=["input", "output"],template="Input: {input}\nOutput: {output}",
)#这是许多创建反义词的假装任务的例子。
examples = [{"input": "开心", "output": "悲伤"},{"input": "发呆", "output": "兴奋"},{"input": "高", "output": "底"},{"input": "精力充沛的", "output": "无精打采"},{"input": "晴天", "output": "雨天"},{"input": "天上", "output": "地下"},
]example_selector = MaxMarginalRelevanceExampleSelector.from_examples(#这是可供选择的示例列表。examples, #这是用于生成用于测量语义相似性的嵌入的嵌入类。embeddings, #这是VectorStore类,用于存储嵌入并进行相似性搜索。FAISS, #这是要生成的示例数。k=2
)
mmr_prompt = FewShotPromptTemplate(#我们提供了ExampleSelector而不是示例。example_selector=example_selector,example_prompt=example_prompt,prefix="给出每个输入的反义词",suffix="Input: {adjective}\nOutput:", input_variables=["adjective"],
)# 输入是一种感觉,所以应该选择快乐/悲伤的例子作为第一个
print(mmr_prompt.format(adjective="快乐"))

在这里插入图片描述

1.5 gram重叠

其实是对1.4的补充和优化

我们需要借助一个NGramOverlapExampleSelector的类,然后根据ngram重叠得分选择排序示例.

该得分表示示例与输入的相似程度

ngram重叠得分是一个介于0.01.0之间的浮点数

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

  • 将阈值设置为0.0将排除具有与输入无ngram重叠的示例

1.5.1 创建示例集

pip install nltk

from langchain.prompts import PromptTemplate
from langchain.prompts.example_selector.ngram_overlap import NGramOverlapExampleSelector
from langchain.prompts import FewShotPromptTemplate, PromptTemplate# 创建模板
example_prompt = PromptTemplate(input_variables=["input", "output"],template="输入: {input}\n输出: {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."},
]

1.5.2 选择示例

1.5.2.1 threshold=-1.0,示例排序、不排除任何示例
example_prompt = PromptTemplate(input_variables=["input", "output"],template="Input: {input}\nOutput: {output}",
)
example_selector = NGramOverlapExampleSelector(# 以下是可供选择的示例。examples=examples, # 这是用于格式化示例的PromptTemplate。example_prompt=example_prompt, # 这是选择器停止的阈值。# 默认情况下,它设置为-1.0。threshold=-1.0,#对于负阈值:#Selector按ngram重叠分数对示例进行排序,不排除任何示例。#对于大于1.0的阈值:#选择器排除所有示例,并返回一个空列表。#对于等于0.0的阈值:#Selector根据ngram重叠分数对示例进行排序,#并且排除与输入没有ngram重叠的那些。
)
dynamic_prompt = FewShotPromptTemplate(# We provide an ExampleSelector instead of examples.example_selector=example_selector,example_prompt=example_prompt,prefix="提供每个Input的西班牙语翻译",suffix="Input: {sentence}\nOutput:", input_variables=["sentence"],
)
#一个与“Spot can run”有较大ngram重叠的示例输入
#与“我的狗叫”没有重叠
print(dynamic_prompt.format(sentence="Spot can run fast."))

在这里插入图片描述
让我们添加示例,再来一次

new_example = {"input": "Spot plays fetch.", "output": "Spot juega a buscar."}example_selector.add_example(new_example)
print(dynamic_prompt.format(sentence="Spot can run fast."))

在这里插入图片描述

我们可以看到 他确实进行了排序,我们的问题是,Spot跑的飞快

而且第一个是Spot可以跑,第二个看见Spot跑,第三个Spot在玩游戏
第四个:我的狗再叫

第三第四个很明显不符合,所以在最后

1.5.2.2 threshold=0.0,排除具有与输入无ngram重叠的示例
example_selector.threshold=0.0
print(dynamic_prompt.format(sentence="Spot can run fast."))

在这里插入图片描述
这里就把第三第四给排除了

1.5.2.3 threshold大于0小于1意味着只有相似度大于 设置值的示例才会被选择

example_selector.threshold=0.09
print(dynamic_prompt.format(sentence="Spot can play fetch."))

在这里插入图片描述

1.5.2.4 threshold大于1,不会选择任何

1.0 + 1e-9 的结果是 1.000000001,即在 1.0 的基础上增加了一个非常小的数 1e-9。这种写法通常是为了解决在计算机中浮点数运算可能产生的精度问题。

在这段代码中,将 example_selector.threshold 的值设为 1.0+1e-9,其实就是设置一个非常接近于 1.0,但又比它略大一点点的阈值。这样做可能会使得更多的示例被选择,因为在相似度计算中可能存在一些舍入误差或计算误差,导致某些本来应该被选择的示例未能被选中。

example_selector.threshold=1.0+1e-9
print(dynamic_prompt.format(sentence="Spot can play fetch."))

在这里插入图片描述
这里只会显示我们输入的,不会选择任何示例

1.6 相似度

  最大边际相关性 ExampleSelector 和 相似度 ExampleSelector 都是示例选择器,它们的区别在于选择示例的方法不同。

  相似度 ExampleSelector 则使用文本相似度度量来选择最相关的示例。它不仅考虑了输入和示例之间的相关性,还考虑了它们之间的相似度。具体而言,它计算输入和示例之间的相似度,然后选择与输入最相似的示例作为回答。这种方法适用于输入和示例之间没有直接的相关性,但它们在语义或形式上非常相似的情况,例如聊天机器人对话中的语句。

最大边际相关性 ExampleSelector:

  • 基于输入与示例之间的边际相关性来选择示例。
  • 计算每个示例与输入之间的相关性,并选择具有最高相关性的示例作为回答。
  • 适用于输入和示例之间有明显相关性的情况,例如问答系统中的问题和答案。

相似度 ExampleSelector:

  • 使用文本相似度度量来选择最相关的示例。
  • 不仅考虑输入和示例之间的相关性,还考虑它们之间的相似度。
  • 计算输入和示例之间的相似度,然后选择与输入最相似的示例作为回答。
  • 适用于输入和示例之间没有直接的相关性,但在语义或形式上非常相似的情况,例如聊天机器人对话中的语句。

总结:
最大边际相关性 ExampleSelector 关注输入与示例之间的相关性,而相似度 ExampleSelector 则重点考虑它们之间的相似度。两种选择器在选择示例时的侧重点不同,适用于不同的应用场景和数据特征。

说白了就是通过找到嵌入输入具有最大余弦相似度的示例,然后迭代地添加它们,同时筛选它们与已选择示例的接近程度来实现这一目的。

其实这里《LangChain学习一:模型-实战》中文本嵌入有介绍,这里我们在复习一下

  就是说从很多的示例集中,我们通过向量的方式去找到示例里和我们提的问题语义相近的内容作为示例,然后在给大模型,这里就不啰嗦介绍了,那一节里介绍的比较全

学习内容二:输出解析器

未完成待续,明晚继续,睡觉

相关文章:

LangChain学习二:提示-实战(下半部分)

文章目录 上一节内容:LangChain学习二:提示-实战(上半部分)学习目标:提示词中的示例选择器和输出解释器学习内容一:示例选择器1.1 LangChain自定义示例选择器1.2 实现自定义示例选择器1.2.1实战&#xff1a…...

Network 灰鸽宝典【目录】

目前已有文章 21 篇 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 服务配置环境部署GitNPM 浏览器编辑器系…...

基于SSM的实验室排课系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

Docker部署wordpress和Jenkins

准备机器: 192.168.58.151 (关闭防火墙和selinux) 安装好docker服务 (详细参照:http://t.csdnimg.cn/usG0s 中的国内源安装docker) 部署wordpress: 创建目录: [rootdocker ~]# mkdi…...

C语言—每日选择题—Day45

第一题 1. 以下选项中,对基本类型相同的指针变量不能进行运算的运算符是() A: B:- C: D: 答案及解析 A A:错误,指针不可以相加,因为指针相加可能发生越界&…...

音乐制作软件Studio One mac软件特点

Studio One mac是一款专业的音乐制作软件,由美国PreSonus公司开发。该软件提供了全面的音频编辑和混音功能,包括录制、编曲、合成、采样等多种工具,可用于制作各种类型的音乐,如流行音乐、电子音乐、摇滚乐等。 Studio One mac软件…...

华为OD机试 - 会议室占用时间(Java JS Python C)

题目描述 现有若干个会议,所有会议共享一个会议室,用数组表示各个会议的开始时间和结束时间,格式为: [[会议1开始时间, 会议1结束时间], [会议2开始时间, 会议2结束时间]] 请计算会议室占用时间段。 输入描述 第一行输入一个整数 n,表示会议数量 之后输入n行,每行两个…...

Excel COUNT类函数使用

目录 一. COUNT二. COUNTA三. COUNTBLANK四. COUNTIF五. COUNTIFS 一. COUNT ⏹用于计算指定范围内包含数字的单元格数量。 基本语法 COUNT(value1, [value2], ...)✅统计A2到A7所有数字单元格的数量 ✅统计A2到A7,B2到B7的所有数字单元格的数量 二. COUNTA ⏹计…...

刷题学习记录(文件上传)

[GXYCTF 2019]BabyUpload 知识点&#xff1a;文件上传.htaccessMIME绕过 题目直接给题目标签提示文件上传的类型 思路&#xff1a;先上传.htaccess文件&#xff0c;在上传木马文件&#xff0c;最后蚁剑连接 上传.htaccess文件 再上传一个没有<?的shell 但是要把image/pn…...

接口管理——Swagger

Swagger是一个用于设计、构建和文档化API的工具集。它包括一系列工具&#xff0c;如Swagger Editor&#xff08;用于编辑Swagger规范&#xff09;、Swagger UI&#xff08;用于可视化API文档&#xff09;和Swagger Codegen&#xff08;用于根据API定义生成客户端库、server stu…...

基于Python+WaveNet+MFCC+Tensorflow智能方言分类—深度学习算法应用(含全部工程源码)(三)

目录 前言引言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建1&#xff09;定义模型结构2&#xff09;优化损失函数 3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存3&#xff09;映射保存 相关其它博客工程源代码下载其它资料下载…...

(第5天)进阶 RHEL 7 安装单机 Oracle 19C NON-CDB 数据库

进阶 RHEL 7 安装单机 Oracle 19C NON-CDB 数据库(第5天) 真快,实战第 5 天了,我们来讲讲 19C 的数据库安装吧!19C 是未来几年 Oracle 数据库的大趋势,同样的作为长期稳定版,11GR2 在 2020 年 10 月份官方就宣布停止 Support 了,19C 将成为新的长期稳定版,并持续支持…...

AI自动生成代码工具

AI自动生成代码工具是一种利用人工智能技术来辅助或自动化软件开发过程中的编码任务的工具。这些工具使用机器学习和自然语言处理等技术&#xff0c;根据开发者的需求生成相应的源代码。以下是一些常见的AI自动生成代码工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有…...

jmeter和postman的对比

1.创建接口用例集&#xff08;没区别&#xff09; Postman是Collections&#xff0c;Jmeter是线程组&#xff0c;没什么区别。 2.步骤的实现&#xff08;有区别&#xff09; Postman和jmeter都是创建http请求 区别1&#xff1a;postman请求的请求URL是一个整体&#xff0c;j…...

深度学习在人体动作识别领域的应用:开源工具、数据集资源及趋动云GPU算力不可或缺

人体动作识别检测是一种通过使用计算机视觉和深度学习技术&#xff0c;对人体姿态和动作进行实时监测和分析的技术。该技术旨在从图像或视频中提取有关人体姿态、动作和行为的信息&#xff0c;以便更深入地识别和理解人的活动。 人体动作识别检测的基本步骤包括&#xff1a; 数…...

科技提升安全,基于YOLOv6开发构建商超扶梯场景下行人安全行为姿态检测识别系统

在商超等人流量较为密集的场景下经常会报道出现一些行人在扶梯上摔倒、受伤等问题&#xff0c;随着AI技术的快速发展与不断普及&#xff0c;越来越多的商超、地铁等场景开始加装专用的安全检测预警系统&#xff0c;核心工作原理即使AI模型与摄像头图像视频流的实时计算&#xf…...

二叉树的最大深度

问题描述&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1…...

nginx配置正向代理支持https

操作系统版本&#xff1a; Alibaba Cloud Linux 3.2104 LTS 64位 nginx版本&#xff1a; nginx-1.25.3 1. 下载软件 切换目录 cd /server wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.1解压 tar -zxvf nginx-1.25.3.tar.gz 1.2切换到源码所在目录…...

奥比中光 Femto Bolt相机ROS配置

机械臂手眼标定详解 作者&#xff1a; Herman Ye Auromix 测试环境&#xff1a; Ubuntu20.04/22.04 、ROS1 Noetic/ROS2 Humble、X86 PC/Jetson Orin、Kinect DK/Femto Bolt 更新日期&#xff1a; 2023/12/12 注1&#xff1a; Auromix 是一个机器人爱好者开源组织。 注2&#…...

scala表达式

1.8 表达式&#xff08;重点&#xff09; # 语句(statement)&#xff1a;一段可执行的代码# 表达式(expression)&#xff1a;一段可以被求值的代码&#xff0c;在Scala中一切都是表达式 - 表达式一般是一个语句块&#xff0c;可包含一条或者多条语句&#xff0c;多条语句使用“…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...