
類似性SearchKitは、わずか数行でiOSおよびMACOSアプリケーションのデバイス上のテキストの埋め込みとセマンティック検索機能を可能にする迅速なパッケージです。速度、拡張性、プライバシーを強調すると、最先端のさまざまなNLPモデルと類似性メトリックをサポートします。

類似性searchkitのいくつかの潜在的なユースケースは次のとおりです。
プライバシー中心のドキュメント検索エンジン:ユーザーデータを外部サービスに公開することなく、機密文書をローカルで処理する検索エンジンを作成します。 (例ディレクトリのプロジェクト「ChatwithFilesexample」の例を参照してください。)
オフラインの質問回答システム:ローカルデータセット内のユーザーのクエリに最も関連性の高い回答を見つける質問回答システムを実装します。
ドキュメントクラスタリングと推奨エンジン:エッジ上のテキストコンテンツに基づいてドキュメントを自動的にグループ化および整理します。
類似性のSearchKitを活用することにより、開発者は機能やパフォーマンスの主要なトレードオフなしでデータを自宅に近づける強力なアプリケーションを簡単に作成できます。
SimpalitySearchKitをインストールするには、Swift Package Managerを使用してSwiftプロジェクトへの依存関係として追加するだけです。 Xcodeメソッドを個人的に使用することをお勧めします。
File → Add Packages... → Search or Enter Package Url → https://github.com/ZachNagengast/similarity-search-kit.git
Xcodeは、追加するモデルを選択するための次のオプションを提供する必要があります(選択するために以下の利用可能なモデルを参照してください):

Package.swift経由で追加する場合は、依存関係配列に次の行を追加します。
. package ( url : " https://github.com/ZachNagengast/similarity-search-kit.git " , from : " 0.0.1 " )次に、適切なターゲット依存関係を目的のターゲットに追加します。
. target ( name : " YourTarget " , dependencies : [
" SimilaritySearchKit " ,
" SimilaritySearchKitDistilbert " ,
" SimilaritySearchKitMiniLMMultiQA " ,
" SimilaritySearchKitMiniLMAll "
] )利用可能なモデルのサブセットのみを使用する場合は、対応する依存関係を省略できます。これにより、最終的なバイナリのサイズが小さくなります。
プロジェクトで類似性searchkitを使用するには、最初にフレームワークをインポートします。
import SimilaritySearchKit次に、目的の距離メトリックと埋め込みモデルを使用して、類似性のインスタンスのインスタンスを作成します(オプションについては以下を参照):
let similarityIndex = await SimilarityIndex (
model : NativeEmbeddings ( ) ,
metric : CosineSimilarity ( )
)次に、インデックスに検索可能にしたいテキストを追加します。
await similarityIndex . addItem (
id : " id1 " ,
text : " Metal was released in June 2014. " ,
metadata : [ " source " : " example.pdf " ]
)最後に、最も類似したアイテムのインデックスを特定のクエリにクエリします。
let results = await similarityIndex . search ( " When was metal released? " )
print ( results ) searchResultアレイを出力します: [SearchResult(id: "id1", score: 0.86216, metadata: ["source": "example.pdf"])]
Examples Directoryには、類似性SearchKitを最大限に使用する方法を示すマルチサンプルiOSおよびMACOSアプリケーションが含まれています。
| 例 | 説明 | 要件 |
|---|---|---|
BasicExample | ハードコーディングされた文字列の小さなセットの類似性をインデックス化および比較する基本的なマルチプラットフォームアプリケーション。 | iOS 16.0+、macOS 13.0+ |
PDFExample | 個々のPDFファイルのコンテンツでセマンティック検索を可能にするMAC触媒アプリケーション。 | iOS 16.0+ |
ChatWithFilesExample | コンピューター上の任意/すべてのテキストファイルをインデックス作成する高度なMacOSアプリケーション。 | MacOS 13.0+ |
| モデル | 使用事例 | サイズ | ソース |
|---|---|---|---|
NaturalLanguage | テキストの類似性、より速い推論 | 組み込み | りんご |
MiniLMAll | テキストの類似性、最速の推論 | 46 MB | ハギングフェイス |
Distilbert | Q&A検索、最高の精度 | 86 MB(量子化) | ハギングフェイス |
MiniLMMultiQA | Q&A検索、最速の推論 | 46 MB | ハギングフェイス |
モデルはEmbeddingProtocolに準拠しており、 SimilarityIndexインデックスクラスと交換可能に使用できます。
事前に変換されたモデルの小規模で成長しているリストは、Huggingfaceのこのリポジトリにあります。リストに追加されたいモデルがある場合は、問題を開くか、プルリクエストを送信してください。
| メトリック | 説明 |
|---|---|
DotProduct | 2つのベクトル間の類似性をその大きさの積として測定します |
CosineSimilarity | 2つのベクトル間の角度のコサインを測定することにより、類似性を計算します |
EuclideanDistance | ユークリッド空間の2つのポイント間の直線距離を計算します |
メトリックはDistanceMetricProtocolに準拠しており、 SimilarityIndexクラスと同じ意味で使用できます。
SimilarityIndexのすべての主要部分は、次のプロトコルに準拠したカスタム実装を使用してオーバーライデンにすることができます。
文字列を受け入れ、入力テキストの埋め込みを表すフロートの配列を返します。
func encode ( sentence : String ) async -> [ Float ] ?クエリの埋め込みベクトルと埋め込みベクトルのリストを受け入れ、距離メトリックスコアのタプルと最も近い隣接のインデックスを返します。
func findNearest ( for queryEmbedding : [ Float ] , in neighborEmbeddings : [ [ Float ] ] , resultsCount : Int ) -> [ ( Float , Int ) ]特定の重複して、特定のサイズのチャンクに文字列を分割します。これは、長いドキュメントを埋め込むための小さなチャンクに分割するのに役立ちます。チャンクのリストと、各チャンクのトークンサイドのオプションのリストを返します。
func split ( text : String , chunkSize : Int , overlapSize : Int ) -> ( [ String ] , [ [ String ] ] ? )テキストをトークン化して描写します。これを、現在のリストで利用できるものとは異なるトークンザーを使用するカスタムモデルに使用します。
func tokenize ( text : String ) -> [ String ]
func detokenize ( tokens : [ String ] ) -> Stringインデックスアイテムを保存およびロードします。デフォルトの実装ではJSONファイルを使用しますが、これはオーバーライデンであり、ストレージメカニズムを使用することができます。
func saveIndex ( items : [ IndexItem ] , to url : URL , as name : String ) throws -> URL
func loadIndex ( from url : URL ) throws -> [ IndexItem ]
func listIndexes ( at url : URL ) -> [ URL ] このプロジェクトの多くの部分は、既存のコードから派生したものであり、すでにSwiftにあるか、ChatGptのおかげでSwiftに翻訳されました。これらは、参照された主要なプロジェクトの一部です。
このプロジェクトは、ChatGptの出現に伴う自然言語サービスとアプリケーションの信じられないほどの進歩に触発されました。これらのサービスは、強力なテキストベースのアプリケーションのまったく新しい世界のロックを解除しましたが、多くの場合、クラウドサービスに依存しています。具体的には、多くの「データとのチャット」サービスでは、ユーザーが処理とストレージのためにリモートサーバーにデータをアップロードする必要があります。これは一部の人にとっては機能しますが、接続性環境の低い人や機密情報や機密情報の処理に最適ではないかもしれません。 Appleは同様のタスクのライブラリNaturalLanguageをバンドルしていますが、CoreMLモデル変換プロセスは、モデルとユースケースのはるかに幅広い配列を開きます。これを念頭に置いて、類似性SearchKitは、開発者がAppleエコシステム内で最先端のNLPアプリケーションを作成できるようにする堅牢でデバイス上のソリューションを提供することを目指しています。
将来のリリースのために計画されているいくつかの機能の短いリストを次に示します。
人々がこのライブラリをどのように使用し、どのような機能が役立つかを知りたいので、Twitter @Zachnagengastまたは電子メールZnagengast(at)Gmail(dot)comを介してお気軽にご連絡ください。