Stanford DSPy#

DSPy - фреймворк для решения сложных задач с использованием языковых моделей (LM) и моделей поиска информации (RM). Он объединяет методы подсказок и тонкой настройки LM, а также подходы к рассуждениям, самоулучшению и расширению возможностей за счет поиска информации и инструментов.

  • Предоставляет модульные и декларативные компоненты для управления LM с помощью знакомого синтаксиса Python.

  • Представляет автоматический компилятор, который обучает LM выполнению декларативных шагов программы.

Vector DB может использоваться в качестве механизма поиска информации в потоке DSPy.

Установка#

Для интеграции поиска информации с Vector DB включите dspy-ai с дополнительным параметром qdrant.

pip install dspy-ai dspy-qdrant fastembed

Использование#

Можно настроить параметры DSPy, чтобы использовать модель поиска информации Vector DB следующим образом:

import os
import dspy
from dspy_qdrant import QdrantRM
from qdrant_client import QdrantClient

lm = dspy.LM("gpt-4o-mini", max_tokens=512,api_key=os.environ.get("OPENAI_API_KEY"))
client = QdrantClient(url=os.environ.get("QDRANT_CLOUD_URL"), api_key=os.environ.get("QDRANT_API_KEY"))
collection_name = "collection_name"
rm = QdrantRM(
    qdrant_collection_name=collection_name, 
    qdrant_client=client, 
    vector_name="dense",                 # <-- MATCHES your vector name
    document_field="passage_text",        # <-- MATCHES your payload field
    k=20)

dspy.settings.configure(lm=lm, rm=rm)

Использование поисковой модели довольно простое. Модуль dspy.Retrieve(k) будет искать k наиболее релевантных фрагментов текста по заданному запросу.

retrieve = dspy.Retrieve(k=3)
question = "Some question about my data"
topK_passages = retrieve(question).passages

print(f"Top {retrieve.k} passages for question: {question} \n", "\n")

for idx, passage in enumerate(topK_passages):
    print(f"{idx+1}]", passage, "\n")

С настроенным Vector DB в качестве поискового модуля контекстной информации можно создать модуль DSPy следующим образом:

class RAG(dspy.Module):
    def __init__(self, num_passages=3):
        super().__init__()

        self.retrieve = dspy.Retrieve(k=num_passages)
        ...

    def forward(self, question):
        context = self.retrieve(question).passages
        ...

Теперь, когда общая схема извлечения данных из контекста установлена, можно добавить множество взаимодействий, предлагаемых DSPy, используя поисковую систему Vector DB для получения контекстной информации.

Дополнительная документация#