Полный рабочий процесс для оптимизации автоматизированных запросов с помощью Gemini Flash, Few-Shot Selection и Evolutionary Instruction Search

В этом руководстве мы переходим от традиционного создания запросов к более систематическому, программируемому подходу, рассматривая запросы как настраиваемые параметры, а не как статический текст. Вместо того чтобы угадывать, какая инструкция или пример работают лучше всего, мы создаём цикл оптимизации вокруг 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
«`

Класс PromptTemplate

«`python
class PromptTemplate:
def init(self, instruction: str = «», examples: List[Example] = None):
self.instruction = instruction
self.examples = examples or []
def format(self, text: str) -> str:
prompt_parts = []
if self.instruction:
prompt_parts.append(self.instruction)
if self.examples:
prompt_parts.append(«\nExamples:»)
for ex in self.examples:
prompt_parts.append(f»\nText: {ex.text}»)
prompt_parts.append(f»Sentiment: {ex.sentiment}»)
prompt_parts.append(f»\nText: {text}»)
prompt_parts.append(«Sentiment:»)
return «\n».join(prompt_parts)
def clone(self):
return PromptTemplate(self.instruction, self.examples.copy())
«`

Класс SentimentModel

«`python
class SentimentModel:
def init(self, model, prompt_template: PromptTemplate):
self.model = model
self.prompttemplate = prompttemplate

def predict(self, text: str) -> Prediction:
prompt = self.prompt_template.format(text)
try:
response = self.model.generate_content(prompt)
result = response.text.strip().lower()
for sentiment in [‘positive’, ‘negative’, ‘neutral’]:
if sentiment in result:
return Prediction(sentiment=sentiment, reasoning=result)
return Prediction(sentiment=’neutral’, reasoning=result)
except Exception as e:
return Prediction(sentiment=’neutral’, reasoning=str(e))

def evaluate(self, dataset: List[Example] -> float:
correct = 0
for example in dataset:
pred = self.predict(example.text)
if pred.sentiment == example.sentiment:
correct += 1
return (correct / len(dataset)) * 100
«`

Класс PromptOptimizer

«`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]:
# …
return best_examples

def optimizeinstruction(self, examples: List[Example], valdata: List[Example] -> str:
# …
return best_instruction
«`

Метод compile

«`python
def compile(self, traindata: List[Example], valdata: List[Example], n_examples: int = 3) -> PromptTemplate:
bestexamples = self.selectbestexamples(traindata, valdata, nexamples)
bestinstruction = self.optimizeinstruction(bestexamples, valdata)
optimizedtemplate = PromptTemplate(instruction=bestinstruction, examples=best_examples)
return optimized_template
«`

Метод main

«`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(«✓ Tutorial Complete!»)

if name == «main«:
main()
«`

В этом руководстве мы рассмотрели, как оптимизировать запросы с помощью Gemini Flash, Few-Shot Selection и Evolutionary Instruction Search. Мы показали, как создать цикл оптимизации, который автоматически выбирает наиболее эффективную конфигурацию запроса. Это позволяет нам отказаться от метода проб и ошибок при создании запросов и вместо этого использовать контролируемый цикл оптимизации.

1. Какие основные компоненты используются в представленном руководстве для оптимизации запросов с помощью Gemini 2.0 Flash?

Ответ: в представленном руководстве используются следующие основные компоненты: библиотеки для работы с Gemini (google.generativeai), классы данных для представления записей набора данных и выходных данных модели (Example и Prediction), класс PromptTemplate для форматирования инструкций и примеров, класс SentimentModel для предсказания тональности текста, класс PromptOptimizer для оптимизации инструкций и метод compile для компиляции оптимизированной инструкции.

2. Какие классы и методы используются для создания и обработки набора данных в этом руководстве?

Ответ: для создания и обработки набора данных в этом руководстве используются классы Example и Prediction, а также метод createdataset(). Класс Example представляет записи набора данных, включая текст и его тональность. Класс Prediction представляет выходные данные модели, включая предсказание тональности и обоснование. Метод createdataset() создаёт тренировочный и валидационный наборы данных.

3. Какие методы используются для оптимизации инструкций в этом руководстве?

Ответ: для оптимизации инструкций в этом руководстве используется класс PromptOptimizer. Этот класс содержит методы для выбора лучших примеров и оптимизации инструкций. Метод selectbestexamples() выбирает лучшие примеры из тренировочного набора данных, а метод optimize_instruction() оптимизирует инструкцию на основе выбранных примеров.

4. Какие преимущества даёт использование цикла оптимизации вокруг Gemini 2.0 Flash?

Ответ: использование цикла оптимизации вокруг Gemini 2.0 Flash позволяет отказаться от метода проб и ошибок при создании запросов и вместо этого использовать контролируемый процесс. Это позволяет автоматически выбирать наиболее эффективную конфигурацию запроса, что может привести к улучшению качества результатов и повышению эффективности работы.

5. Какие классы и методы используются для предсказания тональности текста в этом руководстве?

Ответ: для предсказания тональности текста в этом руководстве используется класс SentimentModel. Этот класс содержит метод predict(), который принимает текст в качестве входного параметра и возвращает предсказание тональности в виде объекта Prediction.

Источник