पाठ 6 / 27
भूमिकाएँ, System Prompts और बातचीत का इतिहास
बहु-turn बातचीत सही बनाएँ।
हर बार पूरा इतिहास भेजें
Messages user और assistant के बीच बारी-बारी आते हैं; system prompt स्थायी निर्देश (भूमिका, नियम, format) तय करता है। बातचीत जारी रखने के लिए assistant का उत्तर और अगला user संदेश अपनी सूची में जोड़ें और पूरी सूची फिर भेजें। इसका अर्थ है कि लागत और latency लंबाई के साथ बढ़ती है, और सूची context window पार कर सकती है। उसे सोच-समझकर सँभालें: system prompt रखें, नवीनतम turns रखें, पुराने का सार करें या हटाएँ, और audit के लिए पूरा log अलग रखें। जहाँ संभव हो user-दिया पाठ system prompt से बाहर रखें, और किसी भी prompt में secrets कभी न रखें।
System prompt कहाँ जाता है, चलाकर
मैंने यह Python virtual environment में anthropic 1.11.0 और openai 3.22.1 SDKs के साथ छोटे स्थानीय stand-in server (testing विषय में दिखाया, mock.py नाम से सहेजा) के विरुद्ध चलाया। Server तैयार उत्तर लौटाता है, इसलिए कोई key, network या असली मॉडल शामिल नहीं: यह साबित करता है कि SDK requests कैसे बनाता और उत्तर कैसे सँभालता है, यह नहीं कि असली मॉडल क्या कहता। वही निर्देश दो तरह से भेजा गया। Anthropic उसे शीर्ष-स्तर system field में पाता है; OpenAI उसे system भूमिका वाले पहले message के रूप में।
import mock, anthropic, openai
srv = mock.start(); base = f"http://127.0.0.1:{srv.server_address[1]}" # local stand-in server, not a real API
a = anthropic.Anthropic(api_key="k", base_url=base)
a.messages.create(model="demo-model", max_tokens=50, system="You are a terse assistant.",
messages=[{"role": "user", "content": "Hi"}])
print("anthropic body:", mock.STATE["log"][-1]["body"])
o = openai.OpenAI(api_key="k", base_url=base + "/v1")
o.chat.completions.create(model="demo-model", messages=[
{"role": "system", "content": "You are a terse assistant."}, {"role": "user", "content": "Hi"}])
print("openai body: ", mock.STATE["log"][-1]["body"])
Output:
anthropic body: {'max_tokens': 50, 'messages': [{'role': 'user', 'content': 'Hi'}], 'model': 'demo-model', 'system': 'You are a terse assistant.'}
openai body: {'messages': [{'role': 'system', 'content': 'You are a terse assistant.'}, {'role': 'user', 'content': 'Hi'}], 'model': 'demo-model'}बजट में इतिहास trim करना, चलाकर
मैंने यह सादा-Python (सिर्फ़ standard library) उदाहरण चलाया। Function system message और 130 अक्षरों में समाने वाले नवीनतम turns रखता है: 9 messages 4 बन जाते हैं (system message और turns 6, 7, 8)। असली कोड अक्षरों की जगह provider के tokenizer से tokens गिनता।
def trim(messages, max_chars):
"""Keep the system message, then the newest turns that fit."""
system, rest = messages[0], messages[1:]
kept, used = [], len(system["content"])
for m in reversed(rest):
used += len(m["content"])
if used > max_chars: break
kept.append(m)
return [system] + list(reversed(kept))
chat = [{"role": "system", "content": "Be brief."}]
for i in range(1, 9):
chat.append({"role": "user" if i % 2 else "assistant", "content": f"turn {i} " + "x" * 30})
short = trim(chat, 130)
print(len(chat), "messages ->", len(short))
print([" ".join(m["content"].split()[:2]) for m in short])
Output:
9 messages -> 4 ['Be brief.', 'turn 6', 'turn 7', 'turn 8']
पूरा log कहीं और रखें
मॉडल को trim इतिहास भेजें पर support और audits के लिए पूरी बातचीत अपने database में रखें।
त्वरित जाँच: बातचीत जारी रखने के लिए क्या भेजना होगा?
- कुछ नहीं; server याद रखता है
- सिर्फ़ नवीनतम संदेश
- सिर्फ़ API key
- प्रासंगिक इतिहास और नया संदेश
Answer
प्रासंगिक इतिहास और नया संदेश — API stateless है; संदर्भ वही है जो आप भेजें।