Суть – не выдумываем промпты для решения задач, а собираем решение задачи из модулей, и далее алгоритмически оптимизируем веса и промпты внутри решения.
Как применять? Оптимизировать ваши решения с применением языковых моделей не на основе выдумывания идеального промпта, а на основе математики, т.е. более предсказуемо и обоснованно (Так это должно работать, мы пока пробовали только учебные примеры).
Основные понятия в фреймворке это Signatures, Modules и Optimizers (они же ex Teleprompters). Signatures описывает какую задачу решает система, чего должна выдать модель, избегая диктовки конкретных промптов, например "context, question -> answer". Из модулей (например ChainOfThought или Predict) собирается пайплайн и передается оптимайзерам вместе с входными данными. Оптимайзеры итеративно выбирают лучшие варианты из генерируемых пайплайнов. Т.е. для оптимизации датасеты конечно нужны и чем больше данных тем лучше, но создатели утверждают что и с несколькими примерами можно получить результаты. Есть несколько разных оптимайзеров, например по методу k-ближайших соседей.
Во так это может выглядеть:
self.generate_answer = dspy.ChainOfThought("context, question -> answer")
или
sentence = "it's a charming and often affecting journey."
# 1) Declare with a signature.
classify = dspy.Predict('sentence -> sentiment')
# 2) Call with input argument(s).
response = classify(sentence=sentence)
# 3) Access the output.
print(response.sentiment)
Сам проект, документация, примеры и сообщество на Github.
«Попытка программистов потянуть одеяло обратно на себя», - как сформулировал это Владимир Владимирович Крылов.
