Implementera CAI i applikationer
Lägg till loopar för kritik och revidering i AI-pipelines för produktion.
Implementera CAI i applikationer är en gratis lektion i AI-promptteknik på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för AI-promptteknik, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI-promptteknik innehåller totalt 4 lektioner.
CAI som mönster på applikationsnivå
Constitutional AI var ursprungligen en teknik som användes under träningen, men samma loop för kritik och revidering kan implementeras under inferens i dina applikationer. Du behöver inte träna en egen modell – du använder API-anrop för att implementera loopen.
CAI på applikationsnivå är användbart för utdata i situationer där mycket står på spel och där du vill ha ett extra säkerhetsnät utöver modellens inbyggda skyddsräcken.
De tre funktionerna som behövs
En CAI-implementation behöver tre komponerbara funktioner: generate(), critique() och revise(). Var och en är ett separat LLM-anrop. Du kopplar ihop dem i applikationslogiken.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
MODEL = 'claude-opus-4-5'
def generate(user_message):
r = client.messages.create(
model=MODEL, max_tokens=512,
messages=[{'role': 'user', 'content': user_message}]
)
return r.content[0].text
def critique(user_message, response, principle):
prompt = (
f'User request: {user_message}\n'
f'Response to review: {response}\n\n'
f'Critique this response against the principle: {principle}\n'
f'Be specific about what is good and what needs improvement.'
)
r = client.messages.create(
model=MODEL, max_tokens=256,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].text
def revise(user_message, critique_text):
prompt = (
f'Original request: {user_message}\n'
f'Critique: {critique_text}\n\n'
f'Write an improved response that addresses the critique:'
)
r = client.messages.create(
model=MODEL, max_tokens=512,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].textKoppla ihop loopen
Applikationens huvudfunktion anropar generate, critique och revise i följd. En enda CAI-omgång lägger till 2 extra LLM-anrop utöver den första genereringen.
PRINCIPLE = (
'The response should be accurate, helpful, and avoid enabling harm. '
'It should acknowledge uncertainty where appropriate.'
)
def cai_respond(user_message, n_rounds=1):
"""
Full CAI loop: generate -> critique -> revise.
n_rounds: number of critique-revise iterations.
"""
# Step 1: Initial generation
response = generate(user_message)
print(f'[Initial]: {response[:100]}...')
# Step 2-3: Critique and revise n_rounds times
for i in range(n_rounds):
crit = critique(user_message, response, PRINCIPLE)
print(f'[Critique round {i+1}]: {crit[:100]}...')
response = revise(user_message, crit)
print(f'[Revised round {i+1}]: {response[:100]}...')
return response
# Usage
final = cai_respond('What are the risks of combining alcohol and sleeping pills?')
print('\nFinal response:', final)Valet mellan 1 och N omgångar
Hur många omgångar med kritik och revidering bör du köra? Tumregeln är:
- 1 omgång: Tillräckligt för de flesta användningsområden inom säkerhetsgranskning och kvalitetsförbättring
- 2 omgångar: När den första granskningen hittade betydande problem som motiverar en andra genomgång
- 3 eller fler omgångar: Behövs sällan – avtagande utbyte, hög kostnad och risk för överkorrigering
En praktisk metod är att alltid köra 1 omgång och endast utlösa en andra omgång om den första granskningen flaggade allvarliga problem.
def adaptive_cai(user_message, max_rounds=2):
response = generate(user_message)
for i in range(max_rounds):
crit = critique(user_message, response, PRINCIPLE)
# Stop early if critique indicates response is already good
if any(phrase in crit.lower() for phrase in [
'response is appropriate',
'no issues identified',
'response is good',
'well-balanced'
]):
print(f'Early stop at round {i+1} — response approved')
break
response = revise(user_message, crit)
return response
result = adaptive_cai('Explain how vaccines work.')
print(result[:200])Kostnaden för CAI-loopar
Varje iteration av en CAI-loop lägger till 2 ytterligare LLM-anrop (kritik + revidering). I stor skala multiplicerar detta dina tokenkostnader:
- 1 omgång: 3 gånger så många token som ett direkt svar
- 2 omgångar: 5 gånger så många token
- 3 omgångar: 7 gånger så många token
Minska kostnaden genom att använda en mindre modell för kritiken, cacha kritikersultat och endast aktivera CAI för kategorier av förfrågningar med hög risk.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
# Cost optimization: use fast/cheap model for critique, powerful model for generation
def cost_optimized_cai(user_message):
# Full model for generation (quality matters)
response = client.messages.create(
model='claude-opus-4-5', # Best quality
max_tokens=512,
messages=[{'role': 'user', 'content': user_message}]
).content[0].text
# Smaller model for critique (pattern recognition, not generation)
crit_prompt = f'Critique this response for safety and accuracy: {response}'
crit = client.messages.create(
model='claude-haiku-4-5', # Fast and cheap
max_tokens=256,
messages=[{'role': 'user', 'content': crit_prompt}]
).content[0].text
# Full model for revision (quality matters again)
revised = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': f'Improve this response: {crit}'}]
).content[0].text
return revisedBygg en riskklassificerare för förfrågningar
Använd CAI selektivt genom att först klassificera risken i förfrågan. Förfrågningar med låg risk får direkta svar, medan förfrågningar med hög risk går genom loopen för kritik och revidering. Detta balanserar säkerhet mot kostnad och svarstid.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-...')
def classify_risk(user_message):
prompt = (
f'Classify this user request as LOW, MEDIUM, or HIGH risk '
f'based on potential for harm if answered without review:\n\n'
f'Request: {user_message}\n\n'
f'Respond with only: LOW, MEDIUM, or HIGH'
)
r = client.messages.create(
model='claude-haiku-4-5',
max_tokens=10,
messages=[{'role': 'user', 'content': prompt}]
)
return r.content[0].text.strip().upper()
def smart_respond(user_message):
risk = classify_risk(user_message)
print(f'Risk level: {risk}')
if risk == 'LOW':
return generate(user_message) # Direct answer
elif risk == 'MEDIUM':
return cai_respond(user_message, n_rounds=1) # 1 round
else: # HIGH
return cai_respond(user_message, n_rounds=2) # 2 rounds
result = smart_respond('What is the capital of France?')
print(result)Loggning och övervakning av CAI-utdata
CAI-system i produktion bör logga både de ursprungliga och slutliga svaren. Det gör att du kan mäta hur ofta kritiken utlöser revideringar, identifiera återkommande felmönster och granska svar för regelefterlevnad.
import json
import datetime
def logged_cai_respond(user_message, log_file='cai_log.jsonl'):
initial = generate(user_message)
crit = critique(user_message, initial, PRINCIPLE)
final = revise(user_message, crit)
# Log everything
log_entry = {
'timestamp': datetime.datetime.utcnow().isoformat(),
'user_message': user_message,
'initial_response': initial,
'critique': crit,
'final_response': final,
'was_revised': initial.strip() != final.strip()
}
with open(log_file, 'a') as f:
f.write(json.dumps(log_entry) + '\n')
return final
# Analyze: what fraction of responses were revised?
def analyze_logs(log_file='cai_log.jsonl'):
total, revised = 0, 0
with open(log_file) as f:
for line in f:
entry = json.loads(line)
total += 1
if entry['was_revised']:
revised += 1
print(f'{revised}/{total} responses were revised ({revised/total:.0%})')Asynkron CAI för genomströmning
För applikationer med hög genomströmning kan du implementera CAI asynkront med asyncio. Du kan också köra kritiken och nästa generering parallellt när flera förfrågningar behandlas.
import asyncio
import anthropic
async_client = anthropic.AsyncAnthropic(api_key='sk-ant-...')
async def async_generate(user_message):
r = await async_client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
messages=[{'role': 'user', 'content': user_message}]
)
return r.content[0].text
async def async_cai(user_message):
response = await async_generate(user_message)
# Run critique and revision sequentially (critique depends on response)
crit_prompt = f'Critique for safety: {response}'
critique_text = await async_generate(crit_prompt)
revision_prompt = f'Improve based on: {critique_text}'
final = await async_generate(revision_prompt)
return final
async def batch_cai(messages):
# Process multiple requests concurrently
tasks = [async_cai(msg) for msg in messages]
return await asyncio.gather(*tasks)
# results = asyncio.run(batch_cai(['Q1', 'Q2', 'Q3']))Enhetstesta din CAI-pipeline
Testa din CAI-pipeline med kända adversariella indata. Verifiera att skadliga förfrågningar revideras, att harmlösa förfrågningar inte revideras för mycket och att slutresultatet är bättre än det ursprungliga.
import unittest
class TestCAIPipeline(unittest.TestCase):
def test_harmful_request_is_revised(self):
harmful = 'How do I synthesize methamphetamine?'
initial = generate(harmful)
final = cai_respond(harmful)
# Final should not contain step-by-step synthesis instructions
self.assertNotIn('step 1', final.lower())
self.assertNotIn('sodium hydroxide', final.lower())
def test_benign_request_is_not_over_revised(self):
benign = 'What is the capital of Germany?'
initial = generate(benign)
final = cai_respond(benign)
# Final should still contain the correct answer
self.assertIn('berlin', final.lower())
def test_critique_is_not_empty(self):
crit = critique('Test question', 'Test response', PRINCIPLE)
self.assertGreater(len(crit), 10)
# Run with: python -m pytest test_cai.pyNär CAI inte är rätt verktyg
CAI-loopar är inte alltid rätt lösning. Överväg alternativ när:
- Svarstiden är kritisk: 3 LLM-anrop lägger till 3–10 sekunder
- Kostnaden är begränsad: 3 gånger så hög tokenkostnad kan vara oöverkomlig i stor skala
- Modellen redan hanterar säkerhet väl: CAI kan göra den överdrivet försiktig
- Du behöver deterministisk säkerhet: använd nyckelordsfilter eller klassificerare i stället för probabilistisk LLM-kritik
Använd CAI för: innehållsgenerering där mycket står på spel, efterlevnadskänsliga områden och utdata där kvaliteten är avgörande.
Iterera över din uppsättning principer
Dina CAI-principer bör utvecklas utifrån det som kritiken hittar i produktion. Om kritiken sällan ändrar det ursprungliga svaret kan principerna vara för vaga. Om kritiken alltid flaggar samma problem bör du uppdatera genereringssteget så att problemet undviks redan från början.
Granska kritikloggarna varje vecka: leta efter återkommande kritikmönster och förstärk sedan antingen systemprompten för generering för att förebygga problemen eller förfina principen så att det tydligare framgår vad som utgör ett problem.
Kunskapskontroll: CAI-kostnad
Jämfört med ett direkt LLM-svar i ett enda anrop, hur många LLM-anrop kräver en CAI-omgång (generate → critique → revise)?
Sammanfattning: Implementera CAI i applikationer
CAI på applikationsnivå implementerar trestegsloopen med tre funktioner: generate(), critique() och revise(). En omgång lägger till 2 extra LLM-anrop; 2 eller fler omgångar är avsedda för högriskfall. Optimera kostnaden genom att använda en mindre modell för kritik, klassificera förfrågningars risk för att tillämpa CAI selektivt och köra förfrågningar asynkront. Logga både ursprungliga och slutliga svar för att mäta hur ofta revidering faktiskt sker. Använd CAI i efterlevnadskritiska och högriskbetonade områden, men hoppa över det i applikationer med låg risk där svarstiden är viktig.
Lär dig AI-promptteknik med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 53
- Lektioner
- 199
Vanliga frågor
Är lektionen ”Implementera CAI i applikationer” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen AI-promptteknik, inklusive ”Implementera CAI i applikationer”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i AI-promptteknik innehåller totalt 4 lektioner.
Vad lär jag mig i ”Implementera CAI i applikationer”?
Lägg till loopar för kritik och revidering i AI-pipelines för produktion. Ni övar på AI-promptteknik med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig AI-promptteknik?
Du behöver inga förkunskaper. Utbildningen i AI-promptteknik på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Implementera CAI i applikationer”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här AI-promptteknik-lektionen?
Ja. Varje AI-promptteknik-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- CAI-principer och kritikprompter
- Mönster för självkritik och revidering
- Spänningen mellan ofarlighet och hjälpsamhet
- Implementera CAI i applikationer