<НА ГЛАВНУЮ

Мастерство техники Self-Refine с большими языковыми моделями и Mirascope

Узнайте, как использовать Mirascope для реализации техники Self-Refine с большими языковыми моделями, чтобы улучшать ответы ИИ через итеративную доработку.

Что такое техника Self-Refine

В этом руководстве показано, как реализовать технику Self-Refine с использованием больших языковых моделей (LLM) и фреймворка Mirascope, который позволяет строить структурированные рабочие процессы с подсказками. Self-Refine — это стратегия prompt engineering, при которой модель оценивает собственный ответ, формирует обратную связь и итеративно улучшает результат на основе этой обратной связи. Цикл улучшения можно повторять несколько раз, чтобы повысить качество и точность итогового ответа.

Применение и преимущества

Техника Self-Refine особенно эффективна для задач, связанных с рассуждениями, генерацией кода и созданием контента, где постепенные улучшения приводят к заметно лучшим результатам.

Установка зависимостей

Для начала установите необходимые пакеты:

!pip install "mirascope[openai]"

Настройка OpenAI API ключа

Получите ключ API OpenAI на https://platform.openai.com/settings/organization/api-keys. Новым пользователям может потребоваться добавить платежные данные и внести минимальный платеж в $5 для активации доступа.

Пример настройки:

import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass('Введите OpenAI API Key: ')

Базовая реализация Self-Refine

С помощью декораторов Mirascope процесс начинается с генерации начального ответа, его оценки и создания улучшенного ответа на основе обратной связи. Цикл может повторяться для повышения точности.

from mirascope.core import openai, prompt_template
from mirascope.core.openai import OpenAICallResponse
 
@openai.call(model="gpt-4o-mini")
def call(query: str) -> str:
    return query
 
@openai.call(model="gpt-4o-mini")
@prompt_template(
    """
    Вот запрос и ответ на него. Дайте обратную связь по ответу,
    отметьте, что было правильно и что нет.
    Запрос:
    {query}
    Ответ:
    {response}
    """
)
def evaluate_response(query: str, response: OpenAICallResponse): ...
 
@openai.call(model="gpt-4o-mini")
@prompt_template(
    """
    Для этого запроса:
    {query}
    Был дан следующий ответ:
    {response}
    Вот обратная связь по ответу:
    {feedback}
 
    Используйте обратную связь для создания нового ответа.
    """
)
def generate_new_response(
    query: str, response: OpenAICallResponse
) -> openai.OpenAIDynamicConfig:
    feedback = evaluate_response(query, response)
    return {"computed_fields": {"feedback": feedback}}
 
def self_refine(query: str, depth: int) -> str:
    response = call(query)
    for _ in range(depth):
        response = generate_new_response(query, response)
    return response.content
 
query = "Поезд проезжает 120 км с определённой скоростью. Если бы скорость была на 20 км/ч больше, время в пути сократилось бы на 30 минут. Какова была исходная скорость поезда?"
 
print(self_refine(query, 1))

Расширенная версия с моделью ответа

В этой версии используется Pydantic для создания структурированной модели MathSolution, которая фиксирует шаги решения и окончательный числовой ответ, что повышает ясность и удобство использования.

from pydantic import BaseModel, Field
 
class MathSolution(BaseModel):
    steps: list[str] = Field(..., description="Шаги решения задачи")
    final_answer: float = Field(..., description="Окончательный числовой ответ")
 
@openai.call(model="gpt-4o-mini", response_model=MathSolution)
@prompt_template(
    """
    Для этого запроса:
    {query}
    Был дан следующий ответ:
    {response}
    Вот обратная связь по ответу:
    {feedback}
 
    Используйте её для создания нового ответа.
    Укажите шаги решения и окончательный числовой ответ.
    """
)
def enhanced_generate_new_response(
    query: str, response: OpenAICallResponse
) -> openai.OpenAIDynamicConfig:
    feedback = evaluate_response(query, response)
    return {"computed_fields": {"feedback": feedback}}
 
def enhanced_self_refine(query: str, depth: int) -> MathSolution:
    response = call(query)
    for _ in range(depth):
        solution = enhanced_generate_new_response(query, response)
        response = f"Steps: {solution.steps}\nFinal Answer: {solution.final_answer}"
    return solution
 
# Пример использования
result = enhanced_self_refine(query, 1)
print(result)

Результаты и преимущества

Данная техника успешно решила математическую задачу за одну итерацию, предоставив пошаговое рассуждение и правильный ответ — 60 км/ч. Ключевые преимущества:

  • Повышенная точность благодаря итеративной обратной связи
  • Чёткие шаги решения
  • Прозрачность и доверие к ответу

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

Дополнительные ресурсы

Полный код и подробности доступны в оригинальном руководстве. Следите за исследователями в Twitter и присоединяйтесь к сообществу AI для обновлений и обсуждений.

🇬🇧

Switch Language

Read this article in English

Switch to English