
マルチモーダルデータのデータ構造
現在表示しているReadmeは、Docarray> 0.30のためのものであり、Docarray 0.21からいくつかの重要な変更を導入しています。古いDocarray <= 0.21の使用を続けたい場合は、
pip install docarray==0.21を介してインストールしてください。詳細については、コードベース、ドキュメント、およびホットフィックスブランチを参照してください。
Docarrayは、マルチモーダルデータの表現、送信、ストレージ、および検索のために巧みに作成されたPythonライブラリです。マルチモーダルAIアプリケーションの開発に合わせて、その設計により、広範なPythonおよび機械学習エコシステムとのシームレスな統合が保証されます。 2022年1月の時点で、DocarrayはApacheライセンス2.0の下で公然と配布されており、現在、LF AI&Data Foundation内のSandboxプロジェクトのステータスを享受しています。
CLIからDocarrayをインストールするには、次のコマンドを実行します。
pip install -U docarray注Docarray <= 0.21を使用するには、
pip install docarray==0.21を介してインストールし、そのコードベースとドキュメントとホットフィックスブランチをチェックしてください。
Docarrayは初めてですか?ユースケースと背景に応じて、Docarrayについて学ぶ方法は複数あります。
Docarrayは、機械学習に本質的に順応している方法でデータを表現することができます。
これは、さまざまなシナリオにとって特に有益です。
Pydanticに精通していますか? DocarrayはPydanticの上に構築されているだけでなく、それとの完全な互換性を維持していることを知って喜んでいます。さらに、お客様のニーズに特化した特定のセクションがあります!
本質的に、Docarrayは、Python Dataclassesを反映する方法でデータ表現を促進し、機械学習は不可欠なコンポーネントです。
from docarray import BaseDoc
from docarray . typing import TorchTensor , ImageUrl
import torch
# Define your data model
class MyDocument ( BaseDoc ):
description : str
image_url : ImageUrl # could also be VideoUrl, AudioUrl, etc.
image_tensor : TorchTensor [ 1704 , 2272 , 3 ] # you can express tensor shapes!
# Stack multiple documents in a Document Vector
from docarray import DocVec
vec = DocVec [ MyDocument ](
[
MyDocument (
description = "A cat" ,
image_url = "https://example.com/cat.jpg" ,
image_tensor = torch . rand ( 1704 , 2272 , 3 ),
),
]
* 10
)
print ( vec . image_tensor . shape ) # (10, 1704, 2272, 3)Docarrayでデータをどのように表現できるかを詳しく見てみましょう。
from docarray import BaseDoc
from docarray . typing import TorchTensor , ImageUrl
from typing import Optional
import torch
# Define your data model
class MyDocument ( BaseDoc ):
description : str
image_url : ImageUrl # could also be VideoUrl, AudioUrl, etc.
image_tensor : Optional [
TorchTensor [ 1704 , 2272 , 3 ]
] = None # could also be NdArray or TensorflowTensor
embedding : Optional [ TorchTensor ] = Noneそのため、データの種類を定義できるだけでなく、テンソルの形状を指定することもできます。
# Create a document
doc = MyDocument (
description = "This is a photo of a mountain" ,
image_url = "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alpamayo.jpg" ,
)
# Load image tensor from URL
doc . image_tensor = doc . image_url . load ()
# Compute embedding with any model of your choice
def clip_image_encoder ( image_tensor : TorchTensor ) -> TorchTensor : # dummy function
return torch . rand ( 512 )
doc . embedding = clip_image_encoder ( doc . image_tensor )
print ( doc . embedding . shape ) # torch.Size([512])もちろん、ドキュメントをネストされた構造に作成できます。
from docarray import BaseDoc
from docarray . documents import ImageDoc , TextDoc
import numpy as np
class MultiModalDocument ( BaseDoc ):
image_doc : ImageDoc
text_doc : TextDoc
doc = MultiModalDocument (
image_doc = ImageDoc ( tensor = np . zeros (( 3 , 224 , 224 ))), text_doc = TextDoc ( text = 'hi!' )
)特に機械学習アプリケーションでは、一度に単一のデータポイントを使用することはめったにありません。そのため、複数のDocumentsを簡単に収集できます。
Documentsを収集しますMLシステムを構築または対話するときは、通常、複数のドキュメント(データポイント)を一度に処理する必要があります。
Docarrayは、これのために2つのデータ構造を提供しています。
DocVec : Documentsのベクトル。ドキュメント内のすべてのテンソルは、単一のテンソルに積み重ねられます。 MLモデル内でのバッチ処理と使用に最適です。DocList : Documentsのリスト。ドキュメント内のすべてのテンソルは、そのまま保持されます。データのストリーミング、再ランク、シャッフルに最適です。 DocVecから始めて、それらを見てみましょう。
from docarray import DocVec , BaseDoc
from docarray . typing import AnyTensor , ImageUrl
import numpy as np
class Image ( BaseDoc ):
url : ImageUrl
tensor : AnyTensor # this allows torch, numpy, and tensor flow tensors
vec = DocVec [ Image ]( # the DocVec is parametrized by your personal schema!
[
Image (
url = "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alpamayo.jpg" ,
tensor = np . zeros (( 3 , 224 , 224 )),
)
for _ in range ( 100 )
]
)上記のコードスニペットでは、 DocVec 、使用するドキュメントの種類によってパラメーター化されています: DocVec[Image] 。
これは最初は奇妙に見えるかもしれませんが、すぐに慣れると確信しています!その上、それはあなたがあなたのドキュメントで定義したフィールドに大量にアクセスするなど、いくつかのクールなことをすることができます:
tensor = vec . tensor # gets all the tensors in the DocVec
print ( tensor . shape ) # which are stacked up into a single tensor!
print ( vec . url ) # you can bulk access any other field, too 2番目のデータ構造であるDocList 、同様の方法で動作します。
from docarray import DocList
dl = DocList [ Image ]( # the DocList is parametrized by your personal schema!
[
Image (
url = "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alpamayo.jpg" ,
tensor = np . zeros (( 3 , 224 , 224 )),
)
for _ in range ( 100 )
]
)引き続きドキュメントのフィールドにアクセスできます。
tensors = dl . tensor # gets all the tensors in the DocList
print ( type ( tensors )) # as a list of tensors
print ( dl . url ) # you can bulk access any other field, tooまた、 DocListにドキュメントを挿入、削除、追加できます。
# append
dl . append (
Image (
url = "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alpamayo.jpg" ,
tensor = np . zeros (( 3 , 224 , 224 )),
)
)
# delete
del dl [ 0 ]
# insert
dl . insert (
0 ,
Image (
url = "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alpamayo.jpg" ,
tensor = np . zeros (( 3 , 224 , 224 )),
),
)また、 DocVecとDocListに切り替えることができます。
vec_2 = dl . to_doc_vec ()
assert isinstance ( vec_2 , DocVec )
dl_2 = vec_2 . to_doc_list ()
assert isinstance ( dl_2 , DocList )Docarrayは、機械学習と本質的に互換性のある方法でデータの送信を促進します。
これには、 HTTPとJSON、JSonschema、Base64、およびBYTESへのHTTPとシリアル化とともに、 ProtoBufとGRPCのネイティブサポートが含まれます。
この機能は、いくつかのシナリオに有益であることが証明されています。
Fastapiに精通していますか? DocarrayがFastapiとの完全な互換性を維持していることを知ってうれしいです!さらに、特に専用のセクションがあります!
データ送信に関しては、シリアル化が重要なステップです。 Docarrayがこのプロセスを合理化する方法を掘り下げましょう。
from docarray import BaseDoc
from docarray . typing import ImageTorchTensor
import torch
# model your data
class MyDocument ( BaseDoc ):
description : str
image : ImageTorchTensor [ 3 , 224 , 224 ]
# create a Document
doc = MyDocument (
description = "This is a description" ,
image = torch . zeros (( 3 , 224 , 224 )),
)
# serialize it!
proto = doc . to_protobuf ()
bytes_ = doc . to_bytes ()
json = doc . json ()
# deserialize it!
doc_2 = MyDocument . from_protobuf ( proto )
doc_4 = MyDocument . from_bytes ( bytes_ )
doc_5 = MyDocument . parse_raw ( json )もちろん、シリアル化だけが必要ではありません。したがって、DocarrayがJinaやFastapiとどのように統合するかを確認してください。
モデリングと場合によってはデータを配布した後、通常、どこかに保存したいと思うでしょう。それがDocarrayが介入するところです!
ドキュメントストアは、名前が示すように、ドキュメントを保存するシームレスな方法を提供します。ローカルであろうとリモートであろうと、同じユーザーインターフェイスを通じてすべてを行うことができます。
ドキュメントストアインターフェイスを使用すると、複数のデータソースとの間でドキュメントをプッシュおよびプルすることができます。すべて同じユーザーインターフェイスを備えています。
たとえば、それがディスク上のストレージでどのように機能するかを見てみましょう。
from docarray import BaseDoc , DocList
class SimpleDoc ( BaseDoc ):
text : str
docs = DocList [ SimpleDoc ]([ SimpleDoc ( text = f'doc { i } ' ) for i in range ( 8 )])
docs . push ( 'file://simple_docs' )
docs_pull = DocList [ SimpleDoc ]. pull ( 'file://simple_docs' )ドキュメントインデックスを使用すると、効率的な類似性ベースの取得を実現するために、ベクトルデータベースにドキュメントをインデックス化できます。
これは次のように便利です:
現在、ドキュメントインデックスは、 Weaviate 、 Qdrant 、 Elasticsearch 、 Redis 、 Mongo Atlas 、およびHnswlibをサポートしています。
ドキュメントインデックスインターフェイスを使用すると、複数のベクトルデータベースからドキュメントをインデックスおよび取得できます。すべて同じユーザーインターフェイスを使用します。
Ann Vector検索、テキスト検索、フィルタリング、およびハイブリッド検索をサポートします。
from docarray import DocList , BaseDoc
from docarray . index import HnswDocumentIndex
import numpy as np
from docarray . typing import ImageUrl , ImageTensor , NdArray
class ImageDoc ( BaseDoc ):
url : ImageUrl
tensor : ImageTensor
embedding : NdArray [ 128 ]
# create some data
dl = DocList [ ImageDoc ](
[
ImageDoc (
url = "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alpamayo.jpg" ,
tensor = np . zeros (( 3 , 224 , 224 )),
embedding = np . random . random (( 128 ,)),
)
for _ in range ( 100 )
]
)
# create a Document Index
index = HnswDocumentIndex [ ImageDoc ]( work_dir = '/tmp/test_index' )
# index your data
index . index ( dl )
# find similar Documents
query = dl [ 0 ]
results , scores = index . find ( query , limit = 10 , search_field = 'embedding' )あなたのバックグラウンドとユースケースに応じて、Docarrayを理解するためのさまざまな方法があります。
Docarrayバージョン0.30.0以降を使用している場合、Dataclass APIに精通しています。
Docarray> = 0.30は、真剣に受け止められているアイデアです。すべてのドキュメントは、Pydanticの厚意により、Dataclassのようなインターフェイスを通じて作成されます。
これにより、次の利点があります。
また、Vector DB統合のための古いドキュメントストアに精通している場合があります。現在、これらはドキュメントインデックスと呼ばれ、以下の改善を提供します(新しいAPIについてはこちらを参照):
今のところ、ドキュメントインデックスは、 Weaviate 、 Qdrant 、 Elasticsearch 、 Redis 、 Mongo Atlas 、Exceost Beise Neighbor Search、 Hnswlibをサポートしています。
Pydanticから来た場合、Docarray文書はPydanticモデルのジュースを絞り、Docarrayを周囲のグッズのコレクションとして見ることができます。
より具体的には、私たちはPydanticをMLの世界に適したものにするために着手しました - それを交換するのではなく、その上に構築することによって!
これは、次の利点を得ることを意味します。
.load()テンソルを画像化するURLを使用できます。ここで最も明白な利点は、 {Torch, TF, ...}Tensor 、 Embeddingなど、ML中心データの第一級サポートです。
これには、テンソルの形状の検証などの便利な機能が含まれます。
from docarray import BaseDoc
from docarray . typing import TorchTensor
import torch
class MyDoc ( BaseDoc ):
tensor : TorchTensor [ 3 , 224 , 224 ]
doc = MyDoc ( tensor = torch . zeros ( 3 , 224 , 224 )) # works
doc = MyDoc ( tensor = torch . zeros ( 224 , 224 , 3 )) # works by reshaping
try :
doc = MyDoc ( tensor = torch . zeros ( 224 )) # fails validation
except Exception as e :
print ( e )
# tensor
# Cannot reshape tensor of shape (224,) to shape (3, 224, 224) (type=value_error)
class Image ( BaseDoc ):
tensor : TorchTensor [ 3 , 'x' , 'x' ]
Image ( tensor = torch . zeros ( 3 , 224 , 224 )) # works
try :
Image (
tensor = torch . zeros ( 3 , 64 , 128 )
) # fails validation because second dimension does not match third
except Exception as e :
print ()
try :
Image (
tensor = torch . zeros ( 4 , 224 , 224 )
) # fails validation because of the first dimension
except Exception as e :
print ( e )
# Tensor shape mismatch. Expected(3, 'x', 'x'), got(4, 224, 224)(type=value_error)
try :
Image (
tensor = torch . zeros ( 3 , 64 )
) # fails validation because it does not have enough dimensions
except Exception as e :
print ( e )
# Tensor shape mismatch. Expected (3, 'x', 'x'), got (3, 64) (type=value_error)Pytorchから来た場合、Docarrayは主にモデルを流れるようにデータを整理する方法として見ることができます。
それはあなたにいくつかの利点を提供します:
DocarrayをMLモデル内に直接使用して、マルチモダルダタを処理および表現できます。これにより、 nn.Moduleの奥深くにあるDocarrayの抽象化を使用してデータについて推論することができ、モデルトレーニングとモデルサービングの間の遷移を容易にするFastAPI互換スキーマを提供します。
これの効果を確認するには、最初にTri-Modal MLモデルのバニラピートルチの実装を観察しましょう。
import torch
from torch import nn
def encoder ( x ):
return torch . rand ( 512 )
class MyMultiModalModel ( nn . Module ):
def __init__ ( self ):
super (). __init__ ()
self . audio_encoder = encoder ()
self . image_encoder = encoder ()
self . text_encoder = encoder ()
def forward ( self , text_1 , text_2 , image_1 , image_2 , audio_1 , audio_2 ):
embedding_text_1 = self . text_encoder ( text_1 )
embedding_text_2 = self . text_encoder ( text_2 )
embedding_image_1 = self . image_encoder ( image_1 )
embedding_image_2 = self . image_encoder ( image_2 )
embedding_audio_1 = self . image_encoder ( audio_1 )
embedding_audio_2 = self . image_encoder ( audio_2 )
return (
embedding_text_1 ,
embedding_text_2 ,
embedding_image_1 ,
embedding_image_2 ,
embedding_audio_1 ,
embedding_audio_2 ,
)あなたが私たちに尋ねると、目にはあまり簡単ではありません。さらに悪いことに、もう1つのモダリティを追加する必要がある場合は、コードベースのすべての部分に触れ、 forward()戻りタイプを変更し、その下から多くの変更を行う必要があります。
それでは、Docarrayで同じコードがどのように見えるか見てみましょう。
from docarray import DocList , BaseDoc
from docarray . documents import ImageDoc , TextDoc , AudioDoc
from docarray . typing import TorchTensor
from torch import nn
import torch
def encoder ( x ):
return torch . rand ( 512 )
class Podcast ( BaseDoc ):
text : TextDoc
image : ImageDoc
audio : AudioDoc
class PairPodcast ( BaseDoc ):
left : Podcast
right : Podcast
class MyPodcastModel ( nn . Module ):
def __init__ ( self ):
super (). __init__ ()
self . audio_encoder = encoder ()
self . image_encoder = encoder ()
self . text_encoder = encoder ()
def forward_podcast ( self , docs : DocList [ Podcast ]) -> DocList [ Podcast ]:
docs . audio . embedding = self . audio_encoder ( docs . audio . tensor )
docs . text . embedding = self . text_encoder ( docs . text . tensor )
docs . image . embedding = self . image_encoder ( docs . image . tensor )
return docs
def forward ( self , docs : DocList [ PairPodcast ]) -> DocList [ PairPodcast ]:
docs . left = self . forward_podcast ( docs . left )
docs . right = self . forward_podcast ( docs . right )
return docsはるかに良く見えますね。コードの読みやすさと保守性ですぐに勝ちます。同じ価格で、PytorchモデルをFastAPIアプリに変え、ドキュメントスキーマの定義を再利用できます(以下を参照)。すべてが、タイプのヒントに依存することにより、Pythonic方法で処理されます。
Pytorchアプローチと同様に、Tensorflowを備えたDocarrayを使用して、MLモデル内のマルチモーダルデータを処理および表現することもできます。
まず、TensorflowでDocarrayを使用するには、最初に次のようにインストールする必要があります。
pip install tensorflow==2.12.0
pip install protobuf==3.19.0
PytorchでDocarrayを使用するのと比較して、Tensorflowで使用する場合に1つの主な違いがあります。DocarrayのTorchTensor torch.Tensorのサブクラスですが、 TensorFlowTensor tf.Tensor TensorFlowTensor tf.Tensorそうではありませんtf.Tensorその.tensor属性。
これはあなたにどのように影響しますか?テンソルデータにアクセスしたいときはいつでも、 TensorFlowTensorインスタンスを渡す代わりに、操作を行うか、MLモデルに渡してください。 .tensor属性にアクセスする必要があります。
これは次のようになります。
from typing import Optional
from docarray import DocList , BaseDoc
import tensorflow as tf
class Podcast ( BaseDoc ):
audio_tensor : Optional [ AudioTensorFlowTensor ] = None
embedding : Optional [ AudioTensorFlowTensor ] = None
class MyPodcastModel ( tf . keras . Model ):
def __init__ ( self ):
super (). __init__ ()
self . audio_encoder = AudioEncoder ()
def call ( self , inputs : DocList [ Podcast ]) -> DocList [ Podcast ]:
inputs . audio_tensor . embedding = self . audio_encoder (
inputs . audio_tensor . tensor
) # access audio_tensor's .tensor attribute
return inputsドキュメントは(ひねりを加えた)Pydanticモデルであるため、Fastapiと完全に互換性があります!
しかし、なぜあなたがすでに知っていて愛しているpydanticモデルではなく、なぜそれらを使用する必要があるのでしょうか?良い質問!
そして、取引を封印するために、SlotをFastapiアプリに簡単に文書化する方法をお見せしましょう。
import numpy as np
from fastapi import FastAPI
from docarray . base_doc import DocArrayResponse
from docarray import BaseDoc
from docarray . documents import ImageDoc
from docarray . typing import NdArray , ImageTensor
class InputDoc ( BaseDoc ):
img : ImageDoc
text : str
class OutputDoc ( BaseDoc ):
embedding_clip : NdArray
embedding_bert : NdArray
app = FastAPI ()
def model_img ( img : ImageTensor ) -> NdArray :
return np . zeros (( 100 , 1 ))
def model_text ( text : str ) -> NdArray :
return np . zeros (( 100 , 1 ))
@ app . post ( "/embed/" , response_model = OutputDoc , response_class = DocArrayResponse )
async def create_item ( doc : InputDoc ) -> OutputDoc :
doc = OutputDoc (
embedding_clip = model_img ( doc . img . tensor ), embedding_bert = model_text ( doc . text )
)
return doc
input_doc = InputDoc ( text = '' , img = ImageDoc ( tensor = np . random . random (( 3 , 224 , 224 ))))
async with AsyncClient ( app = app , base_url = "http://test" ) as ac :
response = await ac . post ( "/embed/" , data = input_doc . json ())バニラピダンティックモデルのように!
Jinaは、ドキュメントを図書館として採用し、ドキュメントを代表し、シリアル化しています。
Jinaは、Docarrayで構築されたモデルとサービスを提供することで、Docarrayのシリアル化能力を最大限に活用して、これらのアプリケーションを提供および拡大できるようにします。
import numpy as np
from jina import Deployment , Executor , requests
from docarray import BaseDoc , DocList
from docarray . documents import ImageDoc
from docarray . typing import NdArray , ImageTensor
class InputDoc ( BaseDoc ):
img : ImageDoc
text : str
class OutputDoc ( BaseDoc ):
embedding_clip : NdArray
embedding_bert : NdArray
def model_img ( img : ImageTensor ) -> NdArray :
return np . zeros (( 100 , 1 ))
def model_text ( text : str ) -> NdArray :
return np . zeros (( 100 , 1 ))
class MyEmbeddingExecutor ( Executor ):
@ requests ( on = '/embed' )
def encode ( self , docs : DocList [ InputDoc ], ** kwargs ) -> DocList [ OutputDoc ]:
ret = DocList [ OutputDoc ]()
for doc in docs :
output = OutputDoc (
embedding_clip = model_img ( doc . img . tensor ),
embedding_bert = model_text ( doc . text ),
)
ret . append ( output )
return ret
with Deployment (
protocols = [ 'grpc' , 'http' ], ports = [ 12345 , 12346 ], uses = MyEmbeddingExecutor
) as dep :
resp = dep . post (
on = '/embed' ,
inputs = DocList [ InputDoc ](
[ InputDoc ( text = '' , img = ImageDoc ( tensor = np . random . random (( 3 , 224 , 224 ))))]
),
return_type = DocList [ OutputDoc ],
)
print ( resp )Universal VectorデータベースクライアントとしてDocarrayに出会った場合、ベクターデータベースの新しい種類のORMと考えることができます。 Docarrayの仕事は、マルチモーダル、ネスト、ドメイン固有のデータを取得し、それをベクトルデータベースにマッピングし、そこに保存して、検索可能にすることです。
from docarray import DocList , BaseDoc
from docarray . index import HnswDocumentIndex
import numpy as np
from docarray . typing import ImageUrl , ImageTensor , NdArray
class ImageDoc ( BaseDoc ):
url : ImageUrl
tensor : ImageTensor
embedding : NdArray [ 128 ]
# create some data
dl = DocList [ ImageDoc ](
[
ImageDoc (
url = "https://upload.wikimedia.org/wikipedia/commons/2/2f/Alpamayo.jpg" ,
tensor = np . zeros (( 3 , 224 , 224 )),
embedding = np . random . random (( 128 ,)),
)
for _ in range ( 100 )
]
)
# create a Document Index
index = HnswDocumentIndex [ ImageDoc ]( work_dir = '/tmp/test_index2' )
# index your data
index . index ( dl )
# find similar Documents
query = dl [ 0 ]
results , scores = index . find ( query , limit = 10 , search_field = 'embedding' )現在、Docarrayは次のベクトルデータベースをサポートしています。
現在、OpenSearchの統合が進行中です。
もちろん、これはDocarrayができることの1つにすぎないので、このReadmeの残りをチェックすることをお勧めします!
Docarrayを使用すると、Langchainを介して外部データをLLMに接続できます。 Docarrayは、柔軟なドキュメントスキーマを確立する自由を提供し、ドキュメントストレージのためにさまざまなバックエンドから選択します。ドキュメントインデックスを作成した後、Docarrayretrieverを使用してLangchainアプリに接続できます。
langchainを介してインストールします:
pip install langchain from docarray import BaseDoc , DocList
from docarray . typing import NdArray
from langchain . embeddings . openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings ()
# Define a document schema
class MovieDoc ( BaseDoc ):
title : str
description : str
year : int
embedding : NdArray [ 1536 ]
movies = [
{ "title" : "#1 title" , "description" : "#1 description" , "year" : 1999 },
{ "title" : "#2 title" , "description" : "#2 description" , "year" : 2001 },
]
# Embed `description` and create documents
docs = DocList [ MovieDoc ](
MovieDoc ( embedding = embeddings . embed_query ( movie [ "description" ]), ** movie )
for movie in movies
) from docarray . index import (
InMemoryExactNNIndex ,
HnswDocumentIndex ,
WeaviateDocumentIndex ,
QdrantDocumentIndex ,
ElasticDocIndex ,
RedisDocumentIndex ,
MongoDBAtlasDocumentIndex ,
)
# Select a suitable backend and initialize it with data
db = InMemoryExactNNIndex [ MovieDoc ]( docs ) from langchain . chat_models import ChatOpenAI
from langchain . chains import ConversationalRetrievalChain
from langchain . retrievers import DocArrayRetriever
# Create a retriever
retriever = DocArrayRetriever (
index = db ,
embeddings = embeddings ,
search_field = "embedding" ,
content_field = "description" ,
)
# Use the retriever in your chain
model = ChatOpenAI ()
qa = ConversationalRetrievalChain . from_llm ( model , retriever = retriever )または、ビルトインベクトルストアを使用できます。 Langchainは、DocarrayinmemorysearchとDocarrayhnswsearchの2つのベクトルストアをサポートしています。どちらも使いやすく、中小サイズのデータセットに最適です。
Docarrayは、LF AI Projects、LLCの商標です