Prompt Engineering İleri Teknikler: CoT, Few-Shot ve ReAct
Büyük Dil Modellerini etkili kullanmak yalnızca doğru soruyu sormakla ilgili değildir. İleri prompt mühendisliği teknikleri, modelin akıl yürütme sürecini şekillendirerek hem doğruluğu hem de güvenilirliği artırır. Bu yazıda Chain-of-Thought, Few-Shot ve ReAct tekniklerini .NET'te nasıl uygulayacağınızı somut örneklerle göstereceğiz.
1. Chain-of-Thought (CoT) Prompting
CoT, modeli adım adım düşünerek yanıt vermeye yönlendirir. Karmaşık mantık ve matematik problemlerinde doğruluğu önemli ölçüde artırır:
public class ChainOfThoughtPromptBuilder
{
public string BuildCoTPrompt(string problem, string domain = "genel")
{
return $"""
Aşağıdaki problemi adım adım çöz. Her adımı açıkça belirt.
PROBLEM: {problem}
ÇÖZÜM ADIMLARINI GÖSTER:
Adım 1: [İlk analiz]
Adım 2: [...]
...
SONUÇ: [Final cevap]
""";
}
// Zero-Shot CoT — sadece "adım adım düşün" ifadesi yeterli
public string BuildZeroShotCoT(string question) =>
$"{question}\n\nBu soruyu adım adım düşünerek yanıtla.";
}
// Kullanım
var prompt = cot.BuildZeroShotCoT(
"Bir şirketin geliri %20 artarken giderleri %15 artıyor. " +
"Başlangıçta kar marjı %10 ise yeni kar marjı nedir?");
2. Few-Shot Learning
Birkaç örnek göstererek modelin çıktı formatını ve stilini kontrol edin:
public class FewShotPromptBuilder
{
private readonly List<(string Input, string Output)> _examples = [];
public FewShotPromptBuilder AddExample(string input, string output)
{
_examples.Add((input, output));
return this;
}
public string Build(string taskDescription, string newInput)
{
var sb = new StringBuilder();
sb.AppendLine(taskDescription);
sb.AppendLine();
foreach (var (input, output) in _examples)
{
sb.AppendLine($"Girdi: {input}");
sb.AppendLine($"Çıktı: {output}");
sb.AppendLine();
}
sb.AppendLine($"Girdi: {newInput}");
sb.Append("Çıktı:");
return sb.ToString();
}
}
// Kullanım: Sentiment analizi
var fewShot = new FewShotPromptBuilder()
.AddExample(
"Ürün harika, çok memnun kaldım!",
"""{"sentiment":"pozitif","score":0.95,"keywords":["harika","memnun"]}""")
.AddExample(
"Kargo geç geldi ve kutu hasarlıydı.",
"""{"sentiment":"negatif","score":0.82,"keywords":["geç","hasarlı"]}""")
.AddExample(
"Fiyat makul, kalite idare eder.",
"""{"sentiment":"nötr","score":0.60,"keywords":["makul","idare"]}""");
var prompt = fewShot.Build(
"Müşteri yorumlarını JSON formatında analiz et:",
"Ürün tam beklediğim gibiydi, kesinlikle tavsiye ederim.");
3. ReAct (Reason + Act) Pattern
ReAct, modeli adım adım düşünmesi ve araçlar çağırması için yönlendirir; Semantic Kernel Agent ve Function Calling ile birlikte kullanılır:
public class ReActAgent
{
private readonly Kernel _kernel;
public ReActAgent(Kernel kernel)
{
_kernel = kernel;
RegisterTools();
}
private void RegisterTools()
{
_kernel.Plugins.AddFromFunctions("tools",
[
KernelFunctionFactory.CreateFromMethod(
(string query) => SearchWeb(query),
"SearchWeb", "Web'de arama yap"),
KernelFunctionFactory.CreateFromMethod(
(string expression) => Calculate(expression),
"Calculate", "Matematiksel ifadeyi hesapla"),
KernelFunctionFactory.CreateFromMethod(
(string date) => GetWeather(date),
"GetWeather", "Hava durumu bilgisi al")
]);
}
public async Task<string> RunAsync(string goal)
{
var settings = new OpenAIPromptExecutionSettings
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions,
Temperature = 0.1
};
var systemPrompt = """
Sen bir problem çözme ajanısın. ReAct formatını kullan:
Düşünce: [Mevcut durumu analiz et]
Eylem: [Hangi aracı kullanacağını belirt]
Gözlem: [Araç sonucunu değerlendir]
... (gerektiğinde tekrarla)
Sonuç: [Final yanıt]
""";
var history = new ChatHistory(systemPrompt);
history.AddUserMessage(goal);
var result = await _kernel.GetRequiredService<IChatCompletionService>()
.GetChatMessageContentAsync(history, settings, _kernel);
return result.Content ?? "";
}
private string SearchWeb(string query) => $"[Arama sonuçları: {query}]";
private string Calculate(string expr) =>
DataTable.Compute(expr, "").ToString() ?? "Hesaplanamadı";
private string GetWeather(string date) => $"[{date} için hava durumu: Güneşli, 22°C]";
}
4. Structured Output (JSON Mode)
GPT modelleri JSON çıktısı üretmek için JSON mode'u destekler:
public async Task<T?> GetStructuredOutputAsync<T>(string prompt)
{
var schemaJson = JsonSerializer.Serialize(JsonSchemaExporter.GetJsonSchema(typeof(T)));
var result = await _chatClient.CompleteChatAsync(
[new UserChatMessage(prompt)],
new ChatCompletionOptions
{
ResponseFormat = ChatResponseFormat.CreateJsonSchemaFormat(
jsonSchemaFormatName: typeof(T).Name,
jsonSchema: BinaryData.FromString(schemaJson),
jsonSchemaIsStrict: true)
});
return JsonSerializer.Deserialize<T>(result.Value.Content[0].Text);
}
// Kullanım
public record ProductInfo(string Name, decimal Price, string Category, bool InStock);
var product = await llm.GetStructuredOutputAsync<ProductInfo>(
"MacBook Pro 14 M4 ürünü hakkında bilgi ver.");
5. Self-Consistency Prompting
public async Task<string> GetConsistentAnswerAsync(string question, int samples = 5)
{
var answers = await Task.WhenAll(
Enumerable.Range(0, samples).Select(async _ =>
{
var result = await _chatClient.CompleteChatAsync(
[new UserChatMessage($"{question}\n\nAdım adım düşün.")],
new ChatCompletionOptions { Temperature = 0.7f });
return result.Value.Content[0].Text;
}));
// En sık tekrar eden cevabı seç (çoğunluk oylaması)
return answers
.GroupBy(a => ExtractFinalAnswer(a))
.OrderByDescending(g => g.Count())
.First().Key;
}
private string ExtractFinalAnswer(string response)
{
// "SONUÇ:" veya "Cevap:" sonrasını çıkar
var match = Regex.Match(response, @"(?:SONUÇ|Cevap|Answer):\s*(.+)$",
RegexOptions.IgnoreCase | RegexOptions.Multiline);
return match.Success ? match.Groups[1].Value.Trim() : response.Trim();
}
Hangi Tekniği Seçmeli?
| Teknik | En İyi Senaryo | Token Maliyeti |
|---|---|---|
| Zero-Shot CoT | Mantık/matematik soruları | Düşük |
| Few-Shot | Format/stil kontrolü | Orta |
| ReAct | Çok adımlı görevler, araç çağrısı | Yüksek |
| Structured Output | JSON/veri çıkarımı | Düşük |
| Self-Consistency | Kritik kararlar | Çok yüksek |
Sonuç
İleri prompt mühendisliği teknikleri, model kalitesini iyileştirmenin düşük maliyetli yollarıdır. CoT ve Few-Shot ile başlayın; karmaşık görevler için ReAct'e geçin. Yapılandırılmış çıktı gereken durumlarda ise JSON Schema tabanlı Structured Output kullanın.