بڑے پیمانے پر زبان کے ماڈل سوالات کے جواب دے سکتے ہیں، دستاویزات کا خلاصہ کر سکتے ہیں، کوڈ لکھ سکتے ہیں، اور بیرونی نظاموں کے ساتھ تعامل کر سکتے ہیں۔ لیکن قابل اعتماد AI ایپلی کیشنز بنانے کے لیے اشارے بھیجنے اور ردعمل ظاہر کرنے سے زیادہ کی ضرورت ہوتی ہے۔
پروڈکشن کے لیے تیار ایپلی کیشن کو بات چیت کی سرگزشت کا نظم کرنا، متعلقہ سیاق و سباق فراہم کرنا، ٹولز کو محفوظ طریقے سے استعمال کرنا، ردعمل کی مختلف اقسام کو ہینڈل کرنا، اور اس بات کا اندازہ لگانا چاہیے کہ آیا تیار کردہ آؤٹ پٹ مفید ہے۔
اس ٹیوٹوریل میں ہم بنائیں گے: شاپنگ اسسٹنٹخیالی آن لائن اسٹور کے لیے کسٹمر سپورٹ اسسٹنٹ۔ بالآخر، ShopHelper کر سکتا ہے:
-
ایک مستقل لہجے میں عام سوالات کے جواب دیں۔
-
یاد رکھیں کہ گاہک نے پہلے کیا کہا تھا۔
-
اپنے آرڈر کی حالت جاننے کے لیے اپنے کوڈ میں موجود فنکشن کو کال کریں۔
-
کلاڈ کے ملٹی بلاک جوابات کو محفوظ طریقے سے ہینڈل کریں۔
-
ورک فلو کا استعمال کرتے ہوئے سپورٹ ٹکٹس کو ہینڈل کریں۔
-
اندازہ لگائیں کہ آیا تیز رفتار تبدیلیوں سے نتائج میں بہتری آتی ہے۔
ہر سیکشن میں ایک حصہ شامل ہوتا ہے تاکہ آپ خود اپنے ایڈیٹر میں اس کی پیروی کر سکیں۔
انڈیکس
شرطیں
آپ کے پاس ہونا چاہیے:
اپنے پروجیکٹ کو کیسے ترتیب دیں اور اپنی API کیز کو محفوظ رکھیں
ایک ورچوئل ماحول بنائیں اور اینتھروپک پائتھون SDK انسٹال کریں۔
python -m venv .venv
source .venv/bin/activate
pip install anthropic python-dotenv
ونڈوز کے لیے:
.venv\Scripts\activate
بنانا .env فائل:
ANTHROPIC_API_KEY=your_api_key_here
آپ کی API کلید آپ کی خفیہ اسناد ہے۔ اسے براؤزر JavaScript، موبائل ایپ کوڈ، یا کلائنٹ سائڈ کنفیگریشن میں نہ رکھیں۔ ذخیرہ اندوزی کا کبھی عہد نہ کریں۔
echo ".env" >> .gitignore
اگر آپ بعد میں ویب انٹرفیس شامل کرتے ہیں، تو چابیاں بیک اینڈ میں رکھیں۔
Browser → Your backend → Claude API
بنانا app.py:
import os
from anthropic import Anthropic
from dotenv import load_dotenv
load_dotenv()
MODEL = "claude-sonnet-5"
client = Anthropic(
api_key=os.environ["ANTHROPIC_API_KEY"]
)
load_dotenv() اس سے قدریں لوڈ کریں: .env. کہ MODEL مستقل کا مطلب ہے کہ آپ کو صرف ایک جگہ پر ماڈل کا نام تبدیل کرنے کی ضرورت ہے۔ مثال چلانے سے پہلے، یقینی بنائیں کہ ماڈل شناخت کنندہ آپ کے اکاؤنٹ میں دستیاب ہے۔
پہلی درخواست کا طریقہ
response = client.messages.create(
model=MODEL,
max_tokens=500,
messages=[
{
"role": "user",
"content": "Explain what an API is in simple terms."
}
],
)
answer = "".join(
block.text
for block in response.content
if block.type == "text"
)
print(answer)
درخواست میں تین اہم حصے شامل ہیں:
-
modelکلاڈ ماڈل کو منتخب کریں جو درخواست کو سنبھالتا ہے۔ خصوصیات، رفتار، اور قیمت ماڈلز کے درمیان مختلف ہو سکتی ہے۔ -
max_tokensمتن کی زیادہ سے زیادہ مقدار کو محدود کرتا ہے جو Claude پیدا کر سکتا ہے۔ چھوٹی قدریں تاخیر کو کم کر سکتی ہیں، لیکن Claude کو اپنا جواب مکمل کرنے سے پہلے رکنے کا سبب بن سکتی ہیں۔ -
messagesگفتگو پر مشتمل ہے۔ ہر پیغام میںroleاورcontent. کردار عام طور پر ہوتا ہے۔userیاassistant.
مثال کے طور پر، ایک بار کی درخواست میں ایک صارف کا پیغام شامل ہے۔ ملٹی ٹرن گفتگو میں سابقہ صارف اور معاون پیغامات شامل ہوتے ہیں۔
کلاڈ واپس آ گیا ہے۔ response.contentان پٹ مواد کے بلاکس کی فہرست۔ عام بلاکس ہیں:
| بلاک کی قسم | معنی |
|---|---|
text |
تیار کردہ متن |
tool_use |
اپنی درخواست سے ٹول کال کرنے کو کہیں۔ |
thinking |
فعال مواد کا اندازہ |
اس مثال میں، ہم مفروضے بنانے کے بجائے متن کے بلاکس جمع کرتے ہیں۔ response.content[0] یہ ہمیشہ متن ہے.
آپ نگرانی کے مقاصد کے لیے استعمال کی معلومات کا معائنہ کر سکتے ہیں۔
print(response.usage.input_tokens)
print(response.usage.output_tokens)
اپنی گفتگو کی سرگزشت کا نظم کیسے کریں۔
کلاڈ خود بخود علیحدہ API درخواستوں کو یاد نہیں رکھتا ہے۔ ہم ہر درخواست کے لیے متعلقہ تفصیلات بھیجتے ہیں۔
messages = [
{
"role": "user",
"content": "What is your returns policy?"
},
{
"role": "assistant",
"content": "Items can be returned within 30 days."
},
{
"role": "user",
"content": "How long do I have?"
},
]
response = client.messages.create(
model=MODEL,
max_tokens=300,
messages=messages,
)
ثانوی پیغام کلاڈ کے پچھلے جوابات کو ریکارڈ کرتا ہے تاکہ آخری سوال کی سیاق و سباق میں تشریح کی جا سکے۔
ایک سادہ چیٹ کی خصوصیت آپ کو چیزوں پر نظر رکھنے میں مدد کرتی ہے۔
def chat(history, user_text):
history.append({
"role": "user",
"content": user_text,
})
response = client.messages.create(
model=MODEL,
max_tokens=500,
messages=history,
)
reply = "".join(
block.text
for block in response.content
if block.type == "text"
)
history.append({
"role": "assistant",
"content": reply,
})
return reply
history = []
print(chat(history, "What is your returns policy?"))
print(chat(history, "How long do I have?"))
ہر کال صارف کا ایک نیا پیغام شامل کرتی ہے، پوری تاریخ کو منتقل کرتی ہے، اور اگلی باری کے لیے کلاڈ کے جواب کو محفوظ کرتی ہے۔ پیداوار میں، ہم گاہک یا سیشن ID کے ذریعے ریکارڈ محفوظ کرتے ہیں۔
اپنے بڑھتے ہوئے ریکارڈز کا انتظام کیسے کریں۔
لامحدود ریکارڈنگ ان پٹ سائز کو بڑھا سکتی ہے اور کلاڈ کے لیے توجہ مرکوز کرنا مزید مشکل بنا سکتی ہے۔ ایک آپشن صرف حالیہ پیغامات کو رکھنا ہے۔
def trim_history(history, max_messages=10):
trimmed = history[-max_messages:]
while trimmed and trimmed[0]["role"] != "user":
trimmed.pop(0)
return trimmed
ایک اور آپشن یہ ہے کہ حالیہ پیغامات کو برقرار رکھتے ہوئے پچھلے موڑ کا خلاصہ کیا جائے۔
def summarise_history(history, keep_last=6):
old = history[:-keep_last]
recent = history[-keep_last:]
transcript = "\n".join(
f"{message['role']}: {message['content']}"
for message in old
)
response = client.messages.create(
model=MODEL,
max_tokens=250,
messages=[{
"role": "user",
"content": (
"Summarise this conversation in under 100 words. "
"Keep order numbers and unresolved issues.\n\n"
f"{transcript} "
),
}],
)
summary = "".join(
block.text
for block in response.content
if block.type == "text"
)
return summary, recent
خلاصہ ایک الگ درخواست میں رکھیں اور اسے اگلی درخواست میں سیاق و سباق کے طور پر شامل کریں۔ اسے پہلے صارف کے اضافی پیغام کے طور پر داخل نہ کریں۔ recentاس کی وجہ یہ ہے کہ یہ مسلسل غلط صارف کے پیغامات تیار کر سکتا ہے۔
محفوظ کرنے یا منتقل کرنے سے پہلے حساس معلومات کو بھی درست کرنا ضروری ہے۔
import re
def redact(text):
return re.sub(
r"\b(?:\d[ -]?){13,16}\b",
"[REDACTED CARD]",
text,
)
واضح حدود کے ساتھ اشارے کی تشکیل کیسے کریں۔
XML طرز کے ٹیگز سادہ متن ہیں، خاص API کمانڈز نہیں۔ پرامپٹ کے ہر حصے کو واضح کریں۔
prompt = """
The product is comfortable, but the available colours are limited.
Customers also describe it as durable.
January: 120 units
February: 150 units
March: 98 units
Compare the reviews with the sales data.
Identify possible relationships and state uncertainty.
"""
یہاں، حوالہ جات کی شناخت؛ ڈیٹا کی شناخت، کمانڈ کی شناخت کرتا ہے۔ پالیسیوں، صارف کے تیار کردہ مواد، مثالوں، اور آؤٹ پٹ کی ضروریات کے لیے ملتے جلتے حدود کا استعمال کریں۔
سسٹم پرامپٹ کا استعمال کیسے کریں۔
سسٹم پرامپٹس ShopHelper کے عمومی رویے کی وضاحت کرتے ہیں۔
system_prompt = """
You are ShopHelper, a friendly customer-support assistant.
Keep answers concise and clear.
Do not invent prices, policies, or order details.
If information is missing, ask for it.
"""
اسے گفتگو سے الگ کر دیں۔
response = client.messages.create(
model=MODEL,
max_tokens=500,
system=system_prompt,
messages=[
{"role": "user", "content": "Where is my order?"}
],
)
چونکہ گاہک نے آرڈر نمبر فراہم نہیں کیا، اس لیے ShopHelper کو اندازہ لگانے کے بجائے آرڈر نمبر کی درخواست کرنی چاہیے۔
کلاڈ ڈیٹا بیس تک براہ راست رسائی حاصل نہیں کرسکتا۔ ٹولز آپ کی درخواست سے معلومات کی درخواست کرنے کا ایک منظم طریقہ فراہم کرتے ہیں۔
def get_order_status(order_id):
orders = {
"ORD-1001": "shipped",
"ORD-1002": "processing",
}
return {
"order_id": order_id,
"status": orders.get(order_id, "not_found"),
}
یہ فنکشن آرڈر آئی ڈی لیتا ہے، اسے دیکھتا ہے، اور قابل پیشن گوئی ڈیٹا واپس کرتا ہے۔ پیداوار میں، لغات کو ڈیٹا بیس کے سوالات سے بدل دیا جاتا ہے۔ کلاڈ فنکشن نہیں چلاتا۔ آپ کی درخواست ہاں کہتی ہے۔
اسکیموں کا استعمال کرتے ہوئے افعال کی وضاحت کریں۔
tools = [{
"name": "get_order_status",
"description": "Get the current status of a customer order.",
"input_schema": {
"type": "object",
"properties": {
"order_id": {
"type": "string",
"description": "An order ID such as ORD-1001."
}
},
"required": ["order_id"],
},
}]
کلاڈ واپس آ سکتا ہے: tool_use حتمی جواب کے بجائے بلاک کریں:
type="tool_use"
id="toolu_example"
name="get_order_status"
input={"order_id": "ORD-1001"}
کہ name خصوصیات کی شناخت؛ input دلائل پر مشتمل ہے اور id نتائج واپس کرتے وقت درکار ہے۔ کوئی راستہ نہیں stop_reason کی "tool_use" اس کا مطلب ہے کہ Claude کو جاری رکھنے کے لیے کہنے سے پہلے آپ کی درخواست کو درخواست پر کارروائی کرنی چاہیے۔
ٹول کے استعمال کا جواب وہ ہے جس میں شامل ہیں: tool_use یہ اوپر بیان کردہ بلاک ہے۔
چلانے سے پہلے ٹول کا نام، دلائل اور صارف کی اجازت چیک کریں۔
import re
ORDER_ID_PATTERN = re.compile(r"^ORD-\d{4}$")
def validate_tool_request(name, tool_input, current_user):
if name != "get_order_status":
return False, "Unknown tool"
order_id = tool_input.get("order_id")
if not isinstance(order_id, str):
return False, "order_id must be a string"
if not ORDER_ID_PATTERN.fullmatch(order_id):
return False, "Invalid order ID format"
if order_id not in current_user["order_ids"]:
return False, "The customer cannot access this order"
return True, None
ایک مکمل لوپ پھر درخواست کی توثیق اور عمل کر سکتا ہے۔
def run_conversation(user_text, current_user):
messages = [{"role": "user", "content": user_text}]
while True:
response = client.messages.create(
model=MODEL,
max_tokens=500,
system=system_prompt,
tools=tools,
messages=messages,
)
if response.stop_reason != "tool_use":
return "".join(
block.text
for block in response.content
if block.type == "text"
)
messages.append({
"role": "assistant",
"content": response.content,
})
results = []
for block in response.content:
if block.type != "tool_use":
continue
valid, error = validate_tool_request(
block.name,
block.input,
current_user,
)
if valid:
result = get_order_status(block.input["order_id"])
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": str(result),
})
else:
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": error,
"is_error": True,
})
messages.append({
"role": "user",
"content": results,
})
کہ tool_use_id نتیجہ کو اصل درخواست کے ساتھ جوڑتا ہے۔ درخواست تصدیق اور عمل درآمد کے لیے ذمہ دار ہے۔
کلاڈ کے جواب میں متعدد بلاکس ہوسکتے ہیں۔
یہ مفروضہ نازک ہے۔
answer = response.content[0].text
فرض کریں کہ پہلا بلاک موجود ہے اور متن ہے۔ اس کے بجائے، ہر بلاک کا معائنہ کریں۔
for block in response.content:
if block.type == "text":
print(block.text)
elif block.type == "tool_use":
print("Validate and execute:", block.name)
elif block.type == "thinking":
continue
else:
print("Unhandled block type:", block.type)
ShopHelper متن دکھاتا ہے، منظور شدہ ٹول کی درخواستوں کی توثیق کرتا ہے اور اس پر عمل درآمد کرتا ہے، اندرونی واقعات کو دباتا ہے، اور بلاک کی نامعلوم اقسام کو لاگ کرتا ہے۔
ورک فلو اور ایجنٹ
ورک فلو پہلے سے طے شدہ ترتیب کی پیروی کرتا ہے۔
Receive ticket
↓
Extract details
↓
Draft reply
↓
Review reply
def ask(prompt, max_tokens=500):
response = client.messages.create(
model=MODEL,
max_tokens=max_tokens,
messages=[{"role": "user", "content": prompt}],
)
return "".join(
block.text
for block in response.content
if block.type == "text"
)
def handle_ticket_workflow(ticket):
details = ask(
f"{ticket} \n"
"Extract the problem and desired outcome. "
)
draft = ask(
f"{details}\n"
"Draft a concise support reply. "
)
review = ask(
f"{draft} \n"
"List unsupported promises, or say OK. "
)
return draft, review
ایجنٹ زیادہ لچکدار ہوتے ہیں۔ کلاڈ فیصلہ کرتا ہے کہ ٹول استعمال کرنا ہے یا نہیں اور آگے کیا کرنا ہے۔ ایجنٹوں کو اب بھی توثیق اور زیادہ سے زیادہ مراحل کی ضرورت ہوتی ہے۔ کہ run_conversation() مندرجہ بالا فنکشن ایجنٹ لوپ کے اندر دوبارہ استعمال کیا جا سکتا ہے.
جب اقدامات معلوم ہوں اور اعادہ ضروری ہو تو ورک فلو استعمال کریں۔ جب آپ کی اگلی کارروائی موجودہ نتائج پر منحصر ہو تو ایجنٹ کا استعمال کریں۔
کنیکٹیویٹی، متوازی، روٹنگ، اور evaluator-optimizer
چین کے جوتے ہر نتیجہ کو اگلے مرحلے پر منتقل کریں۔
def chained_reply(ticket, policy):
draft = ask(
f"{ticket} \n"
"Draft a support reply. "
)
issues = ask(
f"{policy} \n"
f"{draft} \n"
"List unsupported claims. "
)
return ask(
f"{draft} \n"
f"{issues} \n"
"Rewrite the final reply. "
)
متوازی بیک وقت آزادانہ کام چلائیں۔
from concurrent.futures import ThreadPoolExecutor
tickets = [
"My headphones arrived broken.",
"I was charged twice.",
"How do I change my address?",
]
def summarise(ticket):
return ask(
f"{ticket} \n"
"Summarise in one sentence. ",
max_tokens=100,
)
with ThreadPoolExecutor(max_workers=3) as pool:
summaries = list(pool.map(summarise, tickets))
digest = ask(
"\n"
+ "\n".join(summaries)
+ "\n \n"
"Summarise today's support themes. "
)
روٹنگ خصوصی ورک فلو کو منتخب کرنے سے پہلے درخواستوں کی درجہ بندی کریں۔
def route(ticket):
label = ask(
f"{ticket} \n"
"Return exactly refund, delivery, or general. ",
max_tokens=10,
).strip().lower()
return label if label in {"refund", "delivery", "general"} else "general"
تشخیص کنندہ – اصلاح کنندہ جوابات بنائیں، ان کا جائزہ لیں اور ان میں ترمیم کریں۔
def improve_reply(ticket, rounds=2):
reply = ask(
f"{ticket} \n"
"Write a support reply. "
)
for _ in range(rounds):
review = ask(
f"{reply} \n"
"List accuracy or tone problems, or say PASS. "
)
if review.strip().upper() == "PASS":
break
reply = ask(
f"{reply} \n"
f"{review} \n"
"Rewrite the reply. "
)
return reply
اگر اضافی معیار اضافی API کالوں کا جواز پیش کرتا ہے تو، منحصر اقدامات کے لیے چیننگ، آزاد کاموں کے لیے متوازی، خصوصی راستوں پر روٹنگ، اور ایویلیویٹر-آپٹیمائزیشن لوپس کا استعمال کریں۔
معیار کا فوری اندازہ کیسے لگایا جائے۔
نمائندہ ٹیسٹ کیسز استعمال کریں۔
test_cases = [
{
"ticket": "I want a refund for broken headphones.",
"expected": "refund",
},
{
"ticket": "Where is ORD-1002?",
"expected": "delivery",
},
{
"ticket": "Do you sell gift cards?",
"expected": "general",
},
]
ان معاملات میں درخواست کی مختلف اقسام شامل ہیں۔ سسٹم پرامپٹ، مثال، ماڈل، ٹوکن کی حد، یا روٹنگ کی ہدایات کو تبدیل کرنے کے بعد اسی کیس کو چلائیں۔
def evaluate(route_fn, cases):
passed = 0
for case in cases:
result = route_fn(case["ticket"])
if result == case["expected"]:
passed += 1
else:
print("Failed:", case["ticket"], result)
score = passed / len(cases)
print(f"{passed}/{len(cases)} passed")
return score
لیبلز اور JSON کے لیے کوڈ پر مبنی گریڈرز استعمال کریں۔ لہجے، درستگی اور استعمال کے لیے انسانی یا ماڈل پر مبنی ریٹرز استعمال کریں۔
نتیجہ
Claude API کے ساتھ تعمیر کرنے کے لیے تحریری اشارے سے زیادہ کی ضرورت ہوتی ہے۔ قابل بھروسہ ایپلی کیشنز کو منظم سیاق و سباق، منظم گفتگو کی حالت، ثابت شدہ ٹول ایگزیکیوشن، محتاط ردعمل سے نمٹنے، مناسب ورک فلو، اور دوبارہ قابل تشخیص کی ضرورت ہوتی ہے۔
مقصد ایک کامل اشارہ تلاش کرنا نہیں ہے۔ یہ Claude کے ارد گرد ایک ایسے نظام کی تعمیر کے بارے میں ہے جو صحیح سیاق و سباق فراہم کرتا ہے، غیر محفوظ رویے کو محدود کرتا ہے، غیر یقینی صورتحال کو سنبھالتا ہے، اور یہ اقدامات کرتا ہے کہ آیا تبدیلیاں نتائج کو بہتر بناتی ہیں۔