소개: LLM과의 의사소통 기술
Il 신속한 엔지니어링 효과적인 요청을 공식화하는 방법을 연구하는 분야 대규모 언어 모델. 그것은 신비로운 예술이 아닙니다. 체계적이고 테스트 가능한 기술의 집합입니다. 재현성이 뛰어나 출력 품질을 대폭 향상할 수 있습니다.
일반 프롬프트와 잘 설계된 프롬프트의 차이점은 다음과 같습니다. 평범한 반응과 전문적인 결과. 이 기사에서는 가장 효과적인 기술, 기본 수준부터 사고 사슬, ReAct와 같은 고급 패턴까지.
이 기사에서 배울 내용
- 기본 기술: 제로샷, 퓨샷, 원샷
- 복잡한 추론을 위한 CoT(사고의 사슬) 및 ToT(사고의 나무)
- 행동을 제어하기 위한 시스템 프롬프트 및 페르소나 주입
- 구조화된 출력: JSON, 테이블 및 특정 형식 가져오기
- 추론과 행동을 통합하는 ReAct 패턴
- 신속한 버전 관리 및 A/B 테스트 전략
기본 사항: 제로샷, 원샷, 퓨샷
신속한 엔지니어링의 가장 기본적인 차이점은 esempi 실제 요청 전에 모델에 제공됩니다.
제로샷: 예시 없음
에서 제로샷 프롬프트, 모델에게 작업 수행을 직접 요청합니다. 어떤 예도 제시하지 않고. 모델이 수행되는 간단하고 잘 정의된 작업에 적합합니다. 훈련 중에 이미 패턴을 배웠습니다.
# Zero-shot: richiesta diretta senza esempi
from anthropic import Anthropic
client = Anthropic()
# Zero-shot classification
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=50,
messages=[{
"role": "user",
"content": "Classifica il sentimento di questa recensione come POSITIVO, NEGATIVO o NEUTRO:\n\n'Il prodotto e arrivato in anticipo e funziona perfettamente. Consigliatissimo!'"
}]
)
print(response.content[0].text) # POSITIVO
Few-Shot: 가이드로서의 예시
Il 몇 번의 메시지 표시 요청 전에 2~5개의 입력/출력 예시를 제공합니다. 이는 구체적인 예를 통해 모델에 원하는 패턴을 "가르쳐" 출력의 일관성과 정확성이 크게 향상됩니다.
# Few-shot: fornire esempi prima della richiesta
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=100,
messages=[{
"role": "user",
"content": """Estrai le entità dal testo nel formato ENTITA: TIPO.
Esempio 1:
Testo: "Mario Rossi lavora a Roma per Acme Corp"
Output:
- Mario Rossi: PERSONA
- Roma: LUOGO
- Acme Corp: ORGANIZZAZIONE
Esempio 2:
Testo: "Il 15 gennaio Apple ha presentato il nuovo iPhone a San Francisco"
Output:
- 15 gennaio: DATA
- Apple: ORGANIZZAZIONE
- iPhone: PRODOTTO
- San Francisco: LUOGO
Testo: "Luca Bianchi partecipera alla conferenza Google I/O 2026 a Mountain View"
Output:"""
}]
)
print(response.content[0].text)
생각의 사슬: 단계별 추론
Il CoT(사고 사슬) 신속한 엔지니어링의 가장 강력한 기술 중 하나입니다. 모델에게 직접적인 대답을 요구하는 대신, 그는 "단계적으로 생각하라"고 권유받고, 추론 과정을 설명한다. 이로 인해 성능이 크게 향상됩니다. 논리, 수학 또는 다단계 추론이 필요한 작업.
# Chain-of-Thought: ragionamento esplicito
# SENZA CoT - risposta spesso errata su problemi complessi
response_no_cot = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=200,
messages=[{
"role": "user",
"content": "Un negozio vende mele a 2 euro al kg. Se compro 3.5 kg e pago con una banconota da 20 euro, quanto resto ricevo? E se applico uno sconto del 10%?"
}]
)
# CON CoT - ragionamento passo dopo passo
response_cot = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{
"role": "user",
"content": """Un negozio vende mele a 2 euro al kg. Se compro 3.5 kg e pago con una banconota da 20 euro, quanto resto ricevo? E se applico uno sconto del 10%?
Ragiona passo dopo passo prima di dare la risposta finale."""
}]
)
print(response_cot.content[0].text)
# Il modello esplicitera:
# 1. Costo base: 3.5 * 2 = 7 EUR
# 2. Resto senza sconto: 20 - 7 = 13 EUR
# 3. Sconto 10%: 7 * 0.10 = 0.70 EUR
# 4. Costo con sconto: 7 - 0.70 = 6.30 EUR
# 5. Resto con sconto: 20 - 6.30 = 13.70 EUR
생각의 연쇄를 사용해야 하는 경우
CoT는 다단계 수학적 문제, 논리적 분석에 특히 효과적입니다. 여러 전제, 균형을 맞추기 위한 여러 기준을 사용한 결정, 코드 디버깅 흐름을 추적해야 하는 경우, 중간 추론이 필요한 작업 최종 답변만큼 중요합니다.
시스템 프롬프트 및 페르소나 주입
Il 시스템 프롬프트 모델의 행동을 사전 조건으로 지정하는 특별한 메시지 전체 대화에 대해. 역할, 어조, 제한 사항을 정의하는 가장 효과적인 방법입니다. 그리고 원하는 출력 형식.
# System prompt: definire ruolo e comportamento
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
system="""Sei un esperto senior di architettura software con 20 anni di esperienza.
REGOLE:
1. Rispondi sempre in modo conciso e pratico
2. Usa esempi di codice Python quando utile
3. Evidenzia trade-off e considerazioni di performance
4. Se una domanda e ambigua, chiedi chiarimenti
5. Non inventare librerie o API inesistenti
FORMATO OUTPUT:
- Risposta breve (2-3 frasi)
- Pro e Contro (se applicabile)
- Esempio di codice (se rilevante)
- Riferimenti a pattern noti""",
messages=[{
"role": "user",
"content": "Dovrei usare un monolite o microservizi per una startup con 3 sviluppatori?"
}]
)
print(response.content[0].text)
사람 주입
La 사람 주사 모델에 할당하는 시스템 프롬프트의 변형 특정 정체성. 이는 롤플레잉이 아닙니다. 지식과 스타일을 활성화하는 기술입니다. 모델의 특정 의사소통 요소.
- "당신은 선임 PostgreSQL DBA입니다": 쿼리 최적화, 인덱스, EXPLAIN ANALYZE에 대한 구체적인 지식 활성화
- "당신은 코드 리뷰를 수행하는 기술 리더입니다.": 유지 관리성, 명명, SOLID 원칙에 중점
- "당신은 B2B 랜딩페이지 카피라이터입니다": 전문적인 톤, 전환에 초점, 효과적인 CTA
구조화된 출력: JSON, 테이블 및 특정 형식
프롬프트 엔지니어링의 가장 실용적인 적용 중 하나는 구조화된 형식으로 결과를 얻는 것입니다. 코드에서 쉽게 파싱할 수 있습니다.
import json
# Richiedere output JSON strutturato
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{
"role": "user",
"content": """Analizza questa descrizione di un bug e restituisci un JSON con questa struttura esatta:
{
"severity": "critical|high|medium|low",
"component": "stringa",
"steps_to_reproduce": ["step1", "step2"],
"expected_behavior": "stringa",
"actual_behavior": "stringa",
"suggested_fix": "stringa"
}
Bug report: "Quando clicco su 'Salva' nel form di profilo con un'immagine maggiore di 5MB, la pagina va in crash con errore 500. Dovrebbe mostrare un messaggio di errore sulla dimensione massima."
Rispondi SOLO con il JSON, senza testo aggiuntivo."""
}]
)
# Parsing sicuro del JSON
try:
bug_data = json.loads(response.content[0].text)
print(f"Severita: {bug_data['severity']}")
print(f"Componente: {bug_data['component']}")
except json.JSONDecodeError:
print("Errore nel parsing JSON")
ReAct 패턴: 추론 + 행동
반응하다 (Reason + Act)와 패턴이 단계를 번갈아 바꾸는 고급 패턴 추론과 행동 단계. 모델은 무엇을 해야할지 생각하고 행동을 수행합니다. 도구), 결과를 관찰하고 작업이 완료될 때까지 주기를 반복합니다.
# Simulazione del pattern ReAct
react_prompt = """Sei un assistente che risolve problemi usando il pattern ReAct.
Per ogni step, usa il formato:
Thought: [ragionamento su cosa fare]
Action: [azione da eseguire]
Observation: [risultato dell'azione]
... (ripeti fino alla soluzione)
Final Answer: [risposta finale]
Strumenti disponibili:
- search(query): cerca informazioni
- calculate(expression): calcola espressioni matematiche
- lookup(database, key): cerca in un database
Domanda: Qual è il costo totale se compro 15 licenze software a 49.99 EUR ciascuna con IVA al 22%?"""
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=500,
messages=[{"role": "user", "content": react_prompt}]
)
print(response.content[0].text)
# Il modello produrra:
# Thought: Devo calcolare il costo base e poi aggiungere l'IVA
# Action: calculate(15 * 49.99)
# Observation: 749.85
# Thought: Ora devo aggiungere l'IVA al 22%
# Action: calculate(749.85 * 1.22)
# Observation: 914.817
# Final Answer: Il costo totale e 914.82 EUR (749.85 + 164.97 IVA)
고급 최적화 기술
기본적인 기술 외에도 결과물의 품질을 극대화하기 위한 고급 전략이 있습니다.
구분 기호 및 구조
사용 구분 기호 프롬프트의 다른 부분을 구분하기 위해 명확하게 합니다. 모호성을 줄이고 모델에 대한 이해를 향상시킵니다.
- 삼중 따옴표(
""") 분석할 텍스트를 묶습니다. - XML 태그(
<context>,<instructions>) 섹션 구조화 - 해시 마커(
###) 논리 섹션을 분리하기 위해 - 다단계 지침에 대한 명시적 번호 지정
부정적인 메시지
무엇을 지정 아니다 무엇을 해야 할지를 지정하는 것만큼 중요한 것은 무엇을 해야 할지를 지정하는 것입니다. 음수 명령은 모델이 원치 않는 일반적인 패턴을 방지하는 데 도움이 됩니다.
- "'물론이죠!'라는 말로 시작하지 마세요. 또는 '물론이죠!'"
- "상황에 맞는 데이터나 통계가 없다면 데이터나 통계를 만들어내지 마십시오."
- "답변에서 질문을 반복하지 마십시오"
- "답을 모르면 그렇다고 말하세요. 꾸며내지 마세요."
자기 일관성
기술은 자기 일관성 동일한 것에 대한 여러 응답을 생성하는 것으로 구성됩니다. 프롬프트(온도 > 0)를 선택하고 가장 빈번한 응답이나 모델이 사용한 응답을 선택합니다. 수렴한다. 이는 정답이 정의된 작업에 특히 유용합니다.
프롬프트 엔지니어링 체크리스트
- 명확한 시스템 프롬프트로 역할 정의
- 특정 작업이나 사용자 정의 형식에 대해 퓨샷을 사용하세요.
- 복잡한 추론을 위해 CoT 활성화("단계별 추론")
- 원하는 출력 형식(JSON, 목록, 테이블)을 지정하세요.
- 구분 기호를 사용하여 컨텍스트, 명령문 및 입력을 구분합니다.
- 원치 않는 패턴을 피하기 위해 부정적인 지침을 포함합니다.
- 다양한 온도로 테스트하여 최적의 균형을 찾으세요.
- A/B 테스트를 통해 프롬프트 버전을 지정하고 성과를 추적하세요.
신속한 버전 관리 및 테스트
프로덕션에서 프롬프트는 다음과 같습니다. 암호. 버전을 관리하고, 테스트하고, 모니터링해야 합니다. 다른 소프트웨어 구성 요소와 마찬가지로. 프롬프트에 대한 겉보기에 무해해 보이는 변경은 다음과 같습니다. 모델의 동작을 대폭 변경합니다.
# Sistema semplice di prompt versioning e testing
from dataclasses import dataclass
from typing import Callable
@dataclass
class PromptVersion:
version: str
system_prompt: str
template: str
evaluator: Callable[[str], float]
# Definisci versioni del prompt
v1 = PromptVersion(
version="1.0",
system_prompt="Sei un assistente utile.",
template="Riassumi questo testo: {text}",
evaluator=lambda output: len(output.split()) / 100 # brevita
)
v2 = PromptVersion(
version="2.0",
system_prompt="Sei un editor esperto. Produci riassunti concisi e informativi.",
template="""Riassumi il seguente testo in massimo 3 bullet point.
Ogni punto deve contenere un'informazione chiave con dati specifici.
Testo:
\"\"\"{text}\"\"\"
Formato output:
- [punto 1]
- [punto 2]
- [punto 3]""",
evaluator=lambda output: len(output.split()) / 50 # brevita più stretta
)
# A/B test
def test_prompt(version: PromptVersion, test_texts: list) -> float:
scores = []
for text in test_texts:
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=300,
system=version.system_prompt,
messages=[{"role": "user", "content": version.template.replace("{text}", text)}]
)
score = version.evaluator(response.content[0].text)
scores.append(score)
return sum(scores) / len(scores)
결론
신속한 엔지니어링은 정적인 기술이 아닙니다. 모델과 이해를 통해 발전합니다. 그들의 능력. 이 기사에 제시된 기술 - 제로샷, 퓨샷, CoT, 시스템 프롬프트, 구조화된 출력, ReAct - 상호 작용을 위한 완벽한 툴킷 구성 어떤 LLM에서도 효과적으로.
핵심은 프롬프트를 코드로 처리하여 버전을 지정하고, 테스트하고, 반복하는 것입니다. 잘 설계된 프롬프트를 사용하면 많은 경우 미세 조정이 필요하지 않습니다. 상당한 시간과 비용을 절약합니다.
다음 기사에서는 미세 조정: 엔지니어링 프롬프트가 표시될 때 그것만으로는 충분하지 않으며 다음과 같은 효율적인 기술을 사용하여 모델 자체를 데이터에 맞게 조정해야 합니다. LoRA, QLoRA 및 PEFT.







