В этом руководстве мы переходим от традиционного создания запросов к более систематизированному, программируемому подходу, рассматривая запросы как настраиваемые параметры, а не как статический текст. Вместо того чтобы угадывать, какая инструкция или пример работают лучше всего, мы создаём цикл оптимизации вокруг Gemini 2.0 Flash, который экспериментирует, оценивает и автоматически выбирает наиболее эффективную конфигурацию запроса.
Настройка Gemini
Мы импортируем все необходимые библиотеки и определяем помощника setup_gemini для настройки Gemini 2.0 Flash. Мы также создаём классы данных Example и Prediction для представления записей набора данных и выходных данных модели в чистом, структурированном виде.
«`python
import google.generativeai as genai
import json
import random
from typing import List, Dict, Tuple, Optional
from dataclasses import dataclass
import numpy as np
from collections import Counter
def setupgemini(apikey: str = None):
if api_key is None:
api_key = input(«Enter your Gemini API key: «).strip()
genai.configure(apikey=apikey)
model = genai.GenerativeModel(‘gemini-2.0-flash-exp’)
print(«✓ Gemini 2.0 Flash configured»)
return model
«`
Создание набора данных
«`python
@dataclass
class Example:
text: str
sentiment: str
def to_dict(self):
return {«text»: self.text, «sentiment»: self.sentiment}
@dataclass
class Prediction:
sentiment: str
reasoning: str = «»
confidence: float = 1.0
def create_dataset() -> Tuple[List[Example], List[Example]]:
train_data = [
Example(«This movie was absolutely fantastic! Best film of the year.», «positive»),
Example(«Terrible experience, waste of time and money.», «negative»),
Example(«The product works as expected, nothing special.», «neutral»),
# …
]
val_data = [
Example(«Absolutely love it, couldn’t be happier!», «positive»),
Example(«Broken on arrival, very upset.», «negative»),
Example(«Works fine, no major issues.», «neutral»),
# …
]
return traindata, valdata
«`
Оптимизация запросов
Мы внедряем класс PromptOptimizer и определяем пул инструкций-кандидатов для тестирования. Мы реализуем selectbestexamples для поиска небольшого, разнообразного набора примеров few-shot и optimize_instruction для оценки каждого варианта инструкции на проверочных данных.
«`python
class PromptOptimizer:
def init(self, model):
self.model = model
self.instruction_candidates = [
«Analyze the sentiment of the following text. Classify as positive, negative, or neutral.»,
# …
]
def selectbestexamples(self, traindata: List[Example], valdata: List[Example], n_examples: int = 3) -> List[Example]:
# …
def optimizeinstruction(self, examples: List[Example], valdata: List[Example]) -> str:
# …
«`
Основной метод
«`python
def main():
print(«=»*70)
print(«Prompt Optimization Tutorial»)
print(«Stop Writing Prompts, Start Programming Them!»)
print(«=»*70)
model = setup_gemini()
traindata, valdata = create_dataset()
print(f»✓ {len(traindata)} training examples, {len(valdata)} validation examples»)
# …
print(f»Baseline (zero-shot): {baseline_score:.1f}%»)
print(f»Manual few-shot: {manual_score:.1f}%»)
print(f»Optimized (compiled): {optimized_score:.1f}%»)
print(f»\nInstruction: {optimized_template.instruction}»)
print(f»\nSelected Examples ({len(optimized_template.examples)}):»)
# …
print(«✓ Tutorial Complete!»)
if name == «main«:
main()
«`
Мы оцениваем оптимизированную модель и сравниваем её точность с базовым уровнем и ручным подходом few-shot. Мы печатаем выбранную инструкцию и выбранные примеры, чтобы можно было проверить, что обнаружил оптимизатор, и запускаем несколько тестовых предложений, чтобы увидеть прогнозы в действии.
В заключение мы реализовали, как программная оптимизация запросов обеспечивает повторяемый, основанный на доказательствах рабочий процесс для разработки высокоэффективных запросов. Мы начали с хрупкого базового уровня, затем итеративно тестировали инструкции, выбирали разнообразные примеры и скомпилировали оптимизированный шаблон, который превосходит ручные попытки. Этот процесс показывает, что мы больше не полагаемся на метод проб и ошибок при составлении запросов; вместо этого мы организовали контролируемый цикл оптимизации.
1. Какие инструменты и библиотеки используются в статье для настройки и оптимизации запросов к модели Gemini 2.0 Flash?
В статье используются следующие инструменты и библиотеки:
* `google.generativeai` для работы с моделью Gemini 2.0 Flash;
* `json` для работы с форматом данных JSON;
* `random` для генерации случайных чисел;
* `numpy` для работы с массивами и матрицами;
* `collections` для работы со счётчиками и другими коллекциями данных;
* `dataclasses` для создания классов данных;
* `setup_gemini` — функция для настройки модели Gemini 2.0 Flash;
* `create_dataset` — функция для создания набора данных;
* `PromptOptimizer` — класс для оптимизации запросов.
2. Какие классы данных определены в статье для представления записей набора данных и выходных данных модели?
В статье определены два класса данных:
* `Example` — класс для представления записей набора данных, содержащих текст и его эмоциональную окраску (`sentiment`);
* `Prediction` — класс для представления выходных данных модели, содержащих эмоциональную окраску (`sentiment`), объяснение (`reasoning`) и уровень уверенности (`confidence`).
3. Какие методы используются для оптимизации запросов в статье?
В статье используются следующие методы для оптимизации запросов:
* Определение пула инструкций-кандидатов для тестирования;
* Реализация `selectbestexamples` для поиска небольшого, разнообразного набора примеров few-shot;
* Реализация `optimize_instruction` для оценки каждого варианта инструкции на проверочных данных.
4. Какие преимущества даёт программная оптимизация запросов по сравнению с ручным подходом?
Программная оптимизация запросов обеспечивает повторяемый, основанный на доказательствах рабочий процесс для разработки высокоэффективных запросов. Она позволяет избежать метода проб и ошибок при составлении запросов и организовать контролируемый цикл оптимизации.
5. Какие классы данных и методы используются для создания набора данных и оптимизации запросов в статье?
Для создания набора данных в статье используется класс данных `Example` и функция `createdataset`. Для оптимизации запросов используется класс `PromptOptimizer`, методы `selectbestexamples` и `optimizeinstruction`.