ইউজার ম্যাটেরিয়াল ট্রান্সলেশন - পাইথন ক্রোমাডিবি বিস্তারিত ডেভেলপমেন্ট গাইড

ইনস্টলেশন

pip install chromadb

ক্রোমাডিবি ডেটা স্থায়ীভাবে সংরক্ষণ করা

import chromadb

আপনি ক্রোমা ডেটাবেস ফাইলের স্টোরেজ পাথ নির্ধারণ করতে পারেন। ডেটা যদি বিদ্যমান হয়, তবে প্রোগ্রাম চালু হওয়ার সময় ডেটাবেস ফাইল স্বয়ংক্রিয়ভাবে লোড হবে।

client = chromadb.PersistentClient(path="/data/tizi365.db")

পাথ প্যারামিটারটি হল ক্রোমা ডেটাবেস ফাইলের পাথ।

লক্ষ্য করুন: ক্রোমা ডেটাবেসের জন্য, একবার ক্লায়েন্ট অবজেক্ট তৈরি করা একবারই যথেষ্ট। একই পাথে একাধিক ক্লায়েন্ট লোড এবং সেভ করার ফলে অপ্রত্যাশিত পরিণাম হতে পারে, যেমন ডাটা মোছা। সাধারণত, অ্যাপ্লিকেশনে একই ক্রোমা ক্লায়েন্ট একটি তৈরি করা উচিত।

ক্লায়েন্ট অবজেক্টের কিছু সাধারণভাবে ব্যবহৃত ফাংশন:

client.reset()  # ডেটাবেস পরিষ্কার করে পুনরায় সেট করে

কালেকশন অপারেশন

ক্রোমাডিবি কলেকশন সম্পাদন করতে কালেকশন প্রাইমিটিভ ব্যবহার করে, যা ভেক্টর ডেটা বোর্ডার ম্যানেজ করার জন্য ব্যবহৃত হয়, যা MYSQL এর টেবিলের সাথে তুলনা করা যায়।

ক্রিয়াত্মক, দেখা, এবং মুছে ফেলা কালেকশন

ক্রোমা কলেকশন নামটি ইউআরএলে ব্যবহার করে, তাই তা কিছু নামকরণ সীমাবদ্ধতা আছে:

  • নামের দৈর্ঘ্য ৩ থেকে ৬৩ অক্ষর হতে হবে।
  • নামটি ছাড়া প্রথম এবং শেষে লোয়ারকেস অক্ষর বা নম্বর দিতে হবে, এবং মাঝে ডট, হাইফেন এবং আন্ডারস্কোর থাকতে পারে।
  • নামে দুটি সারিয়ের মধ্যে দুটি সর্বোচ্চ নতুন দৈর্ঘ্য হতে পারে না।
  • নামটি ভ্যালিড আইপি এড্রেস হিসেবে নিতে পারে না।

একটি কালেক্শন তৈরি করতে, আপনাকে কালেকশনের নাম এবং একটি ঐচ্ছিক ভেক্টর গণনা ফাংশন (অথবা এম্বেডিং ফাংশন) নির্ধারণ করতে হবে। যদি এম্বেডিং ফাংশন সরবরাহ করা হয়, তবে প্রতিবার কালেকশন অ্যাক্সেস করা হলে এটি সরবরাহ করা হতে হবে।

লক্ষ্য করুন: ভেক্টর গণনা ফাংশনের (এম্বেডিং ফাংশন) উদ্দেশ্য হল টেক্সট ভেক্টর গণনা করা।

collection = client.create_collection(name="my_collection", embedding_function=emb_fn)
collection = client.get_collection(name="my_collection", embedding_function=emb_fn)

এম্বেডিং ফাংশন টেক্সটকে ইনপুট হিসেবে গ্রহণ করে এবং একটি গণনা ভেক্টর ফেরত দেয়।

লক্ষ্য করুন: শিক্ষার্থীরা টেক্সট এম্বেডিং মডেল টিউটোরিয়ালগুলি সম্পর্কে শিখতে পারেন।

আপনি একটি বিদ্যমান কালেকশনকে .get_collection ফাংশন দিয়ে পুনরায় যোগ করতে পারেন, এবং কালেকশন মুছে ফেলার জন্য .delete_collection ব্যবহার করতে পারেন। আপনি এছাড়া ব্যবহার করতে পারেন .get_or_create_collection যাতে একটি কালেকশনে যোগ করা হয় এবং যদি তা বিদ্যমান না থাকে তবে তা তৈরি করা হয়।

collection = client.get_collection(name="tizi365")
collection = client.get_or_create_collection(name="tizi365")
client.delete_collection(name="tizi365")

অন্যান্য সাধারণভাবে ব্যবহৃত কালেকশন অপারেশন:

collection.peek() # কালেকশনের প্রথম ১০টি ডেটা এর তালিকা ফেরত দেয়
collection.count() # কালেকশনের মোট তথ্য সংখ্যা ফেরত দেয়
collection.modify(name="new_name") # কালেকশন নাম পরিবর্তন করে

ভেক্টর দুরত্ব গণনা পদ্ধতি নির্ধারণ করা

create_collection ফাংশনটির ক্যালকুলেশন প্যারামিটারটি একটা ঐচ্ছিক মেটাডেটা প্যারামিটার সহ আসে। hnsw:space এর মান সেট করে ভেক্টর স্পেস দূরত্ব গণনা পদ্ধতি কাস্টমাইজ করা যায়।

লক্ষ্য করুন: ভেক্টর ডেটা ভেক্টর মধ্যে আকৃতির দুরত্ব গণনা করে স্থানিক দূরত্ব গণনা করে। যতটুকু দূরত্ব কাছে থাকে, ততটুকু সাদৃজ্য থাকে, এবং উলটা হলে উলটা।

collection = client.create_collection(
        name="collection_name",
        metadata={"hnsw:space": "cosine"} # l2 হল ডিফল্ট ক্যালকুলেশন মেথড
    )

hnsw:space এর জন্য বৈধ অপশন হল "l2", "ip", বা "cosine"। ডিফল্ট হল "l2"।

সংগ্রহে তথ্য যুক্ত করা

.add পদ্ধতিটি ব্যবহার করুন ক্রোমা তে তথ্য যোগ করতে।

ডকুমেন্ট ভেক্টর সুনির্দিষ্ট না দিয়ে তথ্য সরাসরি যোগ করতে:

collection.add(
    documents=["lorem ipsum...", "doc2", "doc3", ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

যদি ক্রোমা ডকুমেন্ট এর একটি তালিকা পায়, তাহলে স্বয়ংক্রিয়ভাবে সংগ্রহের ভেক্টর ক্যালকুলেশন করার জন্য কলেকশনের এম্বেডিং ফাংশন ব্যবহার করবে (যদি কলেকশন তৈরি করার সময় এম্বেডিং ফাংশন সরবরাহ না করা হয় তবে ডিফল্ট মান ব্যবহৃত হবে)। ক্রোমা আমাদের ডকুমেন্টগুলি তথ্য অত্যন্তই সংরক্ষণ করবে। যদি কোনও ডকুমেন্টটি নির্ধারিত এম্বেডিং ফাংশন ব্যবহার করে বেশ বড় হয়, তবে একটি অস্বীকৃতি ঘটে।

প্রত্যেক ডকুমেন্টের একটি অনন্য আইডি (ids) থাকতে হবে। একই আইডি দুইবার যোগ করলে প্রাথমিক মানটি মাত্র সংরক্ষণ করা হবে। ঐচ্ছিকভাবে, আপনি প্রত্যেক ডকুমেন্টের জন্য মেটাডেটা ডিকশনারিগুলির একটি তালিকা প্রদান করতে পারেন, যা কুয়েরির সময় তথ্য অতিরিক্ত সংরক্ষণ করতে ব্যবহৃত হতে পারে।

আবার, আপনি সরাসরি ডকুমেন্টের সম্পর্কিত ভেক্টর ডেটা এবং Chroma ক্যালকুলেট করবে।

collection.add(
    documents=["doc1", "doc2", "doc3", ...],
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

যদি প্রদানকৃত ভেক্টর ডেটা মাত্রিকার মাত্রা ক্যালেকশনের মাত্রা দিশানুযায়ী মিলছে না তাহলে একটি অস্বীকৃতি ঘটবে।

আপনি ডকুমেন্টগুলি অথবা অন্যত্রে সংরক্ষণ করে ও ক্রোমা এম্বেডিং ডেটা এবং মেটাডেটা তালিকা দিয়ে কাছাকাছি থাকে যে হুকুমকপত্র সে ডকুমেন্টের ভেক্টর দিতে পারে। আপনি আইডি ব্যবহার করতে পারেন ভেক্টরগুলির ডকুমেন্ট সংরক্ষণ করার সাথে যুক্ত করার জন্য।

collection.add(
    embeddings=[[1.1, 2.3, 3.2], [4.5, 6.9, 4.4], [1.1, 2.3, 3.2], ...],
    metadatas=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    ids=["id1", "id2", "id3", ...]
)

দ্রষ্টব্য: ভেক্টর ডাটাবেসের কোর ফাংশন হল ভেক্টর ডাটার উপর সেম্যান্টিক সিমিল্যারিটি খোঁজ। ভেক্টর ডাটাবেসের আকার কমাতে এবং কার্যক্ষমতা বাড়াতে, আমরা ভেক্টর ডাটা এবং কিছু প্রয়োজনীয় ফিল্টারিং গুণগুলি ভেক্টর ডাটাবেসে সংরক্ষণ করা নির্বাচন করতে পারি। অন্য ডেটা, যেমন প্রবন্ধের বিষয়, মাইসিকুয়, যখন তারা আইডি দ্বারা সংযুক্ত হয়ে থাকে MYSQL এর মতো ডাটাবেসে সংরক্ষিত হয়।

কালেকশন ডেটা ক্যুয়েরি

.query মেথডটি ব্যবহার করে চ্রোমা ডেটা সেট হেতু বিভিন্ন উপায়ে ক্যুয়েরি করা যেতে পারে।

আপনি একটি অনুসন্ধান_এম্বেডিং (ভেক্টর ডেটা) ব্যবহার করে কুয়েরি করতে পারেন।

টিপ: প্রাকৃতিক ডেভেলপমেন্ট স্কেনারিতে, অনুসন্ধান_এম্বেডিং একটি টেক্সট এম্বেডিং মডেল দ্বারা ব্যবহারকারীর কুয়েরির ভেক্টর প্রথমে গণনা করে প্রাপ্ত হয়, এবং এরপর এই ভেক্টরটি ব্যবহার করে প্রায় কনটেন্ট লাইখিতের সাথে অনুরূপ কুয়েরি করা হয়।

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 ফিল্টার ডিকশনারি সরবরাহ করা যেতে পারে। উত্তরাধিকারে, একটি ঐচ্ছিক where_document ফিল্টার ডিকশনারি সরবরাহ করা যেতে পারে ডকুমেন্টের সাথে সম্পর্কিত ফলাফল ফিল্টার করা যেতে পারে।

যদি সরবরাহকৃত অনুসন্ধান_এম্বেডিং কালেকশনের মাত্রা সঙ্গে সামঞ্জস্যহীন না হয়, তবে একটি অসম্বন্ধ সমস্যা ঘটবে। সরবরাহিত ভেক্টর মাত্রার সামঞ্জস্যতা নিশ্চিত করতে, একই টেক্সট এম্বেডিং মডেল ব্যবহার করুন।

আপনি পরীক্ষা করতে পারেন একটি সেট অনুসন্ধান পাঠে ব্যবহার করে। চ্রোমা প্রাথমিকভাবে প্রতিটি অনুসন্ধান পাঠের ভেক্টর গণনা করে এবং তারপর প্রাপ্ত পাঠ ভেক্টর ব্যবহার করে পারিপ্রেক্ষ করবে।

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"}
)

.get পাশিও where এবং where_document ফিল্টার সমর্থন করে। যদি কোনও আইডি সরবরাহ না করা হয়, তবে এটি সমস্ত আইটেম কালেকশন ফিল্টারের সাথে সামঞ্জস্যহীন মিলিত করবে।

ফিরে ফিল্ড স্পেসিফাই করা

get বা query ব্যবহার করার সময়, আপনি include প্যারামিটারটি ব্যবহার করে ফিরা হতে পারেন - এম্বেডিং, ডকুমেন্ট, বা মেটাডাটা, এবং জুড়ের জন্য কুয়েরি, দুরত্ততা ডেটা ফিরে দ্রব্যতা প্রসঙ্গের জন্য। ডিফল্টভাবে, চ্রোমা নথিপত্র এবং মেটাডেটা ফিরে দেয়, এবং প্রশ্নগুলিতে, হওয়ায় "আইডি" সবসময় দ্রব্যতা ফিরে দেয়। আপনি ফিল্ড ব্যাপকতার জন্য ফিরা হত্তর ফিল্ডের নামের একটি অ্যারে পাঠানো দ্বারা ফিরার জন্য উপযুক্ত করে পারেন query বা get মেথডের includes প্যারামিটারে।

collection.get(
    include=["documents"]
)

collection.query(
    query_embeddings=[[11.1, 12.1, 13.1],[1.1, 2.3, 3.2], ...],
    include=["documents"]
)

কোথায় ফিল্টার ব্যবহার করা

চ্রোমা মেটাডেটা এবং ডকুমেন্টের ভিত্তিতে কিব অনুসন্ধানের ফিল্টার করার সমর্থন করে। 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 অপারেটর সব ফিল্টারের সাথে মেলাপন করা ফলাফল ফেরত পাঠাবে।

{
    "$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=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    documents=["doc1", "doc2", "doc3", ...],
)

সংগ্রহে কোনও আইডি পাওয়া যায় না হলে, একটি ত্রুটি রেকর্ড করা হবে এবং আপডেট উপেক্ষা করা হবে। যদি সরবরাহকৃত ডকুমেন্টে একটি প্রতিস্থাপন ভেক্টর না থাকে, তবে ভেক্টর গণনা করতে সংগ্রহের এমবেডিং ফাংশন ব্যবহার করা হবে।

যদি সরবরাহিত ভেক্টর ডেটা সংগ্রহের ছবির চাপ থেকে বিভিন্ন মাত্রা হয়, তবে একটি অপশন ঘটবে।

Chroma আপসার আপসার অপারেশনও সমর্থন করে, যা বিদ্যমান ডেটা আপডেট করবে এবং যদি এটি বিদ্যমান না থাকে তবে নতুন ডেটা ঢুকাতে পারবে।

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=[{"chapter": "3", "verse": "16"}, {"chapter": "3", "verse": "5"}, {"chapter": "29", "verse": "11"}, ...],
    documents=["doc1", "doc2", "doc3", ...],
)

সংগ্রহের ডেটা মুছে ফেলা

Chroma সংগ্রহ থেকে ডেটা মুছে ফেলার জন্য .delete ব্যবহার করা সমর্থন করে যেখানে id দ্বারা। প্রতিটি ডেটার সাথে জড়িত ভেক্টর, ডকুমেন্ট এবং মেটাডেটা পরিবর্তন করা হবে।

collection.delete(
    ids=["id1", "id2", "id3",...],
    where={"chapter": "20"}
)

.delete এ একটি where ফিল্টারের সমর্থন আছে। যদি কোনও আইডি সরবরাহ করা না হয়, তবে সংগ্রহের সমস্ত আইটেমগুলি মুছে ফেলা হবে যে কোন ফিল্টারের সাথে যুক্ত হয়।