1710070313
2024-03-09 21:03:57
Web サイトにセマンティック検索を組み込むと、コンテンツの発見可能性が大幅に向上します。 セマンティック検索は、Optimizely の「コンテンツ グラフ」のほか、Algolia、Coveo、Hawksearch などの専用検索プロバイダーで利用できる機能です。
主に知識を得るために、他にどのようなオプションがあるのかを調査したいと思いましたが、ソリューションを開発して、使用されている ML モデルを制御できるかどうかを確認することも目的でした。
これまでのところ、私はほんの表面をなぞっただけですが、多くのことを学んだので、このブログ投稿を通じてこの知識を共有したいと思いました。 デモ アプリケーションも作成しました。これは GitHub (https://github.com/andrewmarkham/Machine-Learning)。
使用されるテクノロジー
大規模言語モデル (LLM) とベクトル データベースは、セマンティック/ニューラル検索ソリューションを構築するための基礎要素です。
AI / ML アプリケーションの開発では Python が主流の言語ですが、Java と Javascript も十分にサポートされています。 デモアプリケーションにはJavaScriptを使用しました。
大規模な言語モデル
大規模言語モデルは自然言語を処理するために使用され、文の類似性などのさまざまなタスクを実行するようにトレーニングされます。 モデルは入力テキストをベクトル埋め込みに変換し、クエリのためにベクトル データベースに保存します。
ベクトル埋め込みは、ソース データ (テキスト、画像など) を多次元数値配列として表現します。 データの次元数と表現はモデルに固有であるため、インデックス作成およびクエリを実行するときにモデルを混合して一致させることはできません。
のモデルを使用しています ハグフェイス; この Web サイトは、さまざまなモデルやデータセットにアクセスするための素晴らしいリソースです。
ベクターデータベース
ベクトル データベースにはデータが保存されます (テキストは埋め込みに変換され、永続化されます)。 クエリ (セマンティック検索) を実行するには、検索クエリを埋め込みに変換し、その埋め込みを使用してデータベースに対してクエリを実行します。
ベクトル データベースを入手する場合、多くのオプションがあります。 Mongo DB と ElasticSearch にはこの機能が含まれるようになりました。専用のサービスを検討している場合は、Pinecone と Milvus が 2 つの選択肢になります。 私のデモ アプリケーションでは、「pgvector」拡張機能を有効にして Postgres を使用しています。 これによりベクターのサポートが追加され、Docker コンテナー内で実行できるようになります。
デモアプリケーション
次の 2 つの機能を示すアプリケーションを作成しました。
- テキスト入力から埋め込みを作成し、データベースに保存する方法
- コンテンツを意味的に検索する方法。
データベースを作成する
docker-compose.yml
services:
db:
hostname: db
image: ankane/pgvector1
ports:
- 5432:5432
restart: always
environment:
- POSTGRES_DB=vectordb
- POSTGRES_USER=testuser
- POSTGRES_PASSWORD=testpwd
- POSTGRES_HOST_AUTH_METHOD=trust
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
を作成します。 docker-compose.yml 上記のファイルを指定し、コマンドを使用してインスタンスを起動します。 docker-compose up -d。 これにより、新しいコンテナが起動され、データベースが初期化されます。
/* This file is used to initialise the vector extension in the database */
CREATE EXTENSION IF NOT EXISTS vector;CREATE TABLE IF NOT EXISTS Articles (
id SERIAL PRIMARY KEY,
embedding vector(384), /* 384 is the dimension of the Embedding model */
text text,
created_at timestamptz DEFAULT now()
);
インデックス作成と検索
デモ アプリケーションには、node.js サービス (search-server) 1) テキストのインデックスを作成し、2) コンテンツを検索します。 これらの関数は両方とも、ハグフェイス推論ライブラリを使用します (以下を参照)。 https://github.com/huggingface/huggingface.js)。
インデックス作成
app.post('/', async (req: Request, res: Response) => {
const { text, id } = req.body;const hfInference = new HfInference(HUGGINGFACE);
const embeddings = await hfInference.featureExtraction({
model: "intfloat/e5-small-v2",
inputs: `passage: ${text}`
}) as [];
await addRecordToTable(text, embeddings);
// Send a response
res.status(200).json({ message: 'Data received successfully' });
});
上記の強調表示されたコードは、huggingface API を使用して埋め込みを生成します。 ‘モデル‘ パラメータは、どの ML モデルを使用するかを Huggingface に通知します。入力‘ パラメータは、埋め込みの作成に使用されるテキストです。
注記: ‘通路‘ プレフィックスは、モデルに必要なディレクティブです。
async function addRecordToTable(text, embeddings:[]) {// Get a PostgreSQL connection pool
var pool = getPool();
const client = await pool.connect();
var s = JSON.stringify(embeddings);
try {
await client.query('BEGIN');
await client.query('INSERT INTO Articles (text, embedding) VALUES ($1, $2)', [text, s]);
await client.query('COMMIT');
console.log('Record added successfully!');
} catch (error) {
await client.query('ROLLBACK');
console.error('Error adding record:', error);
} finally {
client.release();
}
};
上記のコードは、テキストと関連する埋め込みをデータベースに追加します。
検索中
app.get('/search', async (req: Request, res: Response) => {
const { text } = req.query;if (typeof text === "string") {
const hfInference = new HfInference(HUGGINGFACE)
const embeddings = await hfInference.featureExtraction({
model: "intfloat/e5-small-v2",
inputs: `query: ${text}`
}) as [];
var results = await query(embeddings);
res.status(200).json(results.rows);
}
else {
console.log("text is not a string");
res.status(500).json({ message: 'text is not a string' });
}
});
検索は非常に簡単です。 送信された検索フレーズは埋め込みの作成に使用され、その後データベースのクエリに使用されます。
注記: 接頭辞 ‘クエリ‘ は、ML モデルに必要なもう 1 つのディレクティブです。
async function query(embeddings:[]) {
// Get a PostgreSQL connection pool
var pool = getPool();const client = await pool.connect();
var s = JSON.stringify(embeddings);
try {
await client.query('BEGIN');
const res = await client.query('SELECT text, 1 - (embedding <=> $1) AS cosine_similarity FROM Articles ORDER BY cosine_similarity desc LIMIT 5', [s]);
await client.query('COMMIT');
return res;
} catch (error) {
await client.query('ROLLBACK');
console.error('Error executing query:', error);
} finally {
client.release();
}
}
上記のメソッドには、データベースに対して実行され、検索フレーズに類似したレコードを返す SQL クエリが含まれています。
お気づきかもしれませんが、<=>‘ 演算子; これは「コサイン距離」を意味し、類似性を判断するために使用される計算です。 この例では、結果が 1.0 に近いほど、一致度が高くなります。
他のオプションは次のとおりです。
| オペレーター | 説明 |
|---|---|
| + | 要素ごとの加算 |
| – | 要素ごとの減算 |
| * | 要素ごとの乗算 |
| <-> | ユークリッド距離 |
| <#> | 負の内積 |
| <=> | コサイン距離 |
注記: 一部の ML モデルは特定の演算子でのみ機能します
取り上げられている概念について詳しく説明することは、このブログの範囲を超えています。 より詳細な情報が必要な場合は、ブログの最後に他のWebサイトへのリンクを貼り付けています。
デモ
以下のビデオは、デモ アプリケーションのさまざまなセマンティック検索機能を示しています。
デモ サイト、テスト データ、およびテスト データにインデックスを付けるための Postman コレクションはすべて GitHub リポジトリで利用できます。 https://github.com/andrewmarkham/Machine-Learning
結論
私は常に、セマンティック検索や AI 関連のものはサードパーティ サービスの使用に限定されていると考えてきましたが、このブログ投稿が示すように、そうではありません。
これは、認知された検索プロバイダーを使用するのではなく、独自のセマンティック検索ソリューションを構築することを推奨するという意味ではありません。 むしろ、既存の検索を拡張したり、分類や画像/音声検索などの他のユースケースを提供したりすることもできます。
このブログ投稿では、非常に高いレベルで概念を説明します。 私はこの主題分野と、それを使用して独自のソリューションを構築する方法についてさらに学び始めています。 より多くの知識を獲得し、これらのツールを自分で活用する方法を学ぶために、インターネット上で豊富な情報が入手できます。
OpenAI はないのですか?
OpenAI について触れずに AI に関するブログ記事を書くことはできません。
OpenAI を使用して埋め込みを作成することもできますが、代替手段を示したかったので、ここでは使用しませんでした。 ベクトルデータベースについても同様です。 他にも多くのオプションが用意されており、 松ぼっくり リーダーの一人のようです。
役立つリンク
#独自のセマンティック検索実装を構築するjhoose