使用Azure OpenAI Embedding模型找到最相关的文档的方法
首先
因为我之前从未接触过机器学习等领域,所以当我听到Embedding、組み込み、埋め込み这些词时,我感到一头雾水。我不知道这个模型能做什么?!所以我开始进行实际调查和尝试,来理解这个模型的有用性。本篇文章就是我想要分享我所了解到的内容。
2. 出现精度高且价格便宜的型号!
OpenAI 在文本嵌入模型中有一个名为 text-embedding-ada-002 的选项。
通过使用此模型,您可以以更低的价格找到最相关的文档。
在同一个嵌入模型中,有一种名为Davinci的模型以及其他几种模型,但是text-embedding-ada-002在大部分任务中比其他模型具有更高的精度,并且使用它比其他模型要便宜得多。因此,对于类似搜索等处理,非常推荐使用它。
根据Azure OpenAI Service Pricing,截至2023年6月8日,存在以下价格差异。
3. 嵌入是什么意思?
既で使用一下 “Embedding” 这个词,但如果不知道它到底是什么,也不知道如何使用,那么就先了解一下关于 Embedding 的简单概念吧。简单来说,我们会运用到高中时学到的向量思维。
在大學時代所學的向量中,我們學到了比較兩個箭頭,如果它們朝向相同且長度相等,則它們是相同的向量。利用這種方法,我們可以尋找長度和方向盡可能接近的向量,這將是最相似的向量。在下圖中,藍色的線完全是相同的向量,但如果我們能找到最接近這個向量的向量”①”,那麼它將是最相似的內容。
当我们将自然语言的字符串输入到text-embedding-ada-002模型中时,会获得一个包含1536个浮点数的高维数组(向量),如下所示。
请告诉我关于 Azure Blob 的相关信息。
[-0.013197514, -0.025243968, 0.011384923, -0.015929632, -0.006410221, 0.031038966,
-0.016921926, -0.010776317, -0.0019300125, -0.016300088, 0.01767607, -0.0047100903,
0.009691408, -0.014183193, -0.017001309, -0.014434575, 0.01902559, 0.010961545,
0.013561356, -0.017371766, -0.007964816, 0.0026841562, 0.0019663966, -0.0019878964,
-0.025614424, -0.0030298054, 0.020229574, -0.01455365, 0.022703694, -0.02033542,
0.035696134, -0.002441044, -0.008057429, 0.0061191483, 0.004263558, -0.0025518502,
0.018046526, 0.011411385, 0.0063804523, -0.0021020102, 0.027572552, -0.017967142,
0.0077663567, 0.005361697, -0.0116693815, 0.004524862, -0.043581568, -0.01028017,
.... 中略
-0.0017265921, 0.083035186, -0.006205147, -0.008646191, 0.0070651355, -0.019052051,
0.008374964, 0.024225213, 0.01522841, 0.019951731, -0.006516066, 0.017967142,
0.0058082296, -0.0053253127, -0.009929558, -0.039109625, -0.031277116, -0.015863478,
0.011040928, 0.012529369, 0.013012286, 0.022981536, -0.013706892, 0.012965979,
0.011953839, -0.01903882, 0.015347485, 0.019052051, -0.0046538603, 0.012191989,
-0.020983716, 0.0078722015, -0.0018605519, -0.02775778, -0.026739024, -0.010359553,
-0.013918581, -0.011933993, 0.0066814483, 0.005196315, -0.0045744767, -2.7598185E-4,
0.012251527, -0.018178832, -0.013276898, 0.011709073, -0.022928614, 0.002131779,
-0.007462053, 0.0044554016]
使用该嵌入方法,将用户输入的字符串与预先保存在数据库等中的向量进行比较,并找到相似的结果。
在寻找最相似的东西时,有几种方法可以使用,但最常见和被广泛认知的方法是计算余弦相似度。余弦相似度是通过传递两个向量进行计算,结果会返回一个介于-1到1之间的值。然后将其与存储在数据库中的数据进行计算。最后,最接近1的结果将被认为是最接近的内容。
ユーザから入力された文字の例:
AAA BBB CCC DDD EEE FFF GGG HHH III JJJ
DB に保存されている文字列とコサイン類似度の計算結果
AAA BBB CCC DDD EEE FFF GGG HHH III JJ = 0.9942949478994986 <----最も1に近い (最も類似性が高い)
AAA BBB KKK LLL MMM NNN OOO PPP QQQ RRR = 0.930036739659776 <----次に1に近い
みなさま今日は JJUG CCC で発表しています= 0.7775105340227892 <----最も1から離れている
如此一来,我们将用户输入的查询内容字符串进行向量化处理,然后与事先保存在数据库中的向量(数组)进行计算,从而进行相似搜索。
4. 处理字符串的注意事项
令牌数量的上限
在使用text-embedding-ada-002模型时,可以处理的最大令牌数(几乎等于字符数)是8192个。因此,如果要处理超过约8000个字符的文本,则需要进行分割。
处理预处理字符串
据报道,《将换行符替换为一个空格》一文指出了“确认发现如果存在换行符,则无法获得预期的结果”。
建议在发送消息到 text-embedding-ada-002 之前,将目标字符串中的换行符 (\n) 替换为空格。
如果有以下这样的文章,请将所有换行符替换为一行的字符串。(请参考以下示例代码)
Visual Studio Code for Javaは、Microsoftが提供するオープンソースのコードエディタ
Visual Studio Code上で、Javaプログラミング言語をサポートするための拡張機能です。
Java開発者が効率的にコードを記述、ビルド、デバッグ、テスト、実行できる環境を提供します。
Visual Studio Codeは多言語対応の軽量なテキストエディタであり、高い拡張性が特徴です。
Java開発者にとっては、Visual Studio Code for Javaが優れた開発環境として利用できるでしょう。
Visual Studio Code for Javaは、Java Development Kit (JDK)をインストールすることで使用できます。
JDKはJavaプログラムをコンパイル、実行するための基本的なツールセットです。
Visual Studio CodeでJavaプロジェクトを開始するには、JDKをインストールした後、Visual Studio Codeの
拡張機能マーケットプレイスからJava Extension Packをインストールします。
Java Extension Packには、Java言語サポート、デバッグ、テスト、プロジェクト管理などの機能が含まれています。
Visual Studio Code for Javaの主な機能は以下のとおりです:
1. シンタックスハイライト: Javaのコードに色付けを行い、可読性を向上させます。
2. コード補完: コード入力中に可能性のあるコードを提案し、効率的にコードを記述できるようにします。
3. コードナビゲーション: クラス、メソッド、変数へのジャンプや、定義の検索が容易になります。
4. リファクタリング: コードの構造や名前を変更し、コードの品質を向上させる機能があります。
5. デバッグ: ブレークポイントを設定し、ステップ実行や変数の監視などのデバッグ機能を利用できます。
6. テスト: JUnitやTestNGなどのテストフレームワークをサポートし、テストの作成、実行、結果の表示ができます。
7. プロジェクト管理: MavenやGradleなどのビルドツールをサポートし、プロジェクトの構成や依存関係の管理が行えます。
8. Gitの統合: ソースコードのバージョン管理を行うGitとの統合があります。
Visual Studio Code for Javaは、開発者の生産性を向上させる機能が豊富であり、Javaプロジェクトの開発に適した環境を提供します。また、Visual Studio Codeの拡張機能マーケットプレイス
には、さまざまなJava関連の拡張機能がありますので、必要に応じて追加することができます。これらの拡張機能
により、Java開発者はVisual Studio Codeを中心とした統合開発環境として利用できるでしょう。
4. 确认动作
4.1 Azure 可用的 Vector DB
在Azure中,作为向量存储的选项有几种选择。(截至2023年6月8日,在下述选择中)
根据您的需求,请使用适当的数据库。
-
- Azure PostgreSQL 数据库-在灵活的服务器上启用并使用 pgvector 的方法
-
- Azure MongoDB Cosmos DB 使用内嵌向量搜索的虚拟核心
-
- Azure 认知搜索(私人预览版)
- Azure Redis Enterprise 缓存
4.2 通过 Azure PostgreSQL 弹性服务器进行向量搜索。
如果您选择其他选项,Vector DB提供了多种选择,请根据您的需求进行选择。但是为了进行验证,我们决定使用PostgreSQL Flexible Server。如果您对如何处理Vector感兴趣,我们在下面的内容中提供了步骤,请随时尝试。如果您选择了不同的持久化选项,请跳过这一章节。
4.2.1 设置环境变量 (Settings of environment variables)
请适当修改并设置以下环境变量,以在Azure上创建资源。
export RESOURCE_GROUP=PostgreSQL
export LOCATION=eastus
export POSTGRES_SERVER_NAME=yoshiopgsql3
export POSTGRES_USER_NAME=yoterada
export POSTGRES_USER_PASS='!'$(head -c 12 /dev/urandom | base64 | tr -dc '[:alpha:]'| fold -w 8 | head -n 1)$RANDOM
echo "GENERATED PASSWORD: " $POSTGRES_USER_PASS
export POSTGRES_DB_NAME=VECTOR_DB
export SUBSCRIPTION_ID=************-****-****-****-************
export PUBLIC_IP=$(curl ifconfig.io -4)
在上述的设置示例中,密码是自动生成的,并将生成的密码输出到标准输出。
请您输入您自己的密码或者记下输出的密码。
4.2.2 安装 Azure PostgreSQL 弹性服务器。
请执行以下三个命令。
执行命令后,将会执行以下的操作。
-
- 安装Azure PostgreSQL灵活服务器
-
- 设置防火墙
- 创建新数据库
az postgres flexible-server create --name $POSTGRES_SERVER_NAME \
-g $RESOURCE_GROUP \
--location $LOCATION \
--admin-user $POSTGRES_USER_NAME \
--admin-password $POSTGRES_USER_PASS \
--public-access $PUBLIC_IP
--yes
az postgres flexible-server firewall-rule create \
-g $RESOURCE_GROUP \
-n $POSTGRES_SERVER_NAME \
-r AllowAllAzureIPs \
--start-ip-address 0.0.0.0 \
--end-ip-address 255.255.255.255
az postgres flexible-server db create \
-g $RESOURCE_GROUP \
-s $POSTGRES_SERVER_NAME \
-d $POSTGRES_DB_NAME
4.2.3 Azure PostgreSQL柔性服务器的日文处理设置。
请在数据库中进行以下设置,以便能够处理包含日本语 UTF-8 的数据,因为此次持续性数据中也包含了日本语字符串。
az postgres flexible-server parameter set \
-g $RESOURCE_GROUP \
--server-name $POSTGRES_SERVER_NAME \
--subscription $SUBSCRIPTION_ID \
--name lc_monetary --value "ja_JP.utf-8"
az postgres flexible-server parameter set \
-g $RESOURCE_GROUP \
--server-name $POSTGRES_SERVER_NAME \
--subscription $SUBSCRIPTION_ID \
--name lc_numeric --value "ja_JP.utf-8"
az postgres flexible-server parameter set \
-g $RESOURCE_GROUP \
--server-name $POSTGRES_SERVER_NAME \
--subscription $SUBSCRIPTION_ID \
--name timezone --value "Asia/Tokyo"
安装扩展功能到Azure PostgreSQL Flexible Server 4.2.4版中。
请执行以下命令,以便能够使用扩展功能在 PostgreSQL 中处理 UUID 和 Vector 数据类型。
注意:
请不要在”VECTOR,UUID-OSSP”之间留空格。
az postgres flexible-server parameter set \
-g $RESOURCE_GROUP \
--server-name $POSTGRES_SERVER_NAME \
--subscription $SUBSCRIPTION_ID \
--name azure.extensions --value "VECTOR,UUID-OSSP"
4.3 创建用于处理向量的 PostgreSQL 表
上述的是,既然 PostgreSQL 的设置已经完成,那么请执行下面的命令进行连接。
> psql -U $POSTGRES_USER_NAME -d $POSTGRES_DB_NAME \
-h $POSTGRES_SERVER_NAME.postgres.database.azure.com
在成功连接后,将刚刚添加的扩展功能使其可以在PostgreSQL内使用。
请分别执行以下命令,如下所示:CREATE EXTENSION。
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.
VECTOR_DB=>
VECTOR_DB=> CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION
VECTOR_DB=> CREATE EXTENSION IF NOT EXISTS "vector";
CREATE EXTENSION
最终,我们将创建一个用于保存Vector数据的表。
我们将将Vector信息保存在embedding VECTOR(1536)部分。
本次简化的是,我们还将保存origntext,并且显示与最相似的字符串的原始字符串。
实际上,我觉得可以将其作为链接URL,或者后来可以与其他表合并以供您使用。
VECTOR_DB=> CREATE TABLE TBL_VECTOR_TEST(
id uuid,
embedding VECTOR(1536),
origntext varchar(8192),
PRIMARY KEY (id)
);
CREATE TABLE
创建4.4版Java应用程序
在Maven项目中添加依赖关系4.4.1
使用Azure OpenAI库连接到PostgreSQL并进行数据持久化,最低限度需要添加以下依赖关系才能实现。请将以下内容添加到pom.xml文件中。
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-openai</artifactId>
<version>1.0.0-beta.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.6.0</version>
</dependency>
创建和设置属性文件。
请在src/main/resources/application.properties文件中编写并记录属性设置信息。
azure.openai.url=https://YOUR_OWN_AZURE_OPENAI.openai.azure.com
azure.openai.model.name=gpt-4
azure.openai.api.key=************************************
azure.postgresql.jdbcurl=jdbc:postgresql://YOUR_POSTGRESQL.postgres.database.azure.com:5432/VECTOR_DB
azure.postgresql.user=yoterada
azure.postgresql.password=************************************
logging.group.mycustomgroup=com.yoshio3
logging.level.mycustomgroup=DEBUG
logging.level.root=INFO
4.4.3 Java程序的实现
最后,将实现Java代码。
package com.yoshio3;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.azure.ai.openai.OpenAIClient;
import com.azure.ai.openai.OpenAIClientBuilder;
import com.azure.ai.openai.models.EmbeddingsOptions;
import com.azure.core.credential.AzureKeyCredential;
public class VectorTest {
private final static Logger LOGGER = LoggerFactory.getLogger(VectorTest.class);
// Azure OpenAI の API キー
private String OPENAI_API_KEY = "";
// Azure OpenAI のインスタンスの URL
private String OPENAI_URL = "";
private String POSTGRESQL_JDBC_URL = "";
private String POSTGRESQL_USER = "";
private String POSTGRESQL_PASSWORD = "";
private final static List<String> INPUT_DATA = Arrays.asList(
"Visual Studio Code for Javaは、Microsoftが提供するオープンソースのコードエディタVisual Studio Code上で、Javaプログラミング言語をサポートするための拡張機能です。Java開発者が効率的にコードを記述、ビルド、デバッグ、テスト、実行できる環境を提供します。Visual Studio Codeは多言語対応の軽量なテキストエディタであり、高い拡張性が特徴です。Java開発者にとっては、Visual Studio Code for Javaが優れた開発環境として利用できるでしょう。Visual Studio Code for Javaは、Java Development Kit (JDK)をインストールすることで使用できます。JDKはJavaプログラムをコンパイル、実行するための基本的なツールセットです。Visual Studio CodeでJavaプロジェクトを開始するには、JDKをインストールした後、Visual Studio Codeの拡張機能マーケットプレイスからJava Extension Packをインストールします。Java Extension Packには、Java言語サポート、デバッグ、テスト、プロジェクト管理などの機能が含まれています。Visual Studio Code for Javaの主な機能は以下のとおりです:1. シンタックスハイライト: Javaのコードに色付けを行い、可読性を向上させます。2. コード補完: コード入力中に可能性のあるコードを提案し、効率的にコードを記述できるようにします。3. コードナビゲーション: クラス、メソッド、変数へのジャンプや、定義の検索が容易になります。4. リファクタリング: コードの構造や名前を変更し、コードの品質を向上させる機能があります。5. デバッグ: ブレークポイントを設定し、ステップ実行や変数の監視などのデバッグ機能を利用できます。6. テスト: JUnitやTestNGなどのテストフレームワークをサポートし、テストの作成、実行、結果の表示ができます。7. プロジェクト管理: MavenやGradleなどのビルドツールをサポートし、プロジェクトの構成や依存関係の管理が行えます。8. Gitの統合: ソースコードのバージョン管理を行うGitとの統合があります。Visual Studio Code for Javaは、開発者の生産性を向上させる機能が豊富であり、Javaプロジェクトの開発に適した環境を提供します。また、Visual Studio Codeの拡張機能マーケットプレイスには、さまざまなJava関連の拡張機能がありますので、必要に応じて追加することができます。これらの拡張機能により、Java開発者はVisual Studio Codeを中心とした統合開発環境として利用できるでしょう。",
"Azure App Service for Javaは、MicrosoftのクラウドプラットフォームAzure上でJavaアプリケーションをホスト、デプロイ、管理するためのフルマネージドプラットフォームです。Azure App Serviceは、ウェブアプリケーション、モバイルアプリ、API、およびその他のバックエンドアプリケーションの開発と実行に対応しており、Java開発者がアプリケーションを迅速にデプロイし、スケーリングすることができます。また、インフラストラクチャの管理を抽象化することで、開発者はアプリケーションのコードに集中できます。Azure App Service for Javaは、JDK(Java Development Kit)とWebサーバーを組み込んでおり、Tomcat、Jetty、JBoss EAPなどのJavaランタイムをサポートしています。さらに、Azure App Serviceは、CI/CD(継続的インテグレーション/継続的デリバリー)パイプラインの構築、カスタムドメインの設定、SSL証明書の管理、アプリケーションの監視と診断など、Javaアプリケーションのライフサイクル全体をサポートする機能を提供しています。",
"Azure Container Appsは、MicrosoftのクラウドプラットフォームAzure上で、コンテナベースのアプリケーションをデプロイ、管理、スケーリングするためのフルマネージドサービスです。Azure Container Appsは、マイクロサービスアーキテクチャ、ウェブアプリケーション、バックエンドサービス、およびジョブを実行するアプリケーションに適しています。このサービスは、Kubernetesのようなコンテナオーケストレーションプラットフォームを抽象化し、開発者がインフラストラクチャの管理やスケーリングから解放され、アプリケーションのコードに集中できるようになります。Azure Container Appsは、Dockerコンテナイメージを使用してアプリケーションをデプロイし、自動スケーリング、ローリングアップデート、自動復元などの機能を提供します。また、Azure Container Appsは、プラットフォームに依存しないため、どのプログラミング言語やフレームワークでも対応しています。開発者は、Azureポータル、Azure CLI、またはGitHub ActionsなどのCI/CDパイプラインを使用して、アプリケーションを簡単にデプロイできます。セキュリティ面では、Azure Container Appsは、ネットワーク分離、プライベートエンドポイント、Azure Active Directory(AAD)統合などの機能を提供し、アプリケーションの安全性を保証します。また、アプリケーションの監視と診断をサポートする機能も提供されており、Azure MonitorやAzure Application Insightsといったツールを利用して、アプリケーションのパフォーマンスや問題の特定が可能です。",
"Azure Cosmos DBは、Microsoftのグローバル分散マルチモデルデータベースサービスであり、低遅延、高可用性、および高スループットを提供します。Cosmos DBは、NoSQLデータベースであり、キー・バリュー、ドキュメント、カラムファミリー、グラフといった複数のデータモデルをサポートしています。このフルマネージドサービスは、様々なアプリケーションに対応し、ウェブ、モバイル、IoT、ゲームなどの開発に利用できます。Azure Cosmos DBの主要機能は、以下の通りです。グローバル分散: データを複数の地理的リージョンに自動的にレプリケートし、高可用性と低遅延を実現します。水平スケーリング: パーティションキーを使用して、データを複数の物理パーティションに分割し、スループットとストレージ容量を柔軟にスケーリングできます。5つの整合性モデル: グローバル分散アプリケーションの整合性要件に応じて、強い整合性からイベンチャル整合性までの5つの整合性モデルを選択できます。リアルタイムアナリティクス: Azure Synapse AnalyticsやAzure Functionsと統合し、リアルタイムのデータ処理と分析を実現します。また、Azure Cosmos DBは、複数のAPIを提供しており、SQL API、MongoDB API、Cassandra API、Gremlin API、Table APIなど、開発者が既に使い慣れたAPIを使用して、アプリケーションを構築できます。データセキュリティ面では、Cosmos DBは暗号化、ネットワーク分離、アクセス制御などの機能を提供し、データの保護を確保します。さらに、Azure MonitorやAzure Application Insightsを使用して、データベースのパフォーマンスや問題の特定を行うことができます。",
"Azure Kubernetes Service (AKS) は、マイクロソフトが提供する Kubernetes クラスター管理サービスで、コンテナ化されたアプリケーションのデプロイ、スケーリング、運用を簡単にすることができます。AKS は、マネージド型の Kubernetes サービスであり、インフラストラクチャの管理やアップデートなどの面倒な作業を自動化することで、開発者はアプリケーション開発に集中することができます。AKS は、エンタープライズ向けのセキュリティ、監視、運用管理機能を提供し、DevOps のパイプラインとの統合も容易です。また、Azure の他のサービスとの連携も可能で、柔軟なアプリケーション開発を支援します。AKSの主な機能と利点は以下の通りです。1. クラスターのプロビジョニングとスケーリング: AKSは、クラスターのインフラストラクチャ管理を自動化し、必要に応じてノードの追加や削除ができます。これにより、リソースの適切な使用と効率的な運用が可能になります。2. セキュリティとアクセス制御: AKSは、組み込みのAzure Active Directory(AD)統合を提供し、ロールベースのアクセス制御(RBAC)を使用して、クラスターへのアクセスをセキュアに管理できます。3.CI/CDパイプラインとの統合: AKSは、Azure DevOpsやJenkinsなどのCI/CDツールと統合し、アプリケーションのビルド、テスト、デプロイを自動化できます。4. モニタリングとログ: AKSは、Azure MonitorやPrometheus、Grafanaなどの監視ツールと統合し、クラスターのパフォーマンスやリソース使用状況を監視できます。また、ログはAzure Log Analyticsを通じて一元管理できます。5. ネットワーキングとストレージ: AKSは、Azure Virtual Networks(VNet)を使用して、プライベートネットワーク内でクラスターを実行できます。また、Azure StorageやAzure Disksを使用して、永続データストレージを提供します。6. Azureの他のサービスとの連携: AKSは、Azure FunctionsやAzure Cosmos DBなどのAzureサービスと連携し、アプリケーションの機能を拡張できます。これらの機能により、AKSは開発者がアプリケーションの開発に集中し、インフラストラクチャの管理や運用の負担を軽減します。また、エンタープライズ向けのセキュリティ、監視、運用管理機能が提供されているため、安心して利用することができます。",
"Azure Cognitive Serviceは、マイクロソフトが提供するAI機能を統合したクラウドベースのサービスで、アプリケーションやウェブサイト、ボットに簡単に人工知能機能を追加できます。ディープラーニングや機械学習の専門知識がなくても、APIを介してこれらの機能を利用できます。Azure Cognitive Serviceは、以下の5つのカテゴリに分かれています。Vision: 画像や動画を解析し、顔認識、画像認識、光学式文字認識(OCR)などの機能を提供します。コンピュータービジョン、カスタムビジョン、フェイスAPI、フォーム認識器、ビデオインデクサーなどが含まれます。Speech: 音声認識、音声合成、音声翻訳などの音声関連の機能を提供します。スピーチサービス、音声翻訳、スピーカー認識が含まれます。Language: 自然言語処理(NLP)機能を提供し、テキスト解析、機械翻訳、文書の要約、キーワード抽出などができます。テキスト分析、言語理解(LUIS)、QnAメーカー、翻訳が含まれます。Decision: 意思決定や推奨事項をサポートする機能を提供し、個々のユーザーに適したコンテンツやアクションを推奨できます。個別化、アノマリーディテクター、コンテンツモデレータが含まれます。Web Search: Bingの検索エンジンを利用した、ウェブ検索、画像検索、動画検索、ニュース検索、地図検索などの機能を提供します。Bing Web Search API、Bing Image Search API、Bing Video Search API、Bing News Search API、Bing Maps APIが含まれます。これらのAI機能を組み合わせることで、ユーザーエクスペリエンスを向上させ、アプリケーションやサービスの価値を高めることができます。また、Azure Cognitive Serviceは、プライバシーとセキュリティにも配慮されており、企業や開発者が安心して利用できるようになっています。",
"Azure Container Instances (ACI)は、マイクロソフトが提供する、コンテナを素早く簡単にデプロイできるサービスです。仮想マシンやオーケストレーションの管理をせずに、アプリケーションのコンテナを実行できるため、開発者はインフラストラクチャの管理にかかる手間を削減できます。ACIは、秒単位の課金が可能で、リソースの使用量に応じてコストが発生します。主な特徴と利点は以下の通りです。シンプルで迅速なデプロイメント: ACIは、Dockerコンテナイメージを使用して、短時間でコンテナをデプロイできます。また、ACIで実行されるコンテナは、DockerコマンドやKubernetesクラスタと互換性があります。オペレーティングシステムの管理が不要: ACIは、ホストOSの管理やアップデートの手間を省き、開発者はアプリケーションの開発と運用に集中できます。シームレスなスケーリング: ACIは、コンテナの数を柔軟にスケーリングでき、負荷に応じてリソースを増減させることができます。セキュリティ: ACIは、Azureのセキュリティ機能を利用して、コンテナとデータの保護を実現します。また、ネットワークのアイソレーションも提供しています。用途に応じた柔軟なリソース割り当て: ACIでは、CPUとメモリを個別に割り当てることができ、アプリケーションの要件に応じてリソースを最適化できます。イベント駆動型のコンテナ実行: ACIは、Azure FunctionsやLogic Appsなどのサービスと統合して、イベント駆動型のコンテナ実行が可能です。これらの特徴により、Azure Container Instancesは、ショートタームのワークロードやバッチ処理、開発・テスト環境など、さまざまなシナリオで効果的に利用できます。また、AKSと組み合わせることで、オーケストレーション機能を活用したコンテナ管理も実現できます。",
"Azure Data Lake Storage (ADLS)は、マイクロソフトが提供する大規模なデータレイクソリューションで、ペタバイト規模のデータを効率的に格納、処理、分析できるように設計されています。ADLSは、Azure Storageの一部であり、非構造化データや半構造化データ、構造化データを一元的に管理し、ビッグデータ分析や機械学習、リアルタイム分析などの高度な分析を実現します。ADLSの主な特徴と利点は以下の通りです。スケーラビリティ: ADLSは、ペタバイト規模のデータを格納できる高いスケーラビリティを提供し、データの増大に柔軟に対応できます。パフォーマンス: ADLSは、データの大量読み込みや書き込みに最適化されたパフォーマンスを提供し、ビッグデータ処理やリアルタイム分析に適しています。セキュリティとコンプライアンス: ADLSは、データの暗号化、アクセス制御、監査ログなどのセキュリティ機能を提供し、企業のコンプライアンス要件に対応できます。高い互換性: ADLSは、Hadoop Distributed File System (HDFS)と互換性があり、既存のHadoopエコシステムやApache Spark、Azure Databricksなどのビッグデータ分析ツールと連携できます。階層型ストレージ: ADLSは、ホット、クール、アーカイブの3つのストレージ階層を提供し、データのアクセス頻度に応じて最適なコストパフォーマンスを実現します。データ湖とオブジェクトストレージの統合: Azure Data Lake Storage Gen2は、ADLSとAzure Blob Storageを統合し、大規模なデータ湖とオブジェクトストレージの利点を兼ね備えたソリューションを提供します。Azure Data Lake Storageは、企業が大量のデータを効率的に管理し、ビッグデータ分析や機械学習などの高度なデータ処理を実現するための強力なプラットフォームです。これにより、企業はデータの価値を最大限に活用し、ビジネスインサイトの獲得や意思決定の改善を実現できます。",
"Azure Blob Storageは、マイクロソフトが提供するオブジェクトストレージサービスで、大量の非構造化データを格納・管理できるクラウドベースのソリューションです。テキスト、バイナリデータ、画像、動画、ログファイルなど、あらゆるタイプのデータを安全かつスケーラブルに保存できます。主な特徴と利点は以下の通りです。1. スケーラビリティ: Azure Blob Storageは、ペタバイト規模のデータを格納できる高いスケーラビリティを提供し、データの増大に柔軟に対応できます。2. パフォーマンス: Azure Blob Storageは、データの読み込みや書き込みのパフォーマンスが高く、大量のデータを迅速に処理できます。3. 階層型ストレージ: Azure Blob Storageは、ホット、クール、アーカイブの3つのストレージ階層を提供し、データのアクセス頻度に応じて最適なコストパフォーマンスを実現します。4. セキュリティとコンプライアンス: Azure Blob Storageは、データの暗号化、アクセス制御、監査ログなどのセキュリティ機能を提供し、企業のコンプライアンス要件に対応できます。5. グローバルアクセス: Azure Blob Storageは、マイクロソフトのAzureデータセンターを利用し、世界中から高速かつ安全にデータにアクセスできます。6. 統合と互換性: Azure Blob Storageは、Azure Data Lake Storage Gen2や他のAzureサービス、オンプレミスシステムと連携が可能で、データの一元管理や分析を実現します。Azure Blob Storageは、ウェブアプリケーション、バックアップ、アーカイブ、ビッグデータ分析、IoTデバイスなど、さまざまなシナリオで効果的に利用できます。これにより、企業はデータの価値を最大限に活用し、ビジネスインサイトの獲得や意思決定の改善を実現できます。");
private OpenAIClient client;
public VectorTest() throws IOException {
Properties properties = new Properties();
properties.load(this.getClass().getResourceAsStream("/application.properties"));
OPENAI_API_KEY = properties.getProperty("azure.openai.api.key");
OPENAI_URL = properties.getProperty("azure.openai.url");
POSTGRESQL_JDBC_URL = properties.getProperty("azure.postgresql.jdbcurl");
POSTGRESQL_USER = properties.getProperty("azure.postgresql.user");
POSTGRESQL_PASSWORD = properties.getProperty("azure.postgresql.password");
client = new OpenAIClientBuilder()
.credential(new AzureKeyCredential(OPENAI_API_KEY))
.endpoint(OPENAI_URL)
.buildClient();
}
public static void main(String[] args) {
VectorTest test;
try {
test = new VectorTest();
// DB へのインサートは一度だけ実行する
// test.insertDataToPostgreSQL();
// DB に登録されているデータに対して、ベクトル検索で類似度ドキュメントを取得する
test.findMostSimilarString("Azure Blob について教えてください");
} catch (IOException e) {
LOGGER.error("Error : ", e);
}
}
/**
* テキスト・エンべディングの検証サンプル (text-embedding-ada-002)
*/
private List<Double> invokeTextEmbedding(String originalText) {
EmbeddingsOptions embeddingsOptions = new EmbeddingsOptions(Arrays.asList(originalText));
var result = client.getEmbeddings("text-embedding-ada-002", embeddingsOptions);
var embedding = result.getData().stream().findFirst().get().getEmbedding();
return embedding;
}
private void insertDataToPostgreSQL() {
try (var connection = DriverManager.getConnection(POSTGRESQL_JDBC_URL, POSTGRESQL_USER, POSTGRESQL_PASSWORD)) {
var insertSql = "INSERT INTO TBL_VECTOR_TEST (id, embedding, origntext) VALUES (?, ?::vector, ?)";
for (String originText : INPUT_DATA) {
// テキスト・エンべディングを呼び出しベクター配列を取得
List<Double> embedding = invokeTextEmbedding(originText);
// 短時間に大量のリクエストを送るとエラーになるため、10秒間スリープ
TimeUnit.SECONDS.sleep(10);
PreparedStatement insertStatement = connection.prepareStatement(insertSql);
insertStatement.setObject(1, UUID.randomUUID());
insertStatement.setArray(2, connection.createArrayOf("double", embedding.toArray()));
insertStatement.setString(3, originText);
insertStatement.executeUpdate();
}
} catch (SQLException | InterruptedException e) {
LOGGER.error("Connection failure." + e.getMessage());
}
}
public void findMostSimilarString(String data) {
try (var connection = DriverManager.getConnection(POSTGRESQL_JDBC_URL, POSTGRESQL_USER, POSTGRESQL_PASSWORD)) {
// ユーザが検索したい文字列をテキスト・エンべディングを呼び出しベクター配列を作成
List<Double> embedding = invokeTextEmbedding(data);
String array = embedding.toString();
LOGGER.info("Embedding: \n" + array);
// ベクター配列で検索 (ユーザーが入力した文字列と最も近い文字列を検索)
String querySql = "SELECT origntext FROM TBL_VECTOR_TEST ORDER BY embedding <-> ?::vector LIMIT 1;";
PreparedStatement queryStatement = connection.prepareStatement(querySql);
queryStatement.setString(1, array);
ResultSet resultSet = queryStatement.executeQuery();
while (resultSet.next()) {
String origntext = resultSet.getString("origntext");
LOGGER.info("Origntext: " + origntext);
}
} catch (SQLException e) {
LOGGER.error("Connection failure." + e.getMessage());
}
}
}
实施的要点 1
我们定义了一个名为INPUT_DATA的字符串列表。
在这个列表中,我们将以下服务的描述保存为字符串数组列表。如前所述,如果包含换行符,可能无法得到正确的结果,因此我们将所有换行符替换为空格。
-
- Visual Studio Code 视觉工作室代码
-
- Azure App Service for Java Azure 适用于 Java 的应用服务
-
- Azure Container Apps Azure 容器应用
-
- Azure Cosmos DB Azure 宇宙数据库
-
- Azure Kubernetes Service Azure Kubernetes 服务
-
- Azure Cognitive Service Azure 认知服务
-
- Azure Container Instances Azure 容器实例
-
- Azure Data Lake Storage Azure 数据湖存储
- Azure Blob Storage Azure Blob 存储
实施的要点之二
在下面的 invokeTextEmbedding 方法中调用了 Azure OpenAI 的 Embedded 模型。
通过将字符串传递给此方法,结果将以浮点数列表的形式返回。
private List<Double> invokeTextEmbedding(String originalText) {
EmbeddingsOptions embeddingsOptions = new EmbeddingsOptions(Arrays.asList(originalText));
var result = client.getEmbeddings("text-embedding-ada-002", embeddingsOptions);
var embedding = result.getData().stream().findFirst().get().getEmbedding();
return embedding;
}
在实施中的重点3
以下的方法从预先准备的字符串列表(INPUT_DATA)中逐个提取元素,并调用Azure OpenAI的嵌入式方法。在接收到多维数组(向量)后,将其保存到数据库中。
此过程是用于测试数据插入,因此请只执行一次。
private void insertDataToPostgreSQL() {
try (var connection = DriverManager.getConnection(POSTGRESQL_JDBC_URL, POSTGRESQL_USER, POSTGRESQL_PASSWORD)) {
var insertSql = "INSERT INTO TBL_VECTOR_TEST (id, embedding, origntext) VALUES (?, ?::vector, ?)";
for (String originText : INPUT_DATA) {
// テキスト・エンべディングを呼び出しベクター配列を取得
List<Double> embedding = invokeTextEmbedding(originText);
// 短時間に大量のリクエストを送るとエラーになるため、10秒間スリープ
TimeUnit.SECONDS.sleep(10);
PreparedStatement insertStatement = connection.prepareStatement(insertSql);
insertStatement.setObject(1, UUID.randomUUID());
insertStatement.setArray(2, connection.createArrayOf("double", embedding.toArray()));
insertStatement.setString(3, originText);
insertStatement.executeUpdate();
}
} catch (SQLException | InterruptedException e) {
LOGGER.error("Connection failure." + e.getMessage());
}
}
实施的关键点是4。
最终会比对数据库中保存的信息与用户输入的信息,并找到最相关的文档。
public static void main(String[] args) {
VectorTest test;
try {
test = new VectorTest();
// DB に登録されているデータに対して、ベクトル検索で類似度ドキュメントを取得する
test.findMostSimilarString("Azure Blob について教えてください");
在本次样本中,我们在main()方法中输入了”请告诉我关于Azure Blob的信息”这样的文字。请注意,我们还使用了invokeTextEmbedding(data)来调用并创建了一个多维数组。
我正在将这个多维数组传递给下面的查询。
从TBL_VECTOR_TEST中选择origntext,按照embedding与?的相似度进行排序,并且只返回一条结果。
由于上述标记中有“LIMIT 1”的说明,所以只会输出最相关的一份文档。如果想要返回多个结果,请修改这个值。
此外,括号中标有<->的部分是可以更改的。在PostgreSQL的pgvector中,您可以通过指定以下三种运算符来计算相似度。根据需要更改运算符。
欧几里得距离用于测量 n 维空间内两个向量之间的直线距离,而余弦相似度用于测量两个向量之间的角度的余弦。
查询的结果已经实现为返回原始文本。
public void findMostSimilarString(String data) {
try (var connection = DriverManager.getConnection(POSTGRESQL_JDBC_URL, POSTGRESQL_USER, POSTGRESQL_PASSWORD)) {
// ユーザが検索したい文字列をテキスト・エンべディングを呼び出しベクター配列を作成
List<Double> embedding = invokeTextEmbedding(data);
String array = embedding.toString();
LOGGER.info("Embedding: \n" + array);
// ベクター配列で検索 (ユーザーが入力した文字列と最も近い文字列を検索)
String querySql = "SELECT origntext FROM TBL_VECTOR_TEST ORDER BY embedding <-> ?::vector LIMIT 1;";
PreparedStatement queryStatement = connection.prepareStatement(querySql);
queryStatement.setString(1, array);
ResultSet resultSet = queryStatement.executeQuery();
while (resultSet.next()) {
String origntext = resultSet.getString("origntext");
LOGGER.info("Origntext: " + origntext);
}
} catch (SQLException e) {
LOGGER.error("Connection failure." + e.getMessage());
}
}
如果您有这样的用例,请随意尝试,通过使用多维数组向量,可以找到相关的文件。
考虑参考资料
以下提供参考信息,请根据需要查看。
-
- Azure OpenAI を使用して埋め込みを生成する方法を学習する
-
- チュートリアル: Azure OpenAI Service の埋め込みとドキュメント検索を確認する
-
- Azure Database for PostgreSQL を有効にして使用する方法 – フレキシブル サーバーpgvector
- Azure Database for PostgreSQL で pgvector を使用する場合のパフォーマンスを最適化する方法 – フレキシブル サーバー