Wzorce „wynik jako dane wejściowe”
Wyodrębniaj dane strukturalne z kroku 1, aby przekazać je do kroku 2.
Wzorce „wynik jako dane wejściowe” to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Główne wyzwanie: ekstrakcja i wstrzykiwanie
W łańcuchu promptów Krok 1 generuje tekst. Krok 2 potrzebuje konkretnego fragmentu tego tekstu jako danych wejściowych. Wyzwanie polega na niezawodnym wyodrębnieniu dokładnie właściwego pola z danych wyjściowych Kroku 1 i czystym wstrzyknięciu go do promptu Kroku 2.
Jeśli Krok 1 zwraca nieustrukturyzowaną prozę, ekstrakcja jest zawodna. Rozwiązaniem jest zaprojektowanie promptów Kroku 1 tak, aby zwracały ustrukturyzowane dane wyjściowe — zazwyczaj JSON — które można przeanalizować i wstrzyknąć programowo.
Projektowanie kroku 1 z myślą o przetwarzaniu maszynowym
Prompt przeznaczony do zasilania łańcucha powinien zawsze zwracać dane strukturalne. W promptcie należy określić dokładny schemat JSON:
import anthropic
import json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
step1_prompt = '''
<task>
Analyze the customer review below.
</task>
<review>
The onboarding was confusing and took 3 hours. The core feature works great though.
</review>
<output_format>
Return ONLY a JSON object. No other text.
{
"sentiment": "positive|negative|mixed",
"issues": ["string"],
"positives": ["string"],
"priority": "high|medium|low"
}
</output_format>
'''
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=300,
messages=[{'role': 'user', 'content': step1_prompt}]
)
print(response.content[0].text)Parsowanie wyniku kroku 1
Gdy krok 1 zwróci JSON, należy sparsować go w Pythonie i wyodrębnić pola potrzebne w kroku 2:
import json
def parse_step1_output(raw_text):
# Models sometimes wrap JSON in extra text -- strip it
text = raw_text.strip()
# Find the first { and last } to extract JSON object
start = text.find("{")
end = text.rfind("}")
if start != -1 and end != -1 and end > start:
text = text[start:end+1]
try:
return json.loads(text)
except json.JSONDecodeError as e:
raise ValueError("Step 1 output is not valid JSON: " + str(e))
# Example usage
raw = '{"sentiment": "mixed", "issues": ["confusing onboarding"], "positives": ["core feature"], "priority": "high"}'
parsed = parse_step1_output(raw)
print(parsed['issues'])
print(parsed['priority'])Wstrzykiwanie wyodrębnionych pól do kroku 2
Po sparsowaniu należy wstrzyknąć określone pola do szablonu promptu kroku 2. Można użyć f-stringów Pythona lub zmiennych szablonu:
def build_step2_prompt(parsed_step1):
issues = '\n'.join(f'- {issue}' for issue in parsed_step1['issues'])
priority = parsed_step1['priority']
sentiment = parsed_step1['sentiment']
return f'''
<context>
A customer review was analyzed. Overall sentiment: {sentiment}. Priority: {priority}.
</context>
<task>
Write a customer support response addressing these specific issues:
{issues}
Acknowledge the positives before addressing the issues.
</task>
<output_format>
Plain text response, 3 sentences maximum, professional tone.
</output_format>
'''
parsed = {'sentiment': 'mixed', 'issues': ['confusing onboarding'], 'priority': 'high', 'positives': ['core feature']}
print(build_step2_prompt(parsed))Kompletny łańcuch dwuetapowy
Połączenie parsowania i wstrzykiwania w kompletny dwuetapowy potok:
import anthropic, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
def call(prompt, max_tokens=500):
r = client.messages.create(
model='claude-opus-4-5', max_tokens=max_tokens,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].text
def review_response_chain(review_text):
# Step 1: Analyze
step1 = call(f'Analyze this review. Return JSON: {{"sentiment": str, "issues": [str], "priority": str}}\n\nReview: {review_text}')
parsed = json.loads(step1.strip())
# Inject into Step 2
issues_str = ', '.join(parsed['issues'])
step2_prompt = f'Write a 2-sentence support reply. Issues to address: {issues_str}. Priority: {parsed["priority"]}.'
# Step 2: Draft response
reply = call(step2_prompt)
return reply
print(review_response_chain('Login is broken. App crashes on startup.'))Wstrzykiwanie zagnieżdżonego JSON-a
Gdy krok 1 zwraca zagnieżdżone obiekty, należy wyodrębnić tylko to, czego potrzebuje krok 2, aby zachować zwięzłość wstrzykiwanego promptu:
step1_output = {
'document': {
'title': 'Q3 Report',
'sections': [
{'name': 'Revenue', 'value': '$4.2M', 'change': '+12%'},
{'name': 'Users', 'value': '85,000', 'change': '+5%'},
{'name': 'Churn', 'value': '3.2%', 'change': '-0.8%'}
]
},
'summary': 'Strong revenue quarter with moderate user growth.'
}
# Extract only what Step 2 needs — not the full nested object
def extract_for_step2(data):
sections = data['document']['sections']
metrics = '\n'.join(f"{s['name']}: {s['value']} ({s['change']})" for s in sections)
return {
'metrics': metrics,
'summary': data['summary']
}
step2_input = extract_for_step2(step1_output)
print(step2_input)Unikanie nadmiernego wstrzykiwania
Częstym błędem jest wstrzyknięcie całego wyniku kroku 1 do kroku 2. Powoduje to nadmierne rozbudowanie promptu kroku 2 i może zdezorientować model przez dodanie nieistotnych pól.
- Źle:
f'Here is the analysis: {str(all_of_step1_output)}' - Dobrze: Należy wyodrębnić tylko pola potrzebne krokowi 2 i wstrzyknąć je z użyciem czytelnych etykiet
Krok 2 powinien otrzymać dokładnie te informacje, których potrzebuje — ani więcej, ani mniej.
Warunkowe rozgałęzianie na podstawie wyniku
Sparsowany wynik kroku 1 może decydować o tym, który prompt kroku 2 zostanie uruchomiony — przekształcając liniowy łańcuch w rozgałęziony potok:
def route_chain(user_message):
# Step 1: Classify intent
classification = json.loads(call(
f'Classify this message as billing, technical, or general. Return JSON: {{"intent": str}}\n\nMessage: {user_message}'
))
intent = classification['intent']
# Route to specialized Step 2 prompt
if intent == 'billing':
prompt = f'You are a billing specialist. Address: {user_message}'
elif intent == 'technical':
prompt = f'You are a senior engineer. Provide technical guidance for: {user_message}'
else:
prompt = f'You are a general support agent. Respond to: {user_message}'
return call(prompt)
print(route_chain('My invoice shows a wrong amount.'))Gromadzenie stanu między krokami
W przypadku dłuższych łańcuchów należy utrzymywać słownik stanu, który gromadzi wyniki każdego kroku:
def run_pipeline(initial_input):
state = {'input': initial_input}
# Step 1
state['entities'] = json.loads(call(
f'Extract entities as JSON: {{"people": [], "companies": []}}\n\n{state["input"]}'
))
# Step 2 uses entities from Step 1
companies_str = ', '.join(state['entities'].get('companies', []))
state['company_types'] = call(
f'Classify these companies as startup/enterprise: {companies_str}'
)
# Step 3 uses output from Steps 1 and 2
state['summary'] = call(
f'Write a 2-sentence summary.\nEntities: {state["entities"]}\nClassifications: {state["company_types"]}'
)
return state
result = run_pipeline('Apple and OpenAI announced a partnership with Elon Musk.')
print(result['summary'])Narzędzia do wyodrębniania JSON-a
Należy zbudować narzędzie wielokrotnego użytku do wyodrębniania danych na potrzeby infrastruktury łańcucha:
import re, json
def extract_json(text):
"Extract JSON from model output, handling extra text around the object."
# Try direct parse first
try:
return json.loads(text.strip())
except json.JSONDecodeError:
pass
# Try finding JSON object by bracket matching
start = text.find("{")
end = text.rfind("}")
if start != -1 and end != -1 and end > start:
try:
return json.loads(text[start:end+1])
except json.JSONDecodeError:
pass
# Try finding JSON array
start = text.find("[")
end = text.rfind("]")
if start != -1 and end != -1 and end > start:
try:
return json.loads(text[start:end+1])
except json.JSONDecodeError:
pass
raise ValueError("Could not extract JSON from: " + text[:200])
print(extract_json('{"key": "value"}'))Testowanie wzorców wynik–wejście
Potoki wynik–wejście wymagają testowania na dwóch poziomach:
- Testowanie jednostkowe każdego kroku: Czy krok 1 niezawodnie zwraca JSON, który można sparsować? Czy krok 2 generuje prawidłowy wynik dla określonego wyodrębnionego wejścia?
- Testowanie integracyjne łańcucha: Czy kompleksowy potok generuje prawidłowe wyniki dla reprezentatywnych danych wejściowych?
Aby zachować deterministyczność promptów poszczególnych kroków, należy używać temperature=0 w krokach klasyfikacji i ekstrakcji, w których spójność ma znaczenie.
def test_step1(review_text, expected_sentiment):
raw = call(f'Analyze review. Return JSON: {{"sentiment": str}}\n\n{review_text}')
parsed = extract_json(raw)
assert parsed['sentiment'] == expected_sentiment, f'Expected {expected_sentiment}, got {parsed["sentiment"]}'
print(f'PASS: sentiment={parsed["sentiment"]}')
# Run unit test for Step 1
test_step1('The product is excellent!', 'positive')
test_step1('This is terrible.', 'negative')Szybkie sprawdzenie
Jaki format wyniku jest zalecany dla kroku 1 łańcucha promptów, gdy wynik będzie programowo wyodrębniany i wstrzykiwany do kroku 2?
Wynik–wejście — najważniejsze informacje
Niezawodne wzorce wynik–wejście są kluczem do przygotowania łańcuchów promptów do użycia produkcyjnego:
- Projektuj prompty kroku 1 tak, aby zwracały JSON z jawnym schematem — nie tekst opisowy
- Parsuj wynik kroku 1 przed wstrzyknięciem: usuwaj znaczniki bloków Markdown i obsługuj JSONDecodeError
- Wstrzykuj tylko konkretne pola potrzebne krokowi 2 — unikaj nadmiernego wstrzykiwania
- Używaj słowników stanu do gromadzenia i przekazywania danych w dłuższych łańcuchach
- Sparsowany wynik może sterować warunkowym rozgałęzianiem i kierować dane do wyspecjalizowanych promptów kroku 2
- Buduj narzędzia wielokrotnego użytku do wyodrębniania JSON-a, które obsługują niespójności w wynikach modelu
- Testuj jednostkowo każdy krok niezależnie, a następnie testuj integracyjnie cały potok
Często zadawane pytania
Czy lekcja „Wzorce „wynik jako dane wejściowe”” jest bezpłatna?
Tak — pełny tekst „Wzorce „wynik jako dane wejściowe”” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorce „wynik jako dane wejściowe””?
Wyodrębniaj dane strukturalne z kroku 1, aby przekazać je do kroku 2. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?
Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Wzorce „wynik jako dane wejściowe””?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?
Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Czym jest łańcuch promptów?
- Wzorce „wynik jako dane wejściowe”
- Łańcuchy sekwencyjnych transformacji
- Obsługa błędów w łańcuchach promptów