
بنية البيانات للبيانات متعددة الوسائط
لاحظ أن ReadMe الذي تشاهده حاليًا مخصص لـ DocArray> 0.30 ، والذي يقدم بعض التغييرات المهمة من Docarray 0.21. إذا كنت ترغب في متابعة استخدام DocArray الأقدم <= 0.21 ، تأكد من تثبيته عبر
pip install docarray==0.21. ارجع إلى قاعدة بيانات Code و Documentation وفرع الإصلاح الساخن لمزيد من المعلومات.
Docarray هي مكتبة Python مصممة بخبرة لتمثيل البيانات متعددة الوسائط ونقلها وتخزينها واسترجاعها. مصممة لتطوير تطبيقات AI متعددة الوسائط ، يضمن تصميمها تكاملًا سلسًا مع النظم الإيكولوجية الواسعة للبيثون والتعلم الآلي. اعتبارًا من يناير 2022 ، يتم توزيع Docarray علانية بموجب ترخيص Apache 2.0 ويتمتع حاليًا بحالة مشروع صندوق الرمل داخل مؤسسة LF AI & Data.
لتثبيت Docarray من CLI ، قم بتشغيل الأمر التالي:
pip install -U docarrayملاحظة لاستخدام DocArray <= 0.21 ، تأكد من التثبيت عبر
pip install docarray==0.21وتحقق من قاعدة كود ومستنداتها وفرع الإصلاح الساخن.
جديد على Docarray؟ اعتمادًا على حالة الاستخدام والخلفية ، هناك طرق متعددة للتعرف على Docarray:
يمكّنك Docarray من تمثيل بياناتك بطريقة تتناسب بطبيعتها للتعلم الآلي.
هذا مفيد بشكل خاص للسيناريوهات المختلفة:
على دراية بالبيدانتيك؟ ستسعدني أن تعلم أن Docarray لا يتم بناؤه فقط على قمة Pydantic ولكن يحافظ أيضًا على توافق كامل معها! علاوة على ذلك ، لدينا قسم محدد مخصص لاحتياجاتك!
في جوهرها ، يسهل DocArray تمثيل البيانات بطريقة تعكس نظارات البيانات Python ، مع كون التعلم الآلي مكونًا لا يتجزأ:
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 هيكلين بيانات لهذا:
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 تعمل بنية البيانات الثانية ، 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 نقل بياناتك بطريقة متوافقة بطبيعتها مع التعلم الآلي.
ويشمل ذلك الدعم الأصلي لـ Protobuf و GRPC ، إلى جانب HTTP والتسلسل إلى JSON و JSONSCHEMA و BASE64 و BYTES.
هذه الميزة تثبت أنها مفيدة للعديد من السيناريوهات:
هل أنت على دراية بـ 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 Search ، والبحث عن النص ، والتصفية ، والبحث الهجين.
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 الخاص به.
docarray> = 0.30 هي تلك الفكرة ، التي تؤخذ على محمل الجد. يتم إنشاء كل مستند من خلال واجهة تشبه DataClass ، بإذن من Pydantic.
هذا يعطي المزايا التالية:
قد تكون أيضًا على دراية بمتاجر المستندات القديمة الخاصة بنا لتكامل Vector DB. يطلق عليهم الآن فهارس المستندات ويقدمون التحسينات التالية (انظر هنا للحصول على واجهة برمجة التطبيقات الجديدة):
في الوقت الحالي ، تدعم فهارس المستندات Weaviate و Qdrant و Elasticsearch و Redis و Mongo Atlas ، وأقرب مجرى ، و HNSWLIB ، مع المزيد.
إذا أتيت من Pydantic ، فيمكنك رؤية مستندات Docarray على أنها نماذج Pydantic ، و Docarray كمجموعة من الأشياء الجيدة من حولها.
وبشكل أكثر تحديداً ، شرعنا في جعل Pydantic Lit مع عالم ML - ليس عن طريق استبداله ، ولكن عن طريق البناء فوقه!
هذا يعني أنك تحصل على الفوائد التالية:
.load() عنوان URL إلى موتر الصورة ، يمكن لـ Texturl تحميل المستندات النصية ورمزها ، إلخ. الميزة الأكثر وضوحًا هنا هي دعم من الدرجة الأولى للبيانات المركزية ML ، مثل {Torch, TF, ...}Tensor ، Embedding ، إلخ.
وهذا يشمل ميزات مفيدة مثل التحقق من شكل موتر:
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 للتعامل مع Multimodaldata وتمثيلها. يتيح لك ذلك التفكير في بياناتك باستخدام تجريدات Docarray في عمق nn.Module ، ويوفر مخططًا متوافقًا مع Fastapi يخفف من الانتقال بين التدريب النموذجي وخدمة النموذج.
لمعرفة تأثير ذلك ، دعنا أولاً نلاحظ تنفيذ الفانيليا Pytorch لنموذج 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 ,
) ليس من السهل جدًا على العيون إذا سألتنا. والأسوأ من ذلك ، إذا كنت بحاجة إلى إضافة طريقة أخرى ، فيجب عليك لمس كل جزء من قاعدة الكود الخاصة بك ، وتغيير نوع الإرجاع 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 وإعادة استخدام تعريف مخطط المستند الخاص بك (انظر أدناه). يتم التعامل مع كل شيء بطريقة نقوية من خلال الاعتماد على تلميحات النوع.
مثل نهج Pytorch ، يمكنك أيضًا استخدام Docarray مع TensorFlow للتعامل مع البيانات المتعددة الوسائط وتمثيلها داخل نموذج ML الخاص بك.
أولاً ، لاستخدام Docarray مع TensorFlow ، نحتاج أولاً إلى تثبيته على النحو التالي:
pip install tensorflow==2.12.0
pip install protobuf==3.19.0
مقارنةً باستخدام DocArray مع Pytorch ، هناك اختلاف رئيسي واحد عند استخدامه مع TensorFlow: في حين أن TorchTensor من Docarray هو فئة فرعية من torch.Tensor ، هذا ليس هو الحال بالنسبة إلى TensorFlowTensor : بسبب بعض القيود الفنية tf.Tensor tf.Tensor ، docarray tf.Tensor TensorFlowTensor سمة .tensor .
كيف يؤثر هذا عليك؟ كلما كنت ترغب في الوصول إلى بيانات الموتر ، دعنا نقول ، القيام بعمليات معها أو تسليمها إلى طراز ML الخاص بك ، بدلاً من تسليم مثيل TensorFlowTensor الخاص بك ، تحتاج إلى الوصول إلى سمة .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 التي تعرفها وتحبها بالفعل؟ سؤال جيد!
ولإغلاق الصفقة ، دعنا نوضح لك مدى سهولة المستندات في تطبيق 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 ())تماما مثل نموذج الفانيليا Pydantic!
تبنت جينا Docarray كمكتبة لتمثيل الوثائق وتسلسلها.
تسمح 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 )إذا صادفت Docarray كعميل لقاعدة بيانات Universal Vector ، فيمكنك على أفضل وجه التفكير في الأمر كنوع جديد من 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 ، لذلك نشجعك على التحقق من بقية هذه القراءة!
مع Docarray ، يمكنك توصيل البيانات الخارجية بـ LLMS من خلال Langchain. يمنحك DocArray حرية إنشاء مخططات مستندات مرنة واختيار من بين الخلايا الخلفية المختلفة لتخزين المستندات. بعد إنشاء فهرس المستند الخاص بك ، يمكنك توصيله بتطبيق Langchain الخاص بك باستخدام DocArrayRetRiever.
تثبيت 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. كلاهما سهل الاستخدام وهو الأنسب لمجموعات البيانات الصغيرة إلى المتوسطة الحجم.
Docarray هي علامة تجارية لمشاريع LF AI ، LLC