🚀 جرب Zilliz Cloud، الـ Milvus المدارة بالكامل، مجاناً — تجربة أداء أسرع بـ 10 أضعاف! جرب الآن>>

milvus-logo
LFAI
الصفحة الرئيسية
  • عمليات الدمج
  • Home
  • Docs
  • عمليات الدمج

  • التنسيق

  • DSPy

دمج ميلفوس مع DSPy

Open In Colab GitHub Repository

ما هو DSPy

يُعدّ DSPy، الذي قدمته مجموعة ستانفورد للبرمجة اللغوية العصبية (NLP)، إطار عمل برمجي رائد مصمم لتحسين المطالبات والأوزان داخل النماذج اللغوية، وهو ذو قيمة خاصة في السيناريوهات التي يتم فيها دمج نماذج لغوية كبيرة (LLMs) عبر مراحل متعددة من خط الأنابيب. على عكس تقنيات هندسة المطالبة التقليدية التي تعتمد على الصياغة اليدوية والتعديل، تتبنى DSPy نهجًا قائمًا على التعلم. ومن خلال استيعاب أمثلة الأسئلة والأجوبة، يقوم DSPy بإنشاء مطالبات محسّنة ديناميكيًا ومصممة خصيصًا لمهام محددة. تتيح هذه المنهجية المبتكرة إعادة التجميع السلس لخطوط الأنابيب بأكملها، مما يلغي الحاجة إلى إجراء تعديلات يدوية مستمرة على المطالبات. يوفر بناء الجملة البيثوني في DSPy العديد من الوحدات القابلة للتركيب والتعريف، مما يبسط من تعليمات LLMs.

فوائد استخدام DSPy

  • نهج البرمجة: يوفر DSPy نهج برمجة منهجي لتطوير خطوط أنابيب LLM من خلال تجريد خطوط الأنابيب كرسوم بيانية لتحويل النصوص بدلاً من مجرد المطالبة فقط بآليات LLM. تتيح وحداته التوضيحية تصميمًا منظمًا وتحسينًا منظمًا، لتحل محل طريقة التجربة والخطأ في قوالب المطالبة التقليدية.
  • تحسين الأداء: يُظهر DSPy مكاسب كبيرة في الأداء مقارنةً بالطرق الحالية. ومن خلال دراسات الحالة، يتفوق على نماذج المطالبة القياسية والعروض التوضيحية التي أنشأها الخبراء، مما يُظهر تعدد استخداماته وفعاليته حتى عند تجميعها في نماذج LM أصغر.
  • التجريد المعياري: يُلخص DSPy بفعالية الجوانب المعقدة لتطوير خط أنابيب LM، مثل التحلل والضبط الدقيق واختيار النموذج. وباستخدام DSPy، يمكن ترجمة برنامج موجز بسلاسة إلى تعليمات لنماذج مختلفة، مثل GPT-4 أو Llama2-13b أو T5-base، مما يسهل عملية التطوير ويعزز الأداء.

الوحدات النمطية

هناك العديد من المكونات التي تساهم في بناء خط أنابيب LLM. سنقوم هنا بوصف بعض المكونات الرئيسية لتوفير فهم عالي المستوى لكيفية عمل DSPy.

DSPy Modules وحدات DSPy

التوقيع: تعمل التواقيع في DSPy كمواصفات تعريفية، تحدد سلوك المدخلات/المخرجات للوحدات النمطية، وتوجه نموذج اللغة في تنفيذ المهام. الوحدة النمطية: تعمل وحدات DSPy كمكونات أساسية للبرامج التي تستفيد من نماذج اللغة (LMs). فهي تستخلص تقنيات التوجيه المختلفة، مثل سلسلة الأفكار أو ReAct، وهي قابلة للتكيف للتعامل مع أي توقيع DSPy. وبفضل المعلمات القابلة للتعلم والقدرة على معالجة المدخلات وإنتاج المخرجات، يمكن دمج هذه الوحدات لتشكيل برامج أكبر، مستوحاة من وحدات الشبكة العصبية في PyTorch ولكنها مصممة خصيصًا لتطبيقات LM. المُحسِّن: تعمل المحسّنات في DSPy على ضبط معلمات برامج DSPy، مثل المطالبات وأوزان LLM، لزيادة المقاييس المحددة مثل الدقة إلى أقصى حد، مما يعزز كفاءة البرنامج.

لماذا ميلفوس في DSPy

DSPy هو إطار برمجة قوي يعزز تطبيقات RAG. يحتاج مثل هذا التطبيق إلى استرداد معلومات مفيدة لتحسين جودة الإجابة، وهو ما يحتاج إلى قاعدة بيانات متجهة. Milvus هي قاعدة بيانات متجهية معروفة مفتوحة المصدر لتحسين الأداء وقابلية التوسع. مع MilvusRM، وهي وحدة استرجاع في DSPy، يصبح دمج Milvus سلسًا. والآن، يمكن للمطورين تحديد برامج RAG وتحسينها بسهولة باستخدام DSPy، مستفيدين من قدرات البحث المتجهية القوية التي تتمتع بها Milvus. هذا التعاون يجعل تطبيقات RAG أكثر كفاءة وقابلية للتطوير، حيث يجمع بين قدرات البرمجة في DSPy وميزات البحث في Milvus.

أمثلة

والآن، لنستعرض مثالاً سريعًا لتوضيح كيفية الاستفادة من Milvus في DSPy لتحسين تطبيق RAG.

المتطلبات الأساسية

قبل إنشاء تطبيق RAG، قم بتثبيت DSPy و PyMilvus.

$ pip install "dspy-ai[milvus]"
$ pip install -U pymilvus
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى **إعادة تشغيل وقت التشغيل** (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).

تحميل مجموعة البيانات

في هذا المثال، نستخدم HotPotQA، وهي مجموعة من أزواج الأسئلة والأجوبة المعقدة، كمجموعة بيانات التدريب الخاصة بنا. يمكننا تحميلها من خلال فئة HotPotQA.

from dspy.datasets import HotPotQA

# Load the dataset.
dataset = HotPotQA(
    train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0
)

# Tell DSPy that the 'question' field is the input. Any other fields are labels and/or metadata.
trainset = [x.with_inputs("question") for x in dataset.train]
devset = [x.with_inputs("question") for x in dataset.dev]

إدخال البيانات في قاعدة بيانات ميلفوس المتجهة

أدخل معلومات السياق في مجموعة Milvus لاسترجاع المتجهات. يجب أن تحتوي هذه المجموعة على حقل embedding وحقل text. نستخدم نموذج OpenAI text-embedding-3-small الخاص بـ OpenAI كوظيفة تضمين الاستعلام الافتراضية في هذه الحالة.

import requests
import os

os.environ["OPENAI_API_KEY"] = "<YOUR_OPENAI_API_KEY>"
MILVUS_URI = "example.db"
MILVUS_TOKEN = ""

from pymilvus import MilvusClient, DataType, Collection
from dspy.retrieve.milvus_rm import openai_embedding_function

client = MilvusClient(uri=MILVUS_URI, token=MILVUS_TOKEN)

if "dspy_example" not in client.list_collections():
    client.create_collection(
        collection_name="dspy_example",
        overwrite=True,
        dimension=1536,
        primary_field_name="id",
        vector_field_name="embedding",
        id_type="int",
        metric_type="IP",
        max_length=65535,
        enable_dynamic=True,
    )
text = requests.get(
    "https://raw.githubusercontent.com/wxywb/dspy_dataset_sample/master/sample_data.txt"
).text

for idx, passage in enumerate(text.split("\n")):
    if len(passage) == 0:
        continue
    client.insert(
        collection_name="dspy_example",
        data=[
            {
                "id": idx,
                "embedding": openai_embedding_function(passage)[0],
                "text": passage,
            }
        ],
    )

تعريف MilvusRM.

الآن، تحتاج إلى تعريف MilvusRM.

from dspy.retrieve.milvus_rm import MilvusRM
import dspy

retriever_model = MilvusRM(
    collection_name="dspy_example",
    uri=MILVUS_URI,
    token=MILVUS_TOKEN,  # ignore this if no token is required for Milvus connection
    embedding_function=openai_embedding_function,
)
turbo = dspy.OpenAI(model="gpt-3.5-turbo")
dspy.settings.configure(lm=turbo)

بناء التواقيع

الآن بعد أن قمنا بتحميل البيانات، دعنا نبدأ في تحديد التواقيع للمهام الفرعية لخط الأنابيب الخاص بنا. يمكننا تحديد المدخلات البسيطة question والمخرجات answer ، ولكن بما أننا نبني خط أنابيب RAG، سنقوم باسترداد المعلومات السياقية من Milvus. لذلك دعونا نحدد توقيعنا على أنه context, question --> answer.

class GenerateAnswer(dspy.Signature):
    """Answer questions with short factoid answers."""

    context = dspy.InputField(desc="may contain relevant facts")
    question = dspy.InputField()
    answer = dspy.OutputField(desc="often between 1 and 5 words")

نقوم بتضمين أوصاف قصيرة للحقول context و answer لتحديد إرشادات أوضح حول ما سيتلقاه النموذج وما يجب أن يولده.

بناء خط الأنابيب

الآن، دعونا نحدد خط أنابيب RAG.

class RAG(dspy.Module):
    def __init__(self, rm):
        super().__init__()
        self.retrieve = rm

        # This signature indicates the task imposed on the COT module.
        self.generate_answer = dspy.ChainOfThought(GenerateAnswer)

    def forward(self, question):
        # Use milvus_rm to retrieve context for the question.
        context = self.retrieve(question).passages
        # COT module takes "context, query" and output "answer".
        prediction = self.generate_answer(context=context, question=question)
        return dspy.Prediction(
            context=[item.long_text for item in context], answer=prediction.answer
        )

تنفيذ خط الأنابيب والحصول على النتائج

الآن، قمنا ببناء خط أنابيب RAG. لنجربه ونحصل على النتائج.

rag = RAG(retriever_model)
print(rag("who write At My Window").answer)
Townes Van Zandt

يمكننا تقييم النتائج الكمية على مجموعة البيانات.

from dspy.evaluate.evaluate import Evaluate
from dspy.datasets import HotPotQA

evaluate_on_hotpotqa = Evaluate(
    devset=devset, num_threads=1, display_progress=False, display_table=5
)

metric = dspy.evaluate.answer_exact_match
score = evaluate_on_hotpotqa(rag, metric=metric)
print("rag:", score)

تحسين خط الأنابيب

بعد تحديد هذا البرنامج، الخطوة التالية هي التجميع. تقوم هذه العملية بتحديث المعلمات داخل كل وحدة نمطية لتحسين الأداء. تعتمد عملية التجميع على ثلاثة عوامل حاسمة:

  • مجموعة التدريب: سنستخدم أمثلة الأسئلة والأجوبة الـ 20 من مجموعة بيانات التدريب لهذا العرض التوضيحي.
  • مقياس التحقق من الصحة: سنقوم بإنشاء مقياس validate_context_and_answer بسيط. يتحقق هذا المقياس من دقة الإجابة المتوقعة ويضمن أن السياق المسترجع يتضمن الإجابة.
  • المحسِّن المحدد (المحسِّن عن بُعد): يشتمل المحول البرمجي في DSPy على العديد من المحسنات عن بُعد المصممة لتحسين برامجك بفعالية.
from dspy.teleprompt import BootstrapFewShot

# Validation logic: check that the predicted answer is correct.# Also check that the retrieved context does contain that answer.


def validate_context_and_answer(example, pred, trace=None):
    answer_EM = dspy.evaluate.answer_exact_match(example, pred)
    answer_PM = dspy.evaluate.answer_passage_match(example, pred)
    return answer_EM and answer_PM


# Set up a basic teleprompter, which will compile our RAG program.
teleprompter = BootstrapFewShot(metric=validate_context_and_answer)

# Compile!
compiled_rag = teleprompter.compile(rag, trainset=trainset)

# Now compiled_rag is optimized and ready to answer your new question!
# Now, let’s evaluate the compiled RAG program.
score = evaluate_on_hotpotqa(compiled_rag, metric=metric)
print(score)
print("compile_rag:", score)

وقد زادت درجة Ragas من قيمتها السابقة 50.0 إلى 52.0، مما يشير إلى تحسن في جودة الإجابة.

ملخص

يمثل DSPy قفزة في تفاعلات النموذج اللغوي من خلال واجهته القابلة للبرمجة، والتي تسهل التحسين الخوارزمي والآلي لمطالبات النموذج وأوزانه. ومن خلال الاستفادة من DSPy لتنفيذ RAG، تصبح القدرة على التكيف مع نماذج اللغة أو مجموعات البيانات المختلفة أمرًا سهلاً، مما يقلل بشكل كبير من الحاجة إلى التدخلات اليدوية المملة.

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟