OpenAI ChatGPT API 文档之 Embedding
译者注:
Embedding 直接翻译为嵌入似乎不太恰当,于是问了一下 ChatGPT,它的回复如下:
在自然语言处理和机器学习领域,"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间(embedding space),而生成的向量则称为嵌入向量(embedding vector)或向量嵌入(vector embedding)。
嵌入向量可以捕获单词、短语或文本的语义信息,使得它们可以在数学上进行比较和计算。这种比较和计算在自然语言处理和机器学习中经常被用于各种任务,例如文本分类、语义搜索、词语相似性计算等。
在中文语境下,"embeddings" 通常被翻译为 "词向量" 或者 "向量表示"。这些翻译强调了嵌入向量的特点,即将词汇转换成向量,并表示为嵌入空间中的点。
在本文档中,Embedding 表示名词时大部多没有翻译直接用了英文,embedding vector 翻译为了“嵌入向量”,表示动词时翻译为了“向量表示”,翻译的比较仓促,如果有不恰当的地方,欢迎评论指正。
本篇文档翻译时间为 20230403,请注意时效性。
其他已翻译文档链接:
- IvyLee:OpenAI ChatGPT API 指南之 Chat Completion Beta 版
- IvyLee:OpenAI ChatGPT API 指南之语音转文字 Beta 版
- IvyLee:OpenAI ChatGPT API 文档之生产最佳实践
- IvyLee:OpenAI ChatGPT API 文档之 Embedding
- IvyLee:OpenAI ChatGPT API 文档之 Fine-tuning(微调)
什么是 Embedding?
OpenAI 中的文本 Embedding 衡量文本字符串之间的相关性。Embedding 通常用于以下场景:
- 搜索(结果按查询字符串的相关性进行排序)
- 聚类(将文本字符串按相似性分组)
- 推荐(推荐具有相关文本字符串的项目)
- 异常检测(识别相关性较小的异常值)
- 多样性测量(分析相似度分布)
- 分类(文本字符串按其最相似的标签进行分类)
Embedding 是一个浮点数向量(列表)。两个向量之间的距离用于测量它们之间的相关性。较小距离表示高相关性,较大距离表示低相关性。
请访问我们的定价页面了解 Embedding 的定价。请求的计费基于发送的输入中的 token 数。
要了解 Embedding 的实际应用,请查看我们的代码示例(浏览示例)
- 分类
- 主题聚类
- 搜索
- 推荐
如何获取 Embedding
要获取 Embedding,将文本字符串和选定的 Embedding 模型 ID(例如 text-embedding-ada-002
)发送到 Embedding API 端点。获得的响应中将包含一个 Embedding,你可以提取、保存和使用。
请求示例:
response = openai.Embedding.create(input="Your text string goes here",model="text-embedding-ada-002"
)
embeddings = response['data'][0]['embedding']
响应示例:
{"data": [{"embedding": [-0.006929283495992422,-0.005336422007530928,...-4.547132266452536e-05,-0.024047505110502243],"index": 0,"object": "embedding"}],"model": "text-embedding-ada-002","object": "list","usage": {"prompt_tokens": 5,"total_tokens": 5}
}
在 OpenAI Cookbook 中可以找到更多 Python 代码示例。
使用 OpenAI Embedding 时,请注意其限制和风险。
Embedding 模型
OpenAI 提供了一个第二代 Embedding 模型(在模型 ID 中标记为 -002
)和 16 个第一代模型(在模型 ID 中标记为 -001
)。
几乎所有用例我们都推荐使用 text-embedding-ada-002
。这一模型更好、更便宜、更简单易用。相关信息可以阅读博客文章中的公告。
模型版本 | 分词器 | 最大输入 token 数 | 知识截断日期 |
---|---|---|---|
V2 | cl100k_base | 8191 | Sep 2021 |
V1 | GPT-2/GPT-3 | 2046 | Aug 2020 |
按输入 token 计费,费率为每 1000 个 token 0.0004 美元,约为每美元 3000 页(假设每页约 800 个 token):
模型 | 每美元大约页数 | 在 BEIR 搜索评估中的示例性能 |
---|---|---|
text-embedding-ada-002 | 3000 | 53.9 |
davinci-001 | 6 | 52.8 |
curie-001 | 60 | 50.9 |
babbage-001 | 240 | 50.4 |
ada-001 | 300 | 49.0 |
第二代模型
模型名称 | 分词器 | 最大输入 token 数 | 输出维度 |
---|---|---|---|
text-embedding-ada-002 | cl100k_base | 8191 | 1536 |
第一代模型(不推荐使用)
所有第一代模型(以 -001
结尾的模型)均使用 GPT-3 分词器,最大输入为 2046 个 token。
第一代 Embedding 由五种不同的模型系列生成,针对三种不同的任务进行调整:文本搜索、文本相似度和代码搜索。其中搜索模型都有两个:一个用于短查询,一个用于长文档。每个系列包括不同质量和速度的四个模型:
模型 | 输出维度 |
---|---|
Ada | 1024 |
Babbage | 2048 |
Curie | 4096 |
Davinci | 12288 |
Davinci 是能力最强的,但比起其他模型来,更慢更昂贵。Ada 能力最弱,但明显更快更便宜。
相似性模型
相似性模型最擅长捕捉文本之间的语义相似性。
使用场景 | 可用模型 |
---|---|
Clustering, regression, anomaly detection, visualization | text-similarity-ada-001 text-similarity-babbage-001 text-similarity-curie-001 text-similarity-davinci-001 |
文本搜索模型
文本搜索模型有助于衡量哪些长文档与短搜索查询最相关。使用两种模型:一种用于将搜索查询向量表示,另一种用于将要排序的文档向量表示。与查询 Embedding 最接近的文档 Embedding 应该是最相关的。
使用场景 | 可用模型 |
---|---|
Search, context relevance, information retrieval | text-search-ada-doc-001 text-search-ada-query-001 text-search-babbage-doc-001 text-search-babbage-query-001 text-search-curie-doc-001 text-search-curie-query-001 text-search-davinci-doc-001 text-search-davinci-query-001 |
代码搜索模型
与搜索模型一样,有两种类型:一种用于向量表示自然语言搜索查询,另一种用于向量表示代码片段以进行检索。
使用场景 | 可用模型 |
---|---|
Code search and relevance | code-search-ada-code-001 code-search-ada-text-001 code-search-babbage-code-001 code-search-babbage-text-001 |
对于-001
文本 Embedding(不是-002
,也不是代码 Embedding),建议将输入中的换行符(\n
)替换为一个空格,因为我们发现存在换行符时,结果会更差。
使用场景
这里展示了一些典型的使用场景,我们将在以下示例中使用亚马逊美食评论数据集。
获取 Embedding
该数据集包含截至 2012 年 10 月,亚马逊用户留下的共计 568454 条食品评论。我们将使用最近的 1000 条评论作为示例。这些评论是用英文撰写的,倾向有积极有消极。每个评论都有一个产品 ID、用户 ID、评分(SCORE)、评论标题(SUMMARY)和评论正文(TEXT)。例如:
PRODUCT ID | USER ID | SCORE | SUMMARY | TEXT |
---|---|---|---|---|
B001E4KFG0 | A3SGXH7AUHU8GW | 5 | Good Quality Dog Food | I have bought several of the Vitality canned... |
B00813GRG4 | A1D87F6ZCVE5NK | 1 | Not as Advertised | Product arrived labeled as Jumbo Salted Peanut... |
我们把评论摘要和评论文本合并为一个组合文本。模型将对这一组合文本进行编码,输出一个向量 Embedding。
Obtain_dataset.ipynb
def get_embedding(text, model="text-embedding-ada-002"):text = text.replace("\\n", " ")return openai.Embedding.create(input = [text], model=model)['data'][0]['embedding']df['ada_embedding'] = df.combined.apply(lambda x: get_embedding(x, model='text-embedding-ada-002'))
df.to_csv('output/embedded_1k_reviews.csv', index=False)
要从已保存的文件中加载数据,可以运行以下命令:
import pandas as pddf = pd.read_csv('output/embedded_1k_reviews.csv')
df['ada_embedding'] = df.ada_embedding.apply(eval).apply(np.array)
二维数据可视化
Visualizing_embeddings_in_2D.ipynb
Embedding 的大小随着底层模型的复杂性而变化。为了可视化这些高维数据,我们使用 t-SNE 算法将数据转换为二维数据。
根据评价者所给出的星级评分来给评论着色:
- 1星:红色
- 2星:橙色
- 3星:金色
- 4星:青绿色
- 5星:深绿色
可视化似乎产生了大约 3 个集群,其中一个集群的大部分都是负面评论。
import pandas as pd
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import matplotlibdf = pd.read_csv('output/embedded_1k_reviews.csv')
matrix = df.ada_embedding.apply(eval).to_list()# Create a t-SNE model and transform the data
tsne = TSNE(n_components=2, perplexity=15, random_state=42, init='random', learning_rate=200)
vis_dims = tsne.fit_transform(matrix)colors = ["red", "darkorange", "gold", "turquiose", "darkgreen"]
x = [x for x,y in vis_dims]
y = [y for x,y in vis_dims]
color_indices = df.Score.values - 1colormap = matplotlib.colors.ListedColormap(colors)
plt.scatter(x, y, c=color_indices, cmap=colormap, alpha=0.3)
plt.title("Amazon ratings visualized in language using t-SNE")
将 Embedding 用作 ML 算法的文本特征编码器
Regression_using_embeddings.ipynb
Embedding 可以被用作机器学习模型中的通用自由文本特征编码器。如果一些相关输入是自由文本,将 Embedding 加入模型会提高机器学习模型的性能。Embedding 也可以被用作机器学习模型中的分类特征编码器。如果分类变量的名称有意义且数量众多,比如“工作职称”,这将会增加最大的价值。相似性 Embedding 通常比搜索 Embedding 在这个任务上表现更好。
我们观察到向量表示通常都非常丰富和信息密集。使用 SVD 或 PCA 将输入的维度降低 10%,通常会导致特定任务的下游性能变差。
这段代码将数据分为训练集和测试集,将用于以下两个案例,即回归和分类。
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(list(df.ada_embedding.values),df.Score,test_size = 0.2,random_state=42
)
使用 Embedding 特征进行回归
Embedding 提供了一种优雅的方法来预测数值。在这个例子中,我们基于评论文本预测评论者的星级评分。由于 Embedding 内包含的语义信息很高,即使只有很少的评论,预测结果也很不错。
我们假设分数是在 1 到 5 之间的连续变量,允许算法预测浮点数值。机器学习算法通过最小化预测值与真实分数之间的距离,实现了平均绝对误差为 0.39,这意味着还不到半个星级。
from sklearn.ensemble import RandomForestRegressorrfr = RandomForestRegressor(n_estimators=100)
rfr.fit(X_train, y_train)
preds = rfr.predict(X_test)
使用 Embedding 特征进行分类
使用 Embedding 进行分类.ipynb
这次,不是让算法预测 1 到 5 之间的任意值,而是尝试将评价的精确星级分类为 5 个 bucket,从 1 星到 5 星。
经过训练后,模型可以学习到更好地预测 1 星和 5 星的评论,因为这两者情感表达更加极端,对于情感比较微妙的评论(2-4 星),可能学习效果较差。
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_scoreclf = RandomForestClassifier(n_estimators=100)
clf.fit(X_train, y_train)
preds = clf.predict(X_test)
零样本分类
使用 Embedding 进行零样本分类.ipynb
我们可以使用 Embedding 进行零样本分类,无需任何标记的训练数据。对于每个类别,我们将类别名称或类别的简短描述进行向量表示。要以零样本的方式对一些新文本进行分类,只需要将新文本的 Embedding 与所有类别 Embedding 进行比较,预测具有最高相似度的类别。
from openai.embeddings_utils import cosine_similarity, get_embeddingdf= df[df.Score!=3]
df['sentiment'] = df.Score.replace({1:'negative', 2:'negative', 4:'positive', 5:'positive'})labels = ['negative', 'positive']
label_embeddings = [get_embedding(label, model=model) for label in labels]def label_score(review_embedding, label_embeddings):return cosine_similarity(review_embedding, label_embeddings[1]) - cosine_similarity(review_embedding, label_embeddings[0])prediction = 'positive' if label_score('Sample Review', label_embeddings) > 0 else 'negative'
获取用户和产品的 Embedding 用于冷启动推荐
User_and_product_embeddings.ipynb
可以通过对某一用户的所有评论进行平均来获得该用户的 Embedding,通过对有关某产品的所有评论进行平均来获得该产品的 Embedding。为了展示这种方法的实用性,我们使用了包含 50k 个评论的子集以覆盖更多用户和产品的评论。
我们在单独的测试集上评估这些 Embedding 的有用性,将用户和产品 Embedding 的相似性绘制为评分的函数。有趣的是,基于这种方法,在用户收到产品之前,我们就可以预测他们是否会喜欢该产品,获得比随机预测更好的结果。
user_embeddings = df.groupby('UserId').ada_embedding.apply(np.mean)
prod_embeddings = df.groupby('ProductId').ada_embedding.apply(np.mean)
聚类
聚类.ipynb
聚类是理解大量文本数据的一种方法。Embedding 对于此任务很有用,因为它们提供每个文本的语义有意义的向量表示。因此,在无监督的方式下,聚类将揭示数据集中的隐藏分组。
在此示例中,我们发现四个不同的聚类:一个关注狗粮,一个关注负面评论,两个关注正面评论。
import numpy as np
from sklearn.cluster import KMeansmatrix = np.vstack(df.ada_embedding.values)
n_clusters = 4kmeans = KMeans(n_clusters = n_clusters, init='k-means++', random_state=42)
kmeans.fit(matrix)
df['Cluster'] = kmeans.labels_
使用 Embedding 进行文本搜索
使用 Embedding 进行语义文本搜索.ipynb
为了检索出最相关的文档,我们使用查询嵌入向量和文档嵌入向量之间的余弦相似度,返回得分最高的文档。
from openai.embeddings_utils import get_embedding, cosine_similaritydef search_reviews(df, product_description, n=3, pprint=True):embedding = get_embedding(product_description, model='text-embedding-ada-002')df['similarities'] = df.ada_embedding.apply(lambda x: cosine_similarity(x, embedding))res = df.sort_values('similarities', ascending=False).head(n)return resres = search_reviews(df, 'delicious beans', n=3)
使用 Embedding 代码搜索
Code_search.ipynb
代码搜索类似于基于 Embedding 的文本搜索。我们提供了一种从给定代码库的所有 Python 文件中提取 Python 函数的方法。然后每个函数都通过 text-embedding-ada-002
模型进行索引。
为了执行代码搜索,我们使用相同的模型以自然语言将查询进行向量表示。然后,计算查询结果 Embedding 和每个函数 Embedding 之间的余弦相似度。余弦相似度最高的结果最相关。
from openai.embeddings_utils import get_embedding, cosine_similaritydf['code_embedding'] = df['code'].apply(lambda x: get_embedding(x, model='text-embedding-ada-002'))def search_functions(df, code_query, n=3, pprint=True, n_lines=7):embedding = get_embedding(code_query, model='text-embedding-ada-002')df['similarities'] = df.code_embedding.apply(lambda x: cosine_similarity(x, embedding))res = df.sort_values('similarities', ascending=False).head(n)return res
res = search_functions(df, 'Completions API tests', n=3)
使用 Embedding 进行推荐
Recommendation_using_embeddings.ipynb
因为嵌入向量之间的距离越短,表示它们之间的相似性越大,所以 Embedding 可以用于推荐系统。
下面我们展示一个基本的推荐系统。它接受一个字符串列表和一个 source 字符串,计算它们的嵌入向量,然后返回一个排序列表,从最相似到最不相似。上面链接的 Notebook 文件中,应用了这个函数的一个版本来处理 AG 新闻数据集(采样到 2000 个新闻文章描述),返回与任何给定 source 文章最相似的前 5 篇文章。
def recommendations_from_strings(strings: List[str],index_of_source_string: int,model="text-embedding-ada-002",
) -> List[int]:"""Return nearest neighbors of a given string."""# get embeddings for all stringsembeddings = [embedding_from_string(string, model=model) for string in strings]# get the embedding of the source stringquery_embedding = embeddings[index_of_source_string]# get distances between the source embedding and other embeddings (function from embeddings_utils.py)distances = distances_from_embeddings(query_embedding, embeddings, distance_metric="cosine")# get indices of nearest neighbors (function from embeddings_utils.py)indices_of_nearest_neighbors = indices_of_nearest_neighbors_from_distances(distances)return indices_of_nearest_neighbors
限制和风险
我们的 Embedding 模型在某些情况下可能不可靠或存在社会风险,并且在没有缓解措施的情况下可能会造成伤害。
社会偏见
限制:模型可能存在某些社会偏见,比如对某些群体的刻板印象或负面情绪。
我们通过运行 SEAT(May et al,2019)和 Winogender(Rudinger et al,2018)基准测试发现了模型存在偏见的证据。这些基准测试共包含 7 个,衡量模型在应用于性别化名称、国家和地区名称和一些刻板印象时是否包含隐含的偏见。
例如,我们发现我们的模型更强烈地将(a)欧洲裔美国人的名字与非洲裔美国人的名字相比,更容易与积极情感联系在一起,以及(b)将负面刻板印象与黑人女性联系在一起。
这些基准测试在多个方面存在限制:(a)它们可能不适用于你特定的使用场景,(b)它们只测试了可能的社会偏见的极小部分。
这些测试只是初步的,我们建议你运行针对自己特定用例的测试。这些结果应被视为该现象存在的证据,而不是针对你的用例的确定性描述。更多详细信息和指导,请参阅我们的使用政策。
如果你有任何问题,请通过聊天联系我们的支持团队。
缺乏对近期事件的认知
限制:模型缺乏对 2020 年 8 月之后发生事件的了解。
我们模型的训练数据,只包含 2020 年 8 月之前的现实世界事件信息。如果你依赖于表示近期事件的模型,那么我们的模型可能会表现欠佳。
常见问题
如何在 Embedding 之前知道一个字符串有多少个 token?
在 Python 中,你可以使用 OpenAI 的分词器 tiktoken 将字符串拆分为 token。
示例代码:
import tiktokendef num_tokens_from_string(string: str, encoding_name: str) -> int:"""Returns the number of tokens in a text string."""encoding = tiktoken.get_encoding(encoding_name)num_tokens = len(encoding.encode(string))return num_tokensnum_tokens_from_string("tiktoken is great!", "cl100k_base")
对于像 text-embedding-ada-002
这样的第二代 Embedding 模型,请使用 cl100k_base
编码。
更多细节和示例代码在 OpenAI Cookbook 指南如何使用 tiktoken 计算 token 数中。
如何快速检索 K 个最近的嵌入向量?
为了快速搜索许多向量,我们建议使用向量数据库。你可以在 GitHub 上的 OpenAI Cookbook 中找到使用向量数据库和 OpenAI API 的示例。
向量数据库选项包括:
- Pinecone,完全托管的向量数据库
- Weaviate,开源向量搜索引擎
- Redis,向量数据库
- Qdrant,向量搜索引擎
- Milvus,用于可扩展相似性搜索的向量数据库
- Chroma,开源的嵌入向量存储
我应该使用哪种距离函数?
我们建议使用余弦相似度。距离函数的选择通常不太重要。
OpenAI Embedding 已标准化为长度 1,这意味着:
- 余弦相似度可以使用点积更快地计算
- 余弦相似度和欧几里得距离将产生相同的排名
我能在网上分享我的 Embedding 吗?
客户有模型输入和输出的所有权,对于 Embedding 也一样。你有责任确保你输入到 API 的内容不违反任何适用的法律或我们的《使用条款》。
相关文章:
OpenAI ChatGPT API 文档之 Embedding
译者注: Embedding 直接翻译为嵌入似乎不太恰当,于是问了一下 ChatGPT,它的回复如下: 在自然语言处理和机器学习领域,"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称…...
Java常用类(二)
好久不见,因工作原因,好久没发文了,OldWang 回来了,持续更新Java内容!⭐ 不可变和可变字符序列使用陷阱⭐ 时间处理相关类⭐ Date 时间类(java.util.Date)⭐ DateFormat 类和 SimpleDateFormat 类⭐ Calendar 日历类 ⭐…...
Java获取给定月份的前N个月份和前N个季度
描述: 在项目开发过程中,遇到这样一个需求,即:给定某一月份,得到该月份前面的几个月份以及前面的几个季度。例如:给定2023-09,获取该月份前面的前3个月,即2023-08、2023-07、2023-0…...
网页资源加载过程
网页资源加载是指在浏览器中访问一个网页时,浏览器如何获取和显示网页内容的过程。这个过程通常分为以下几个步骤: DNS 解析: 当用户在浏览器中输入一个网址(例如,https://www.example.com),浏览…...
使用git config --global设置用户名和邮件,以及git config的全局和局部配置
文章目录 1. 文章引言2. 全局配置2.1 命令方式2.2 配置文件方式 3. 局部配置3.1 命令方式3.2 配置文件方式 4. 总结 1. 文章引言 我们为什么要设置设置用户名和邮件? 我们在注册github,gitlab等时,一般使用用户名或邮箱: 这个用户…...
【C语言】21-指针-3
目录 1. 指针数组1.1 什么是指针数组1.2 如何定义指针数组1.3 如何使用指针数组2. 多重指针2.1 二重指针的定义2.2 二重指针的初始化与赋值2.3 二重指针的使用3. 指针常量、常量指针、指向常量的常指针3.1 概念3.2 const pointer3.3 pointer to a constant3.3.1 (pointer to a …...
解决craco启动react项目卡死在Starting the development server的问题
现象: 原因:craco.config.ts配置文件有问题 经过排查发现Dev开发模式下不能有splitChunk的配置, 解决办法: 加一个生产模式的判断,开发模式不加载splitChunk的配置,仅在生产模式才加载 判断条件代码&#…...
常见的密码学算法都有哪些?
密码学算法是用于保护信息安全的数学方法和技术。它们可以分为多个类别,包括对称加密、非对称加密、哈希函数和数字签名等。以下是一些常见的密码学算法: 1、对称加密算法: AES(高级加密标准):一种广泛使…...
云安全【阿里云ECS攻防】
关于VPC的概念还请看:记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色,那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候ÿ…...
TBSS数据分析
tbss分析基本流程: 步骤一,指标解算:求解出FA,MD,AD,RD指标 #!/bin/bash #基于体素的形态学分析VBA path/media/kui/Passport5T/DATA_help/TBSS/row_data mkdir ${path}/Results_DTI_tbss mkdir ${path}/R…...
【单调队列】 239. 滑动窗口最大值
239. 滑动窗口最大值 解题思路 计算每一个滑动窗口的最大值 关键在于借助单调队列实现窗口对于单调队列 尾部添加元素 头部删除元素添加元素操作:从尾部开始循环对比 删除比当前元素小的元素获取最大值元素 直接获取头部元素删除元素操作 直接删除头部元素 class…...
Spring实例化源码解析之ComponentScanAnnotationParser(四)
上一章我们分析了ConfigurationClassParser,配置类的解析源码分析。在ComponentScans和ComponentScan注解修饰的候选配置类的解析过程中,我们需要深入的了解一下ComponentScanAnnotationParser的parse执行流程,SpringBoot启动类为什么这么写&…...
MySQL - 外键(foreign key)约束的作用和使用
什么是外键约束? 外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。 外键约束是用于建立两个表之间关系的一种约束,它定义了一个表中的列与另一个表中的列之间的关系。外键约束可以保证数据的完整性和一致性…...
前端开发之服务器的基本概念与初识Ajax
1,服务器的基本概念与初识Ajax 1.1 URL地址的组成部分 1.2 客户端与服务器的通信过程 1.3 网页中如何请求数据 1.4 $.get()函数 1.4.1 $.get()函数的语法 // jQuery 中 $.get() 函数的功能单一,专门用来发起 get 请求,从而将服务器上的资源…...
数据结构排序算法---八大排序复杂度及代码实现
文章目录 一、冒泡排序代码实现 二、直接插入排序代码实现 三、希尔排序代码实现 四、选择排序代码实现 五、堆排序代码实现 六、快速排序代码实现 七、归并排序代码实现 八、计数排序代码实现 稳定性:相同的数据排序后,相对位置是否发生改变 一、冒泡排…...
GMS之Launcher中去除默认Search或替换为Chrome Search
将Launcher中搜索框去除 将FeatureFlags.java文件中的QSB_ON_FIRST_SCREEN变量修改为false \system\vendor\mediatek\proprietary\packages\apps\Launcher3\src\com\android\launcher3\config\FeatureFlags.java/*** Defines a set of flags used to control various launche…...
@DateTimeFormat 和 @JsonFormat 的详细研究
关于这两个时间转化注解,先说结论 一、介绍 1、DateTimeFormat DateTimeFormat 并不会根据得到其属性 pattern 把前端传入的数据转换成自己想要的格式,而是将前端的String类型数据封装到Date类型;其次它的 pattern 属性是用来规范前端传入…...
nodejs基于Vue.js健身体育器材用品商城购物网97794
管理员端的功能主要是开放给系统的管理人员使用,能够对用户的信息进行管理,包括对用户、健身器材、器材类型、系统和订单进行查看,修改和删除、新增等,对系统整体运行情况进行了解。用户的功能主要是对个人账号和密码进行更新信息…...
C#WPF框架Microsoft.Toolkit.MvvM应用实例
本文实例演示C#WPF框架Microsoft.Toolkit.MvvM应用 目录 一、MVVM概述 二、MVVMLight概述 三、使用Microsoft.Toolkit.Mvvm框架 一、MVVM概述 MVVM概述MVVM是Model-View-ViewModel的简写,主要目的是为了解耦视图(View)和模型(Model)。...
蓝桥杯每日一题2023.9.27
4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量,店,花,酒的数量,对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店,j朵花,k单位酒的集合,…...
Redis与分布式-主从复制
接上文 常用中间件-OAuth2 1.主从复制 启动两个redis服务器。 修改第一个服务器地址 修改第二个redis 然后分别启动 redis-server.exe redis.windows.conf) 查看当前服务器的主从状态,打开客户端:输入info replication命令来查看当前的主从状态&am…...
QT pyside2 线程嵌套子线程 实现开始运行和停止运行
文章目录 前言为什么要使用多线程 一、单个线程实现按钮方法的执行二、线程嵌套多个子线程实现按钮方法的执行三、QT GUI常用代码3.1 多线程取出队列任务循环执行,无停止3.2 将某个方法放在线程中执行3.3 QT pyside2 tableWidget 清除日志3.4 退出整个GUI程序(杀死进…...
江西广电会展集团总经理李悦一行莅临拓世科技集团调研参观,科技璀璨AIGC掀新潮
在江西这片充满活力的土地上,数字经济如潮水般涌动,会展文化与科技的完美结合,正如新时代的璀璨繁星照亮夜空,更预示着一场AIGC创新的壮丽篇章即将展开。作为拓世科技集团的老朋友,江西广电多位领导多次莅临拓世科技集…...
【RabbitMQ实战】06 RabbitMQ配置
一、概述 一般情况下,可以使用默认的内建配置来有效地运行RabbitMQ,并且大多数情况下也并不需要修改任何 RabbitMQ的配置。当然,为了更加有效地操控 RabbitMQ,也可以利用调节系统范围内的参数来达到定制化的需求。 RabbitMQ提供…...
CTF 全讲解:[SWPUCTF 2021 新生赛]jicao
文章目录 参考环境题目index.phphighlight_file()include()多次调用,多次执行单次调用,单次执行 $_POST超全局变量HackBarHackBar 插件的获取 $_POST打开 HackBar 插件通过 HackBar 插件发起 POST 请求 GET 请求查询字符串超全局变量 $_GET JSONJSON 数据…...
FL Studio21.1电脑试用体验版音乐制作软件
我一直以来对音乐艺术都很感兴趣。最近我接触到了一款名为 FL Studio 的电脑版音乐制作软件,深感其强大功能和广泛适用性。通过使用这款软件,我不仅深入了解了音乐制作的过程与技巧,也加深了对音乐创作的理解。 FL Studio 最初是一款针对 MI…...
【数据结构】单链表的基本操作(节点建立、插入删除)
1. 单链表的基本操作 1.1. 链表的定义1.2. 链表的创建(初始化) 1.2.1. 不带头结点的链表1.2.2. 带头结点的链表 1.3. 链表的插入和删除 1.3.1. 按位序插入 1.3.1.1. 带头结点1.3.1.2. 不带头结点 1.3.2. 指定节点的后插操作1.3.3. 指定元素的前插操作1.3…...
DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。
DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。 *.dem是一种比较常见的DEM数据格式,其有两种文件组织方式,即NSDTF-DEM和USGS-DEM。 (1)NSDT…...
施耐德电气:勾勒未来工业愿景,赋能中国市场
9月19日,第23届中国国际工业博览会(简称“工博会”)在上海隆重召开。作为全球能源管理和自动化领域的数字化转型专家,施耐德电气在工博会现场全方位展现了自身对未来工业的全新视野与深刻见解,不仅展示了其贯通企业设计…...
安防监控产品经营商城小程序的作用是什么
安防监控产品覆盖面较大,监控器、门禁、对讲机、烟感等都有很高用途,家庭、办公单位各场景往往用量不少,对商家来说,市场高需求背景下也带来了众多生意,但线下门店的局限性,导致商家想要进一步增长不容易。…...
网站建设行业资讯/腾讯推广一次广告多少钱
转自:http://blog.csdn.net/tanyujing/article/details/8717575 钢笔测试 能在不同的纸上写吗?能在墙上写吗?笔尖朝上,倒着拿还能写出字吗? 能在不同的环境下写吗?水里?沙漠?低温&a…...
怎么做自己的淘宝网站/站长工具ip地址
本篇文章小编给大家分享一下Java虚拟机内存溢出与内存泄漏代码原理解析,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。一、基本概念内存溢出:简单地说内存溢出就是指…...
做网站电信运营许可证/营销推广方案ppt案例
zabbix官方的一句话描述zabbix: 监视任何事情适用于任何IT基础架构,服务,应用程序和资源的解决方案 Monitor anythingSolutions for any kind of IT infrastructure, services, applications, resources ---------------------------------…...
网站商城怎么做app/广州seo顾问
一、公司监事要承担哪些责任及义务 1、公司监事要承担的责任及义务包括: (1)向股东会会议提出提案的义务; (2)检查公司财务的义务; (3)对董事、高级管理人员执行公司职务的行为进行监督的义务; (4)执行公司职务时违反法律、行政法规或者公司章程的规定…...
网站如何做滚动效果/郑州seo建站
第一招、MysqL服务的启动和停止net stop MysqLnet start MysqL第二招、登陆MysqL语法如下:键入命令 MysqL -uroot -p, 回车后提示你输入密码,输入12345,然后回车即可进入到MysqL中了,MysqL的提示符是:注意&…...
手机网站app制作/天津百度推广电话号码
修复此问题 禁用内核调试,在 Visual Studio 中调试。- 或 -使用内核调试器而不是 Visual Studio 进行调试。- 或 -在内核调试器中禁用用户模式异常。在当前会话中禁用内核调试 在命令提示处,键入: 复制代码 Kdbgctrl.exe -d对所有会话禁用内核…...