OCI Generative AI サービスの埋め込みモデル Cohere Embed で類似性検索を試し倒す！

# はじめに

OCI Generative AI サービスでは、Cohere 社の埋め込みモデル Cohere Embed 3 を利用することができます。
Cohere Embed 3 は、マルチモーダルな埋め込みモデルですがこの記事では、テキストの埋め込みモデルとして使用して、さまざまな検索タスクを試してみました。

[Cohere 社のブログ](https://cohere.com/blog/introducing-embed-v3)などを読んでいると Cohere Embed 3 は、単に似たテキストを探すだけではなく、クエリがドキュメントのトピックにどれだけマッチしているかを評価し、コンテンツの全体的な品質を評価する機能があり、ノイズの多いデータセットを扱う場合に特に役立つ、最高品質のドキュメントを上位にランク付けすることができるといった記述があります。これがどのようなことなのかも試してみています。

この記事の内容はウェビナー【Oracle AI JAM Session #23 生成AIを活かすには埋め込みの理解から！RAGの心臓：埋め込みの基礎から応用まで！】（2025年3月26日）にてご紹介させていただく内容の一部です。

https://oracle-code-tokyo-dev.connpass.com/event/344852/


コードは以下の GitHub Repo にて公開しています。

https://github.com/kutsushitaneko/orajam23_embedding

[100_oci_genai_cohere_embed_search.ipynb](https://github.com/kutsushitaneko/orajam23_embedding/blob/main/100_oci_genai_cohere_embed_search.ipynb)

それでは、「OCI Generative AI サービスの埋め込みモデル Cohere Embed で類似性検索を試し倒す！」はじまります！

# テキストの類似性検索（セマンティックサーチ）
OCI Generative AI（生成AI） サービスで提供されている Coher社の埋め込みモデル cohere.embed-multilingual-v3.0 を使用して自然言語テキストの類似性検索をいくつか試してみましょう。

## その１）テキストの類似性検索（ベクトルデータベースとは？）
ここでベクトルデータベースについてご紹介しようということでなく、「ベクトルデータベースとは？」というテキストを埋め込みモデル（ohere.embed-multilingual-v3.0）で埋め込みベクトルに変換してあらかじめ用意したドキュメント群から類似したドキュメントを探してみようというお話しです。
もし、検索から「ベクトルデータベースとは？」の解説を読めると思ってここに辿り着かれた方には別の記事↓をご用意していますので、ぜひお立ち寄りください。

https://qiita.com/yuji-arakawa/items/c60251131c00f2ac02f1

### 準備
```python:ライブラリのインポート
import oci
import os
from dotenv import load_dotenv, find_dotenv
import numpy as np
import pandas as pd
```
- `oci` は、OCI(Oracle Cloud Infrastructure)のSDKの Python ライブラリです

```python:OCI認証パラメータの設定
CONFIG_PROFILE = "DEFAULT" # 構成ファイルに合わせて変更してください。
config = oci.config.from_file(file_location='~/.oci/config', profile_name=CONFIG_PROFILE)
config["region"] = "us-chicago-1"
```

```python:OCI Generative AIクライアントの生成
_= load_dotenv(find_dotenv())
compartment_id = os.getenv("OCI_COMPARTMENT_ID") 
generative_ai_inference_client = oci.generative_ai_inference.GenerativeAiInferenceClient(config=config, retry_strategy=oci.retry.NoneRetryStrategy(), timeout=(10,240))
```
OCI のコンパートメントIDをあらかじめ `.env` ファイルに `OCI_COMPARTMENT_ID=XXXXXXXXXX`の書式で定義しておきます。
```python:埋め込み処理共通のパラメータの設定
model_id = "cohere.embed-multilingual-v3.0" # 埋め込みモデル
# 埋め込み処理の詳細なパラメータを設定するオブジェクトを生成
embed_text_detail = oci.generative_ai_inference.models.EmbedTextDetails()
embed_text_detail.serving_mode = oci.generative_ai_inference.models.OnDemandServingMode(model_id=model_id)
embed_text_detail.compartment_id = compartment_id
```
### 検索対象ドキュメントの埋め込み処理
```python:検索対象ドキュメント群の定義
documents = [
    "COVID-19には多くの症状があります。",
    "COVID-19の症状は悪いです。",
    "COVID-19の症状は良くありません",
    "COVID-19の症状はいろいろです",
    "COVID-19の症状は悪いです。5Gの機能には、より広範なサービスカバレッジ、より多くの利用可能な接続数、および低電力消費が含まれます。",
    "COVID-19はウイルスによって引き起こされる病気です。最も一般的な症状は発熱、悪寒、および喉の痛みですが、他にもさまざまな症状があります。",
    "COVID-19の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。",
    "認知症には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。",
    "COVID-19には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。",
    "COBIT 2019は政府のデジタル・ガバメント計画を支えるガバナンス態勢を整備する際の最適な枠組みです。",
    "新型コロナ感染症の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。",
    "鳥インフルエンザの症状には、高熱、咳、筋肉の痛み、倦怠感、頭痛、その他の症状が含まれます。",
    "COVID-19は、SARS-CoV-2（新型コロナウイルス）によって引き起こされる感染症です。2019年12月に最初に確認され、その後、世界的なパンデミックとなりました。症状としては、発熱、咳、息切れ、倦怠感、嗅覚や味覚の喪失などがあります。また、感染経路は、主に飛沫感染と接触感染ですが、空気感染の可能性もあります。高齢者や基礎疾患のある方は重症化リスクが高く、死亡率も高いとされています。COVID-19に対しては、ワクチン接種や手洗い、マスク着用、ソーシャルディスタンスなどの予防措置が推奨されています。パンデミックは世界中の医療システムや経済に大きな影響を与えました。",
    "SGDs（持続可能な開発目標）は、2015年に国連加盟国によって採択された「持続可能な開発のための2030アジェンダ」の中核を成す17の国際目標です。",
    "ベクトルデータベースは、データをベクトル（数値の配列）として表現し、ベクトル間の類似性に基づいて検索や分析を行うことに特化したデータベースシステムです。",
    "著名なベクトルデータベースには、ChromaDB、Faiss、Pinecone、Annoy、Oracle Database 23ai AI Vector Search などがあります。",
    "ベクトルデータベースには、効率的な検索のためにHNSWのような近似最近傍検索アルゴリズムを採用しているものがあります。",
    "近似最近傍検索は、高次元空間内で与えられたクエリポイントに最も近い（最も類似した）データポイントを効率的に見つけるアルゴリズムです。",
    "Oracle Databaseとは、米国オラクル が開発・販売している、リレーショナル・データベース管理システム のことです"
]
```
```python:埋め込み処理の詳細にドキュメント群を設定
embed_text_detail.inputs = documents
```
```python:ドキュメント群の埋め込み実行
embed_text_detail.input_type = "SEARCH_DOCUMENT" # 検索対象のドキュメント
doc_embedding = generative_ai_inference_client.embed_text(embed_text_detail)
# レスポンスオブジェクトから埋め込みベクトルを抽出
doc_embedding_vectors = np.array([embed for embed in doc_embedding.data.embeddings])
print(f"埋め込みの数:{len(doc_embedding.data.embeddings)}")
print(f"埋め込みの次元数:{len(doc_embedding.data.embeddings[0])}")
```
```bash:出力例
埋め込みの数:19
埋め込みの次元数:1024
```
```python:生成された埋め込みベクトルの表示
print(f"1件目の埋め込み (最初の5要素):{doc_embedding.data.embeddings[0][:5]}")
```
```bash:出力例
1件目の埋め込み (最初の5要素):[-0.0001835823, -0.0014657974, 0.03866577, -0.0029411316, 0.006828308]
```

### クエリーの埋め込み処理
```python:クエリーの定義
query1 = ["ベクトルデータベースとは？"]
```
```python:クエリー1の埋め込み生成
embed_text_detail.input_type = "SEARCH_QUERY" # 検索クエリー
embed_text_detail.inputs = query1
query_embedding1 = generative_ai_inference_client.embed_text(embed_text_detail)
# レスポンスオブジェクトから埋め込みベクトルを抽出
query_vector1 = np.array(query_embedding1.data.embeddings[0])
```
### 類似性検索の実行
```python:類似度スコア（コサイン類似度）の計算
scores = np.dot(query_vector1, np.transpose(doc_embedding_vectors))
```
Cohere Embed 3 は、類似度のメトリックとしてコサイン類似度を使うように学習されています。また、Cohere Embed 3 が生成する埋め込みベクトルは、大きさ（長さ）が"1" に正規化されていますので、ベクトルの内積を計算することでコサインを求めることができます。
```python:類似度順に並べ替えて上位5件を抽出
top_n = 5
top_doc_idxs = np.argsort(-scores)[:top_n] # scores の要素を降順にソートしてインデックスを返す
```
```python:結果の表示
# Pandas Dataframe を使って結果を表示
df = pd.DataFrame({
    'ランク': range(1, top_n + 1),
    'スコア': [f"{scores[i]:.4f}" for i in top_doc_idxs],
    'ドキュメント': [documents[i] for i in top_doc_idxs]
})
# スコアの最小値と最大値に基づいて色付けを行う
def color_scale(val):
    score = float(val)
    color = f'background-color: rgba(255, 99, 71, {score:.2f})'  # 赤色のグラデーション
    return color

# データフレームを表示（ヒートマップスタイル）
display(df.style
        .map(color_scale, subset=['スコア']) 
        .set_properties(**{'text-align': 'left'})
        .set_table_styles([
            {'selector': 'th', 'props': [('text-align', 'left'), ('font-weight', 'bold'), ('white-space', 'nowrap')]},
            {'selector': '.row_heading, .blank', 'props': [('display', 'none')]},
            {'selector': 'td', 'props': [('padding', '5px')]}
        ]))

```
出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/bea50a91-e02a-45f6-94d9-af00eff24fcc.png)


**検索対象となるドキュメント群**
| ID | ドキュメント |
|----|------------|
| 1 | COVID-19には多くの症状があります。 |
| 2 | COVID-19の症状は悪いです。 |
| 3 | COVID-19の症状は良くありません |
| 4 | COVID-19の症状はいろいろです |
| 5 | COVID-19の症状は悪いです。5Gの機能には、より広範なサービスカバレッジ、より多くの利用可能な接続数、および低電力消費が含まれます。 |
| 6 | COVID-19はウイルスによって引き起こされる病気です。最も一般的な症状は発熱、悪寒、および喉の痛みですが、他にもさまざまな症状があります。 |
| 7 | COVID-19の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。 |
| 8 | 認知症には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。 |
| 9 | COVID-19には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。 |
| 10 | COBIT 2019は政府のデジタル・ガバメント計画を支えるガバナンス態勢を整備する際の最適な枠組みです。 |
| 11 | 新型コロナ感染症の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。 |
| 12 | 鳥インフルエンザの症状には、高熱、咳、筋肉の痛み、倦怠感、頭痛、その他の症状が含まれます。 |
| 13 | COVID-19は、SARS-CoV-2（新型コロナウイルス）によって引き起こされる感染症です。2019年12月に最初に確認され、その後、世界的なパンデミックとなりました。症状としては、発熱、咳、息切れ、倦怠感、嗅覚や味覚の喪失などがあります。また、感染経路は、主に飛沫感染と接触感染ですが、空気感染の可能性もあります。高齢者や基礎疾患のある方は重症化リスクが高く、死亡率も高いとされています。COVID-19に対しては、ワクチン接種や手洗い、マスク着用、ソーシャルディスタンスなどの予防措置が推奨されています。パンデミックは世界中の医療システムや経済に大きな影響を与えました。 |
| 14 | SGDs（持続可能な開発目標）は、2015年に国連加盟国によって採択された「持続可能な開発のための2030アジェンダ」の中核を成す17の国際目標です。 |
| 15 | ベクトルデータベースは、データをベクトル（数値の配列）として表現し、ベクトル間の類似性に基づいて検索や分析を行うことに特化したデータベースシステムです。 |
| 16 | 著名なベクトルデータベースには、ChromaDB、Faiss、Pinecone、Annoy、Oracle Database 23ai AI Vector Search などがあります。 |
| 17 | ベクトルデータベースには、効率的な検索のためにHNSWのような近似最近傍検索アルゴリズムを採用しているものがあります。 |
| 18 | 近似最近傍検索は、高次元空間内で与えられたクエリポイントに最も近い（最も類似した）データポイントを効率的に見つけるアルゴリズムです。 |
| 19 | Oracle Databaseとは、米国オラクル が開発・販売している、リレーショナル・データベース管理システム のことです |

**検索クエリー**

|**クエリー**|
|----|
|ベクトルデータベースとは？|

**類似性検索の結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/9b66db8d-b7e0-4660-9260-03dc04c060d1.png)

クエリーの"ベクトルデータベースとは？"とい文と関連のある（似た）順に5つの文が表示されています。
キーワード検索と異なりベクトルの距離が近い順（ベクトルが同じ方向を向いている順）に選び出されるため5番目のように **全く関係のないドキュメントも検索結果に含まれます**。

## その２）テキストの類似性検索（近似最近傍検索とは？）
次は、クエリーを変えて検索してみます。
コードは先程と異なる部分のみ記載します。

```python:クエリーの定義
query2 = ["近似最近傍検索とは？"]
```


**検索クエリー**

|**クエリー**|
|----|
|近似最近傍検索とは？|

**類似性検索の結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/cfcfaf92-2589-4fd9-beda-64541ef1dfd3.png)

## その３）複数クエリーの埋め込みベクトルの平均による類似性検索
次は、複数のクエリーの埋め込みベクトルの平均をクエリーとして検索してみます。
コードは先程と異なる部分のみ記載します。

```python:クエリーの定義
query1 = ["ベクトルデータベースとは？"]
query2 = ["近似最近傍検索とは？"]
```
```python:クエリー1、2の埋め込み実行
embed_text_detail.input_type = "SEARCH_QUERY" # 検索クエリー
embed_text_detail.inputs = query1
query_embedding1 = generative_ai_inference_client.embed_text(embed_text_detail)
embed_text_detail.inputs = query2
query_embedding2 = generative_ai_inference_client.embed_text(embed_text_detail)
```
```python:クエリー1、2の埋め込みの平均を計算
query_vector1 = np.array(query_embedding1.data.embeddings[0])
query_vector2 = np.array(query_embedding2.data.embeddings[0])
avg_query_vector = (query_vector1 + query_vector2) / 2
print(f"埋め込みの平均のノルム（ベクトルの長さ）: {np.linalg.norm(avg_query_vector)}")
query_embedding_vector = avg_query_vector / np.linalg.norm(avg_query_vector)
print(f"正規化した埋め込みのノルムベクトルの長さ）: {np.linalg.norm(query_embedding_vector)}")
```
:::note
ベクトルの平均を取るとベクトルの大きさが変わってしまいます。今回のコードでは、埋め込みベクトルの大きさが"1"に正規化されていることを前提にコサイン類似度を２つのベクトルの内積で計算しています。そのため、平均して得られたベクトルをここで正規化しています。
`np.linalg.norm` はNumPyライブラリの線形代数（Linear Algebra）モジュールに含まれる関数で、ベクトルやマトリックスのノルム（norm）を計算するために使用されます。ノルムとは、ベクトルの「大きさ」や「長さ」を表す指標です。
:::
```bash:出力例
埋め込みの平均のノルム（ベクトルの長さ）: 0.8370894665025899
正規化した埋め込みのノルムベクトルの長さ）: 0.9999999999999999
```

**検索クエリー**

|**クエリー（以下の２つの埋め込みの平均）**|
|----|
|ベクトルデータベースとは？|
|近似最近傍検索とは？|

**類似性検索の結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/2faec3e8-e658-43b7-8703-e9ecd7d21bd3.png)

## その４）テキストのクロスリンガル（言語跨りの）類似性検索
次は、クエリーの言語を変えて検索してみます。検索対象のドキュメント群は日本語のままです。
コードはその１と異なる部分のみ記載します。


```python:クエリーの定義
query1 = ["What is a vector database?"]
#query1 = ["¿Qué es una base de datos vectorial?"] #スペイン語
```

**検索クエリー**

|**クエリー**|
|----|
|What is a vector database?|

**クロスリンガル（言語跨りの）類似性検索の結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/24e4160a-10ee-4131-a529-bee5e4b0df4e.png)

:::note
今回使用した cohere.embed-multilingual-v3.0 のような多言語対応の埋め込みモデルを使うことで、検索対象のドキュメント群と検索クエリーが異なる言語であっても検索できることがかわりました。
:::
:::note warn
しかし、スコア列に表示されている類似度（コサイン類似度）を見ると、その１の日本語対日本語の場合に較べて低い値になっています。求められる精度によっては、言語ごとにドキュメント群を用意したおいた方が良い可能性があります。また、ドキュメント群に複数言語が混在していた場合にどうなるかは次のその５で検証してみます。
:::

## その５）日本語英語混在ドキュメント群に対する類似性検索
次は、ドキュメント群に中に日本語と英語のドキュメントが混在している場合に、日本語のクエリーで検索した場合を検証してみます。
コードはその１と異なる部分のみ記載します。

### 検索対象のドキュメントの定義（日本語英語混在）
```python:
documents = [
    "COVID-19には多くの症状があります。",
    "COVID-19の症状は悪いです。",
    "COVID-19の症状は良くありません",
    "COVID-19の症状はいろいろです",
    "COVID-19の症状は悪いです。5Gの機能には、より広範なサービスカバレッジ、より多くの利用可能な接続数、および低電力消費が含まれます。",
    "COVID-19はウイルスによって引き起こされる病気です。最も一般的な症状は発熱、悪寒、および喉の痛みですが、他にもさまざまな症状があります。",
    "COVID-19の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。",
    "認知症には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。",
    "COVID-19には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。",
    "COBIT 2019は政府のデジタル・ガバメント計画を支えるガバナンス態勢を整備する際の最適な枠組みです。",
    "新型コロナ感染症の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。",
    "鳥インフルエンザの症状には、高熱、咳、筋肉の痛み、倦怠感、頭痛、その他の症状が含まれます。",
    "COVID-19は、SARS-CoV-2（新型コロナウイルス）によって引き起こされる感染症です。2019年12月に最初に確認され、その後、世界的なパンデミックとなりました。症状としては、発熱、咳、息切れ、倦怠感、嗅覚や味覚の喪失などがあります。また、感染経路は、主に飛沫感染と接触感染ですが、空気感染の可能性もあります。高齢者や基礎疾患のある方は重症化リスクが高く、死亡率も高いとされています。COVID-19に対しては、ワクチン接種や手洗い、マスク着用、ソーシャルディスタンスなどの予防措置が推奨されています。パンデミックは世界中の医療システムや経済に大きな影響を与えました。",
    "SGDs（持続可能な開発目標）は、2015年に国連加盟国によって採択された「持続可能な開発のための2030アジェンダ」の中核を成す17の国際目標です。",
    "ベクトルデータベースは、データをベクトル（数値の配列）として表現し、ベクトル間の類似性に基づいて検索や分析を行うことに特化したデータベースシステムです。",
    "著名なベクトルデータベースには、ChromaDB、Faiss、Pinecone、Annoy、Oracle Database 23ai AI Vector Search などがあります。",
    "ベクトルデータベースには、効率的な検索のためにHNSWのような近似最近傍検索アルゴリズムを採用しているものがあります。",
    "近似最近傍検索は、高次元空間内で与えられたクエリポイントに最も近い（最も類似した）データポイントを効率的に見つけるアルゴリズムです。",
    "Oracle Databaseとは、米国オラクル が開発・販売している、リレーショナル・データベース管理システム のことです",
    "COVID-19 has many symptoms.",
    "The symptoms of COVID-19 are bad.",
    "The symptoms of COVID-19 are not good.",
    "The symptoms of COVID-19 are various.",
    "The symptoms of COVID-19 are bad. The features of 5G include broader service coverage, more available connections, and low power consumption.",
    "COVID-19 is a disease caused by a virus. The most common symptoms are fever, chills, and sore throat, but there are various other symptoms as well.",
    "Symptoms of COVID-19 include various symptoms such as fever, chills, new persistent cough, and loss or change in sense of smell or taste.",
    "Dementia has the following symptoms: experiencing memory loss, decreased judgment, and confusion.",
    "COVID-19 has the following symptoms: experiencing memory loss, decreased judgment, and confusion.",
    "COBIT 2019 is the optimal framework for establishing governance systems that support government digital government plans.",
    "Symptoms of novel coronavirus infection include various symptoms such as fever, chills, new persistent cough, and loss or change in sense of smell or taste.",
    "Symptoms of bird flu include high fever, cough, muscle pain, fatigue, headache, and other symptoms.",
    "COVID-19 is an infectious disease caused by SARS-CoV-2 (novel coronavirus). It was first identified in December 2019 and subsequently became a global pandemic. Symptoms include fever, cough, shortness of breath, fatigue, and loss of smell or taste. The infection routes are mainly droplet transmission and contact transmission, but airborne transmission is also possible. Elderly people and those with underlying medical conditions have a higher risk of severe illness and mortality. Preventive measures recommended for COVID-19 include vaccination, hand washing, wearing masks, and social distancing. The pandemic has had a significant impact on healthcare systems and economies worldwide.",
    "SGDs (Sustainable Development Goals) are 17 international goals that form the core of the '2030 Agenda for Sustainable Development' adopted by United Nations member states in 2015.",
    "A vector database is a database system specialized in representing data as vectors (arrays of numbers) and performing searches and analyses based on similarities between vectors.",
    "Notable vector databases include ChromaDB, Faiss, Pinecone, Annoy, Oracle Database 23ai AI Vector Search, and others.",
    "Some vector databases employ approximate nearest neighbor search algorithms such as HNSW for efficient searching.",
    "Approximate nearest neighbor search is an algorithm that efficiently finds the closest (most similar) data points to a given query point in high-dimensional space.",
    "Oracle Database is a relational database management system developed and sold by Oracle Corporation in the United States."
]
```
### クエリーの定義
```python
query1 = ["ベクトルデータベースとは？"]
```


**検索対象となるドキュメント群**
| ID | ドキュメント |
|----|------------|
| 1 | COVID-19には多くの症状があります。 |
| 2 | COVID-19の症状は悪いです。 |
| 3 | COVID-19の症状は良くありません |
| 4 | COVID-19の症状はいろいろです |
| 5 | COVID-19の症状は悪いです。5Gの機能には、より広範なサービスカバレッジ、より多くの利用可能な接続数、および低電力消費が含まれます。 |
| 6 | COVID-19はウイルスによって引き起こされる病気です。最も一般的な症状は発熱、悪寒、および喉の痛みですが、他にもさまざまな症状があります。 |
| 7 | COVID-19の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。 |
| 8 | 認知症には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。 |
| 9 | COVID-19には以下の症状があります。記憶喪失、判断力の低下、および混乱を経験すること。 |
| 10 | COBIT 2019は政府のデジタル・ガバメント計画を支えるガバナンス態勢を整備する際の最適な枠組みです。 |
| 11 | 新型コロナ感染症の症状には、発熱や悪寒、新しい持続的な咳、嗅覚や味覚の喪失や変化など、さまざまな症状が含まれます。 |
| 12 | 鳥インフルエンザの症状には、高熱、咳、筋肉の痛み、倦怠感、頭痛、その他の症状が含まれます。 |
| 13 | COVID-19は、SARS-CoV-2（新型コロナウイルス）によって引き起こされる感染症です。2019年12月に最初に確認され、その後、世界的なパンデミックとなりました。症状としては、発熱、咳、息切れ、倦怠感、嗅覚や味覚の喪失などがあります。また、感染経路は、主に飛沫感染と接触感染ですが、空気感染の可能性もあります。高齢者や基礎疾患のある方は重症化リスクが高く、死亡率も高いとされています。COVID-19に対しては、ワクチン接種や手洗い、マスク着用、ソーシャルディスタンスなどの予防措置が推奨されています。パンデミックは世界中の医療システムや経済に大きな影響を与えました。 |
| 14 | SGDs（持続可能な開発目標）は、2015年に国連加盟国によって採択された「持続可能な開発のための2030アジェンダ」の中核を成す17の国際目標です。 |
| 15 | ベクトルデータベースは、データをベクトル（数値の配列）として表現し、ベクトル間の類似性に基づいて検索や分析を行うことに特化したデータベースシステムです。 |
| 16 | 著名なベクトルデータベースには、ChromaDB、Faiss、Pinecone、Annoy、Oracle Database 23ai AI Vector Search などがあります。 |
| 17 | ベクトルデータベースには、効率的な検索のためにHNSWのような近似最近傍検索アルゴリズムを採用しているものがあります。 |
| 18 | 近似最近傍検索は、高次元空間内で与えられたクエリポイントに最も近い（最も類似した）データポイントを効率的に見つけるアルゴリズムです。 |
| 19 | Oracle Databaseとは、米国オラクル が開発・販売している、リレーショナル・データベース管理システム のことです |
| 20 | COVID-19 has many symptoms. |
| 21 | The symptoms of COVID-19 are bad. |
| 22 | The symptoms of COVID-19 are not good. |
| 23 | The symptoms of COVID-19 are various. |
| 24 | The symptoms of COVID-19 are bad. The features of 5G include broader service coverage, more available connections, and low power consumption. |
| 25 | COVID-19 is a disease caused by a virus. The most common symptoms are fever, chills, and sore throat, but there are various other symptoms as well. |
| 26 | Symptoms of COVID-19 include various symptoms such as fever, chills, new persistent cough, and loss or change in sense of smell or taste. |
| 27 | Dementia has the following symptoms: experiencing memory loss, decreased judgment, and confusion. |
| 28 | COVID-19 has the following symptoms: experiencing memory loss, decreased judgment, and confusion. |
| 29 | COBIT 2019 is the optimal framework for establishing governance systems that support government digital government plans. |
| 30 | Symptoms of novel coronavirus infection include various symptoms such as fever, chills, new persistent cough, and loss or change in sense of smell or taste. |
| 31 | Symptoms of bird flu include high fever, cough, muscle pain, fatigue, headache, and other symptoms. |
| 32 | COVID-19 is an infectious disease caused by SARS-CoV-2 (novel coronavirus). It was first identified in December 2019 and subsequently became a global pandemic. Symptoms include fever, cough, shortness of breath, fatigue, and loss of smell or taste. The infection routes are mainly droplet transmission and contact transmission, but airborne transmission is also possible. Elderly people and those with underlying medical conditions have a higher risk of severe illness and mortality. Preventive measures recommended for COVID-19 include vaccination, hand washing, wearing masks, and social distancing. The pandemic has had a significant impact on healthcare systems and economies worldwide. |
| 33 | SGDs (Sustainable Development Goals) are 17 international goals that form the core of the '2030 Agenda for Sustainable Development' adopted by United Nations member states in 2015. |
| 34 | A vector database is a database system specialized in representing data as vectors (arrays of numbers) and performing searches and analyses based on similarities between vectors. |
| 35 | Notable vector databases include ChromaDB, Faiss, Pinecone, Annoy, Oracle Database 23ai AI Vector Search, and others. |
| 36 | Some vector databases employ approximate nearest neighbor search algorithms such as HNSW for efficient searching. |
| 37 | Approximate nearest neighbor search is an algorithm that efficiently finds the closest (most similar) data points to a given query point in high-dimensional space. |
| 38 | Oracle Database is a relational database management system developed and sold by Oracle Corporation in the United States. |


**検索クエリー**

|**クエリー**|
|----|
|ベクトルデータベースとは？|

**日本語英語混在ドキュメント群に対する類似性検索の結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/7fff5113-19a0-4eb0-9af9-154dec8686d1.png)

:::note warn
クエリーと同じ言語のドキュメントの方が高い類似度を持つと判定されています。ランク=5 の英語ドキュメントは、ランク=1の日本語ドキュメントと意味内容は同じですが、ランク=2,3,4 の日本語ドキュメントよりも低い類似度と判定されています。
:::

## その６）ドキュメントの品質が考慮されている？単純に質問文に似ている？
質問応答システムなどの場合は、単純にも字面が似ているドキュメントを見つけ出しても質問に答えられないケースが多くあります。さて、cohere.embed-multilingual-v3.0 ではどうなるでしょうか？

ドキュメント群中に字面だけよく似た情報量の少ないドキュメントた多数あるクエリーを投げて、どうなるか見てみましょう。

コードはその１と異なる部分のみ記載します。
（検索対象ドキュメントは、その１と同じものに戻してあるものとします）

```python:
query1 = ["COVID-19の症状は？"]
```

**検索クエリー**

|**クエリー**|
|----|
|COVID-19の症状は？|

ドキュメント群には以下のようなクエリーに字面は似ているものの、クエリーの質問に答えるためにはあまり役立たないドキュメントが多く含まれています。

| ID | ドキュメント |
|----|------------|
| 1 | COVID-19には多くの症状があります。 |
| 2 | COVID-19の症状は悪いです。 |
| 3 | COVID-19の症状は良くありません |
| 4 | COVID-19の症状はいろいろです |

**類似性検索の結果**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/c3094075-2628-4a8b-94ce-a8ddb9f40cc3.png)

:::note
cohere.embed-multilingual-v3.0 は、埋め込みを活用するタスクに応じて5つの入力タイプがあります。
|入力タイプ|用途|
|-|-|
|`SEARCH_DOCUMENT`|類似性検索の際の検索対象ドキュメント|
|`SEARCH_QUERY`|類似性検索の際の検索クエリー|
|`CLASSIFICATION`|分類|
|`CLUSTERING`|クラスタリング|
|`IMAGE`|画像|

試しに、その６のドキュメント群とクエリーの組みあわせでドキュメントう埋め込む際にも入力タイプを`SEARCH_QUERY`にすると下記のように字面が似たドキュメントを上位にランクします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/13d4f348-dea2-4f4c-9bf4-db8cc79a8ac3.png)

Cohere Embed 3 では、入力タイプを適切に設定することで単に字面が似ているだけではない品質に考慮したドキュメントの検索ができています
:::

# あとがき
「はじめに」で[Cohere 社のブログ](https://cohere.com/blog/introducing-embed-v3)には Cohere Embed 3 は、単に似たテキストを探すだけではなく、クエリがドキュメントのトピックにどれだけマッチしているかを評価し、コンテンツの全体的な品質を評価する機能があると書かれていることに触れました。その６の検証によると確かに字面だけでなくこの検索結果を元にクエリーへの回答を作成（RAG なら LLM が生成）するのに役立つドキュメントに高いスコアが与えられることがわかりました。入力タイプの設定大切ですね！

<iframe width="560" height="315" src="https://www.youtube.com/embed/efuOgCWGjHc?si=WQWT2ew7QjOMr35U" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>