पायथन Chromadb विस्तृत विकास गाइड
स्थापना
pip install chromadb
Chromadb डेटा को स्थायी बनाएँ
import chromadb
आप Chroma डेटाबेस फ़ाइल के लिए भंडारण पथ को निर्दिष्ट कर सकते हैं। अगर डेटा मौजूद है, तो कार्यक्रम चालू होने पर डेटाबेस फ़ाइल स्वचालित रूप से लोड की जाएगी।
client = chromadb.PersistentClient(path="/data/tizi365.db")
path
पैरामीटर Chroma डेटाबेस फ़ाइल का पथ है।
नोट: च्रोमा डेटाबेस के लिए, एक बार क्लाइंट ऑब्ज
संग्रह में डेटा जोड़ना
.add
विधि का उपयोग Chroma में डेटा जोड़ने के लिए करें।
दस्तावेज़ वेक्टर को निर्दिष्ट किए बिना सीधे डेटा जोड़ें:
collection.add(
documents=["lorem ipsum...", "doc2", "doc3", ...],
metadatas=[{"अध्याय": "3", "श्लोक": "16"}, {"अध्याय": "3", "श्लोक": "5"}, {"अध्याय": "29", "श्लोक": "11"}, ...],
ids=["id1", "id2", "id3", ...]
)
यदि Chroma को एक दस्तावेज़ों की सूची मिलती है, तो यह स्वचालित रूप से संग्रह की एंबेडिंग फ़ंक्शन का उपयोग करके दस्तावेज़ों के वेक्टर की गणना करेगा (यदि संग्रह बनाते समय एक एंबेडिंग फ़ंक्शन निर्दिष्ट नहीं किया गया था, तो डिफ़ॉल्ट मान का उपयोग किया जाएगा)। Chroma संग्रह के डस्तावेज़ों को भी संग्रहण करेगा। यदि कोई डॉक्यूमेंट चयनित एम्बेडिंग फ़ंक्शन का उपयोग करके गणना करने के लिए बहुत बड़ा है, तो एक अपवाद होगा।
प्रत्येक दस्तावेज़ के लिए अनन्य आईडी (ids) होना चाहिए। एक ही आईडी को दोबारा जोड़ने से पहले संग्रहण का आरंभिक मूल्य केवल सहेजेंगे। वैकल्पिक रूप से, आप सीधे दस्तावेज़ के संबंधित वेक्टर डेटा की एक सूची प्रदान कर सकते हैं, और Chroma आपके द्वारा प्रदान किए गए वेक्टर डेटा का उपयोग करेगा बिना स्वचालित रूप से वेक्टर की गणना करने।
collection.add(
documents=["Doc1", "doc2", "दस्तावेज़3", ...],
embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
metadatas=[{"अध्याय": "3", "श्लोक": "16"}, {"अध्याय": "3", "श्लोक": "5"}, {"अध्याय": "29", "श्लोक": "11"}, ...],
ids=["id1", "id2", "id3", ...]
)
यदि प्रदत्त वेक्टर डेटा का आयाम (लंबाई) संग्रह के आयाम से मेल नहीं खाता है, तो एक अपवाद होगा।
आप डस्टावेज़ को कहीं और संग्रहित करके Chroma को वेक्टर और मेटाडाटा सूची प्रदान कर सकते हैं। आप आईडी का उपयोग करके वेक्टर्स को दस्तावेज़ों से जोड़ सकते हैं।
collection.add(
embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
metadatas=[{"अध्याय": "3", "श्लोक": "16"}, {"अध्याय": "3", "श्लोक": "5"}, {"अध्याय": "29", "श्लोक": "11"}, ...],
ids=["id1", "id2", "id3", ...]
)
नोट: वेक्टर डेटाबेस का मूल फ़ंक्शन वेक्टर डेटा पर आधारित सांदर्भिक समानता खोज है। वेक्टर डेटाबेस के आकार को कम करने और प्रभावकरता को बढ़ाने के लिए, हम वेक्टर डेटा और आवश्यक फ़िल्टरिंग गुणवत्ताओं को वेक्टर डेटाबेस में संग्रहित करने का चयन कर सकते हैं। अन्य डेटा, जैसे लेख सामग्री, MYSQL जैसे डेटाबेस में संग्रहित किया जा सकता है, केवल उनके आईडी के माध्यम से जुड़ाया गया हो।
संग्रह डेटा क्वेरी करना
.query विधि का उपयोग Chroma डेटा सेट को कई तरीकों से क्वेरी करने के लिए किया जा सकता है।
आप सेट कुएरी प्रेषितया (वेक्टर डेटा) का उपयोग करके क्वेरी कर सकते हैं।
सुझाव: वास्तविक विकास संदर्भों में, query_embeddings आमतौर पर पहले टेक्स्ट एम्बेडिंग मॉडल के माध्यम से उपयोगकर्ता की क्वेरी का वेक्टर गणना करके प्राप्त किए जाते हैं, और फिर इस वेक्टर का उपयोग समान सामग्री क्वेरी के लिए किया जाता है।
collection.query(
query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
n_results=10,
where={"metadata_field": "is_equal_to_this"},
where_document={"$contains":"search_string"}
)
क्वेरी व्यक्ति (क्वेरी एम्बेडिंग) के प्रत्येक क्वेरी वेक्टर के सबसे अच्छे मेल खाते परिणामों n_results को सुनिश्चित करेगा। दस्तावेज़ से संबंधित मेटाडेटा के आधार पर परिणामों को फ़िल्टर करने के लिए एक वैकल्पिक वेयर फ़िल्टर डिक्शनरी प्रदान किया जा सकता है। साथ ही, एक वैकल्पिक where_document फ़िल्टर डिक्शनरी प्रदान किया जा सकता है ताकि दस्तावेज़ सामग्री के आधार पर परिणामों को फ़िल्टर किया जा सके।
यदि प्रदान किए गए query_embeddings संग्रह के आयामों के साथ संरूपी नहीं हैं, तो एक अपवाद उत्पन्न होगा। संरूपी वेक्टर आयाम सुनिश्चित करने के लिए, एक ही टेक्स्ट एम्बेडिंग मॉडल का उपयोग करें।
आप एक सेट क्वेरी प्रेषितया भी कर सकते हैं। Chroma संग्रह के एम्बेडिंग संयन्त्र का उपयोग करके सबसे पहले प्रत्येक क्वेरी पाठ के लिए वेक्टर की गणना करेगा, और फिर उत्पन्न पाठ वेक्टर का उपयोग करके क्वेरी करेगा।
collection.query(
query_texts=["doc10", "thus spake zarathustra", ...],
n_results=10,
where={"metadata_field": "is_equal_to_this"},
where_document={"$contains":"search_string"}
)
आप आईडी द्वारा संग्रह से डेटा क्वेरी करने के लिए .get भी उपयोग कर सकते हैं।
collection.get(
ids=["id1", "id2", "id3", ...],
where={"style": "style1"}
)
.गेट भी where और where_document फ़िल्टर का समर्थन करता है। यदि कोई आईडी प्रदान नहीं की गई है, तो वह संग्रह में सभी आइटम लौटाएगा जो where और where_document फ़िल्टर से मेल खाते हैं।
वापसी फ़ील्ड्स की निर्दिष्ट करना
.get या क्वेरी का उपयोग करते समय, आप इनक्लूड पैरामीटर का उपयोग करके वापसी करने वाले डेटा को निर्दिष्ट करने के लिए कर सकते हैं -- embeddings
, documents
, या metadatas
, और क्वेरी के लिए दूरी डेटा वापस आना आवश्यक होता है। डिफ़ॉल्ट रूप से, Chroma दस्तावेज़ और मेटाडेटा को वापसी करता है, और क्वेरी के लिए दूरी डेटा वापस आता है, जबकि "ids" हमेशा वापस आता है। आप क्वेरी या गेट विधि के इनक्लूड पैरामीटर को पास करके वापस आने वाले फ़ील्ड्स को निर्दिष्ट करने के लिए एक फ़ील्ड नामों के एक अरे को पारित करने के द्वारा निर्दिष्ट कर सकते हैं।
collection.get(
include=["documents"]
)
collection.query(
query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
include=["documents"]
)
व्हेर फ़िल्टर्स का उपयोग
Chroma मेटाडेटा और दस्तावेज़ सामग्री के आधार पर क्वेरी फ़िल्टरिंग का समर्थन करता है। where फ़िल्टर का उपयोग मेटाडेटा को फ़िल्टर करने के लिए किया जाता है, और where_document फ़िल्टर दस्तावेज़ सामग्री को फ़िल्टर करने के लिए किया जाता है, और निम्नलिखित स्पष्ट करता है कि फ़िल्टर शर्त अभिव्यक्ति कैसे लिखी जाती है।
मेटाडेटा द्वारा छानना
मेटाडेटा को छानने के लिए, आपको क्वेरी के लिए where
फ़िल्टर डिक्शनरी प्रदान करना होगा। डिक्शनरी को निम्नलिखित संरचना होनी चाहिए:
{
"metadata_field": {
<ऑपरेटर>: <मान>
}
}
मेटाडेटा को छानने का समर्थन निम्नलिखित ऑपरेटर्स को करता है:
- $eq - के बराबर (स्ट्रिंग, पूर्णांक, दशमलव)
- $ne - के बराबर नहीं (स्ट्रिंग, पूर्णांक, दशमलव)
- $gt - से अधिक (पूर्णांक, दशमलव)
- $gte - से अधिक या उसके समान (पूर्णांक, दशमलव)
- $lt - से कम (पूर्णांक, दशमलव)
- $lte - से कम या उसके समान (पूर्णांक, दशमलव)
$eq ऑपरेटर का उपयोग करना where
फ़िल्टर का उपयोग करना के समान है।
{
"metadata_field": "search_string"
}
{
"metadata_field": {
"$eq": "search_string"
}
}
दस्तावेज़ सामग्री द्वारा फ़िल्टर
दस्तावेज़ सामग्री को फ़िल्टर करने के लिए, आपको क्वेरी के लिए where_document
फ़िल्टर डिक्शनरी प्रदान करना होगा। डिक्शनरी को निम्नलिखित संरचना होनी चाहिए:
{
"$contains": "search_string"
}
तार्किक ऑपरेटर्स का प्रयोग
आप एकाधिक फिल्टर को कॉम्बाइन करने के लिए लॉजिकल ऑपरेटर $and
और $or
का इस्तेमाल कर सकते हैं।
$and
ऑपरेटर सूची में सभी फिल्टर्स से मेल खाते परिणाम लौटाएगा।
{
"$and": [
{
"metadata_field": {
<ऑपरेटर>: <मान>
}
},
{
"metadata_field": {
<ऑपरेटर>: <मान>
}
}
]
}
$or
ऑपरेटर सूची में किसी भी फिल्टर की स्थितियों से मेल खाते परिणाम लौटाएगा।
{
"$or": [
{
"metadata_field": {
<ऑपरेटर>: <मान>
}
},
{
"metadata_field": {
<ऑपरेटर>: <मान>
}
}
]
}
संग्रह में डेटा का अद्यतन
.update
का उपयोग संग्रह में डेटा की किसी भी गुणवत्ता को अपडेट करने की अनुमति देता है।
collection.update(
ids=["id1", "id2", "id3", ...],
embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
metadatas=[{"अध्याय": "3", "श्लोक": "16"}, {"अध्याय": "3", "श्लोक": "5"}, {"अध्याय": "29", "श्लोक": "11"}, ...],
documents=["doc1", "doc2", "doc3", ...],
)
यदि कोई भी विशिष्ट id संग्रह में नहीं मिलता है, तो एक त्रुटि रिकॉर्ड की जाएगी और अपडेट नजरअंदाज कर दिया जाएगा। यदि दिया गया दस्तावेज संबंधित वेक्टर नहीं रखता है, तो संग्रह का इम्बेडिंग फ़ंक्शन वेक्टर की गणना करने के लिए इस्तेमाल होगा।
यदि प्रदान किया गया वेक्टर डेटा संग्रह से भिन्न आयाम का है, तो एक अपवाद होगा।
क्रोमा उपस्थिति को भी समर्थन करता है, जो मौजूदा डेटा को अपडेट कर सकता है और यदि यह मौजूद न हो तो नया डेटा डाल सकता है।
collection.upsert(
ids=["id1", "id2", "id3", ...],
embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
metadatas=[{"अध्याय": "3", "श्लोक": "16"}, {"अध्याय": "3", "श्लोक": "5"}, {"अध्याय": "29", "श्लोक": "11"}, ...],
documents=["doc1", "doc2", "doc3", ...],
)
संग्रह डेटा का हटाना
क्रोमा डेटा मिटाने के लिए .delete
का समर्थन करता है जो id
द्वारा संग्रह से डेटा को हटाएगा। प्रत्येक डेटा के साथ जुड़े वेक्टर, दस्तावेज़ और मेटाडेटा भी हटा दिए जाएंगे।
collection.delete(
ids=["id1", "id2", "id3",...],
where={"अध्याय": "20"}
)
.delete
एक where
फ़िल्टर को भी समर्थन करता है। अगर कोई id नहीं दिया गया है, तो यह सभी आइटम को हटा देगा जो where
फ़िल्टर से मेल खाता है।