
Struktur Data untuk Data Multimodal
Perhatikan readme yang saat ini Anda tonton adalah untuk DocArray> 0,30, yang memperkenalkan beberapa perubahan signifikan dari DocArray 0,21. Jika Anda ingin terus menggunakan DocArray yang lebih lama <= 0,21, pastikan Anda menginstalnya melalui
pip install docarray==0.21. Lihat basis kode, dokumentasi, dan cabangnya yang panas untuk informasi lebih lanjut.
DocArray adalah perpustakaan Python yang dibuat dengan ahli untuk representasi, transmisi, penyimpanan, dan pengambilan data multimodal. Disesuaikan untuk pengembangan aplikasi AI multimodal, desainnya menjamin integrasi tanpa batas dengan ekosistem Python dan Machine Learning yang luas. Pada Januari 2022, DocArray didistribusikan secara terbuka di bawah Lisensi Apache 2.0 dan saat ini menikmati status proyek kotak pasir dalam LF AI & Data Foundation.
Untuk menginstal Docarray dari CLI, jalankan perintah berikut:
pip install -U docarrayCatatan untuk menggunakan DocArray <= 0,21, pastikan Anda menginstal melalui
pip install docarray==0.21dan periksa basis kode dan dokumennya dan cabangnya yang panas.
Baru di Docarray? Bergantung pada kasus penggunaan dan latar belakang Anda, ada banyak cara untuk belajar tentang DocArray:
Docarray memberdayakan Anda untuk mewakili data Anda dengan cara yang secara inheren selaras dengan pembelajaran mesin.
Ini sangat bermanfaat untuk berbagai skenario:
Akrab dengan pydantic? Anda akan senang mengetahui bahwa DocArray tidak hanya dibangun di atas Pydantic tetapi juga mempertahankan kompatibilitas lengkap dengannya! Selain itu, kami memiliki bagian tertentu yang didedikasikan untuk kebutuhan Anda!
Intinya, DocArray memfasilitasi representasi data dengan cara yang mencerminkan dataclasses Python, dengan pembelajaran mesin menjadi komponen integral:
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)Mari kita lihat lebih dekat bagaimana Anda dapat mewakili data Anda dengan 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 ] = NoneJadi Anda tidak hanya dapat menentukan jenis data Anda, Anda bahkan dapat menentukan bentuk tensor Anda!
# 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])Tentu saja, Anda dapat menyusun dokumen ke dalam struktur bersarang:
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!' )
) Anda jarang bekerja dengan titik data tunggal pada suatu waktu, terutama dalam aplikasi pembelajaran mesin. Itulah mengapa Anda dapat dengan mudah mengumpulkan beberapa Documents :
DocumentsSaat membangun atau berinteraksi dengan sistem ML, biasanya Anda ingin memproses banyak dokumen (titik data) sekaligus.
Docarray menawarkan dua struktur data untuk ini:
DocVec : Vektor Documents . Semua tensor dalam dokumen ditumpuk ke dalam satu tensor. Sempurna untuk pemrosesan dan penggunaan batch di dalam model ML .DocList : Daftar Documents . Semua tensor dalam dokumen disimpan apa adanya. Sempurna untuk streaming, peringkat ulang, dan pengocok data . Mari kita lihat mereka, dimulai dengan 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 )
]
) Dalam cuplikan kode di atas, DocVec diparametrized berdasarkan jenis dokumen yang ingin Anda gunakan: DocVec[Image] .
Ini mungkin terlihat aneh pada awalnya, tetapi kami yakin Anda akan terbiasa dengan cepat! Selain itu, ini memungkinkan kami melakukan beberapa hal keren, seperti memiliki akses massal ke bidang yang Anda tentukan dalam dokumen Anda:
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 Struktur data kedua, DocList , berfungsi dengan cara yang sama:
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 )
]
)Anda masih dapat mengakses bidang dokumen Anda:
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 Dan Anda dapat memasukkan, menghapus, dan menambahkan dokumen ke DocList Anda:
# 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 )),
),
) Dan Anda dapat beralih dengan mulus antara DocVec dan 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 memfasilitasi transmisi data Anda dengan cara yang secara inheren kompatibel dengan pembelajaran mesin.
Ini termasuk dukungan asli untuk Protobuf dan GRPC , bersama dengan HTTP dan serialisasi untuk JSON, JSONSCHEMA, BASE64, dan BYTE.
Fitur ini terbukti bermanfaat untuk beberapa skenario:
Apakah Anda terbiasa dengan Fastapi? Anda akan senang mengetahui bahwa DocArray mempertahankan kompatibilitas penuh dengan Fastapi! Plus, kami memiliki bagian khusus khusus untuk Anda!
Ketika datang ke transmisi data, serialisasi adalah langkah penting. Ayo selidiki bagaimana DocArray merampingkan proses ini:
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 )Tentu saja, serialisasi tidak semua yang Anda butuhkan. Jadi periksa bagaimana DocArray terintegrasi dengan Jina dan Fastapi .
Setelah pemodelan dan mungkin mendistribusikan data Anda, Anda biasanya ingin menyimpannya di suatu tempat. Di situlah Docarray masuk!
Toko dokumen memberikan cara yang mulus, seperti namanya, simpan dokumen Anda. Baik itu secara lokal atau jarak jauh, Anda dapat melakukannya melalui antarmuka pengguna yang sama:
Antarmuka toko dokumen memungkinkan Anda mendorong dan menarik dokumen ke dan dari beberapa sumber data, semua dengan antarmuka pengguna yang sama.
Misalnya, mari kita lihat cara kerjanya dengan penyimpanan on-disk:
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' )Indeks dokumen memungkinkan Anda mengindeks dokumen Anda dalam database vektor untuk pengambilan berbasis kesamaan yang efisien.
Ini berguna untuk:
Saat ini, indeks dokumen mendukung Weaviate , Qdrant , Elasticsearch , Redis , Mongo Atlas , dan Hnswlib , dengan lebih banyak yang akan datang!
Antarmuka indeks dokumen memungkinkan Anda mengindeks dan mengambil dokumen dari beberapa database vektor, semua dengan antarmuka pengguna yang sama.
Ini mendukung pencarian vektor Ann, pencarian teks, penyaringan, dan pencarian hibrida.
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' )Bergantung pada latar belakang dan penggunaan kasus Anda, ada berbagai cara bagi Anda untuk memahami Docarray.
Jika Anda menggunakan DocArray versi 0.30.0 atau lebih rendah, Anda akan terbiasa dengan API Dataclass -nya.
DocArray> = 0,30 adalah ide itu, dianggap serius. Setiap dokumen dibuat melalui antarmuka seperti dataclass, milik Pydantic.
Ini memberikan keuntungan berikut:
Anda mungkin juga terbiasa dengan toko dokumen lama kami untuk integrasi vektor DB. Mereka sekarang disebut indeks dokumen dan menawarkan perbaikan berikut (lihat di sini untuk API baru):
Untuk saat ini, indeks dokumen mendukung Weaviate , Qdrant , Elasticsearch , Redis , Mongo Atlas , pencarian tetangga terdekat yang tepat dan hnswlib , dengan lebih banyak yang akan datang.
Jika Anda berasal dari Pydantic, Anda dapat melihat dokumen Docarray sebagai model Pydantic yang dijus, dan Docarray sebagai kumpulan barang di sekitarnya.
Lebih khusus lagi, kami berangkat untuk membuat Pydantic cocok untuk dunia ML - bukan dengan menggantinya, tetapi dengan membangun di atasnya!
Ini berarti Anda mendapatkan manfaat berikut:
.load() URL ke Tensor Gambar, Texturl dapat memuat dan tokenize dokumen teks, dll. Keuntungan yang paling jelas di sini adalah dukungan kelas satu untuk data sentris ML , seperti {Torch, TF, ...}Tensor , Embedding , dll.
Ini termasuk fitur praktis seperti memvalidasi bentuk tensor:
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)Jika Anda berasal dari Pytorch, Anda dapat melihat DocArray terutama sebagai cara mengatur data Anda saat mengalir melalui model Anda .
Ini menawarkan beberapa keuntungan:
DocArray dapat digunakan langsung di dalam model ML untuk menangani dan mewakili multimodaldata. Ini memungkinkan Anda untuk beralasan tentang data Anda menggunakan abstraksi DocArray jauh di dalam nn.Module , dan menyediakan skema yang kompatibel dengan FASTAPI yang memudahkan transisi antara pelatihan model dan penyajian model.
Untuk melihat efek dari ini, mari kita amati pertama implementasi vanilla pytorch dari model ML tri-modal:
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 ,
) Tidak terlalu mudah di mata jika Anda bertanya kepada kami. Dan lebih buruk lagi, jika Anda perlu menambahkan satu modalitas lagi, Anda harus menyentuh setiap bagian dari basis kode Anda, mengubah jenis pengembalian forward() dan membuat banyak perubahan di hilir dari itu.
Jadi, sekarang mari kita lihat seperti apa kode yang sama dengan 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 docsTerlihat jauh lebih baik, bukan? Anda langsung menang dalam keterbacaan dan pemeliharaan kode. Dan untuk harga yang sama Anda dapat mengubah model Pytorch Anda menjadi aplikasi FASTAPI dan menggunakan kembali definisi skema dokumen Anda (lihat di bawah). Semuanya ditangani dengan cara Pythonic dengan mengandalkan petunjuk tipe.
Seperti pendekatan Pytorch, Anda juga dapat menggunakan DocArray dengan TensorFlow untuk menangani dan mewakili data multimodal di dalam model ML Anda.
Pertama, untuk menggunakan DocArray dengan TensorFlow, pertama -tama kita harus menginstalnya sebagai berikut:
pip install tensorflow==2.12.0
pip install protobuf==3.19.0
Dibandingkan dengan menggunakan Docarray dengan Pytorch, ada satu perbedaan utama ketika menggunakannya dengan torch.Tensor : Sementara TorchTensor Docarray adalah subclass dari tf.Tensor , ini bukan kasus tf.Tensor TensorFlowTensor TensorFlowTensor tf.Tensor Atribut .tensor -nya.
Bagaimana ini mempengaruhi Anda? Setiap kali Anda ingin mengakses data tensor ke, katakanlah, lakukan operasi dengannya atau menyerahkannya ke model ML Anda, alih -alih menyerahkan instance TensorFlowTensor Anda, Anda perlu mengakses atribut .tensor .
Ini akan terlihat seperti berikut:
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 inputsDokumen adalah model Pydantic (dengan twist), dan karena itu sepenuhnya kompatibel dengan Fastapi!
Tetapi mengapa Anda harus menggunakannya, dan bukan model Pydantic yang sudah Anda kenal dan cintai? Pertanyaan bagus!
Dan untuk menyegel kesepakatan, izinkan kami menunjukkan betapa mudahnya mendokumentasikan slot ke dalam aplikasi Fastapi Anda:
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 ())Sama seperti model vanilla pydantic!
Jina telah mengadopsi Docarray sebagai perpustakaan mereka untuk mewakili dan membuat serial dokumen.
Jina mengizinkan untuk melayani model dan layanan yang dibangun dengan DocArray yang memungkinkan Anda untuk melayani dan mengukur aplikasi ini memanfaatkan sepenuhnya kapabilit serialisasi 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 )Jika Anda menemukan DocArray sebagai klien database vektor universal, Anda dapat menganggapnya sebagai jenis ORM baru untuk database vektor . Tugas Docarray adalah mengambil data multimodal, bersarang, dan khusus domain dan memetakannya ke database vektor, menyimpannya di sana, dan dengan demikian membuatnya dapat dicari:
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' )Saat ini, DocArray mendukung database vektor berikut:
Integrasi OpenSearch saat ini sedang berlangsung.
Tentu saja ini hanyalah salah satu hal yang dapat dilakukan Docarray, jadi kami mendorong Anda untuk memeriksa sisa readme ini!
Dengan DocArray, Anda dapat menghubungkan data eksternal ke LLMS melalui Langchain. DocArray memberi Anda kebebasan untuk membuat skema dokumen yang fleksibel dan memilih dari backend yang berbeda untuk penyimpanan dokumen. Setelah membuat indeks dokumen Anda, Anda dapat menghubungkannya ke aplikasi Langchain Anda menggunakan DocArrayRetriever.
Instal Langchain via:
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 )Atau, Anda dapat menggunakan toko vektor bawaan. Langchain mendukung dua toko vektor: DocarrayInmemorySearch dan DocarrayHnswsearch. Keduanya ramah pengguna dan paling cocok untuk set data kecil hingga menengah.
Docarray adalah merek dagang dari LF AI Projects, LLC