الدرس 5 من 9
الكلام مع LLMs بالكود
إزاي تستخدم موديل زي Claude جوه البرنامج بتاعك.
ليه API؟
الموديلات الكبيرة زي Claude أكبر بكتير من إنها تشتغل على جهازك. بتتكلم معاها عن طريق API: كودك بيبعت رسالة على النت، والموديل يرد. زي ما عملنا مع requests في المرحلة ٢، بس المرة دي عندك مكتبة جاهزة.
التجهيز
pip install anthropic python-dotenv
# Get an API key from the Claude Console (console.anthropic.com)ANTHROPIC_API_KEY=sk-ant-xxxxxxxxxxxxxxxx
⚠ المفتاح ده زي كارت الفيزاأي حد معاه المفتاح يقدر يستخدمه على حسابك. حطه في
.env، وضيف .env لـ .gitignore قبل أول commit، ومتكتبهوش في الكود أبداً. فاكر التحذير ده من درس Git؟ ده وقته.أول رسالة
from dotenv import load_dotenv import anthropic load_dotenv() # loads ANTHROPIC_API_KEY from .env client = anthropic.Anthropic() # picks up the key automatically message = client.messages.create( model="claude-sonnet-5", max_tokens=500, # max length of the reply system="You are a friendly assistant for an Egyptian online store. Reply in Egyptian Arabic.", messages=[ {"role": "user", "content": "عندكم شحن لأسوان؟"}, ], ) print(message.content[0].text) print("tokens:", message.usage.input_tokens, "in /", message.usage.output_tokens, "out")
model اسم الموديل. الموديلات الأكبر أذكى وأغلى، والأصغر أسرع وأرخص.system تعليمات عامة بتحدد دور الموديل وأسلوبه في المحادثة كلها.messages المحادثة نفسها: رسايل user و assistant بالتبادل.max_tokens أقصى طول للرد، ولو الرد وصله بيتقطع.الموديل مالوش ذاكرة
كل request منفصل تماماً. عشان يفتكر اللي اتقال قبل كده، انت اللي بتبعتله المحادثة كلها كل مرة:
from dotenv import load_dotenv import anthropic load_dotenv() client = anthropic.Anthropic() history = [] while True: user_text = input("You: ") if user_text.lower() in ("exit", "quit"): break history.append({"role": "user", "content": user_text}) reply = client.messages.create( model="claude-sonnet-5", max_tokens=800, messages=history, # send the WHOLE conversation every time ) answer = reply.content[0].text history.append({"role": "assistant", "content": answer}) print("Claude:", answer)
💡 التكلفة بتكبر مع المحادثةلأنك بتبعت التاريخ كله كل مرة، المحادثة الطويلة كل رسالة فيها بتتكلف أكتر من اللي قبلها. في التطبيقات الحقيقية بيلخصوا المحادثة القديمة أو يحتفظوا بآخر كام رسالة بس.
الـ Streaming: الرد يظهر وهو بيتكتب
بدل ما اليوزر يستنى الرد كله، بتعرض كل حتة أول ما توصل، زي ما بتشوف في تطبيقات الشات:
from dotenv import load_dotenv import anthropic load_dotenv() client = anthropic.Anthropic() with client.messages.stream( model="claude-sonnet-5", max_tokens=500, messages=[{"role": "user", "content": "اشرحلي الـ embeddings في ٣ جمل"}], ) as stream: for text in stream.text_stream: print(text, end="", flush=True) # print each piece as it arrives print()
🔁 نفس الفكرة مع أي LLMكل مزودين الموديلات الكبيرة ليهم APIs شبه بعض جداً: رسايل فيها role و content، و system prompt، و max_tokens. لو اتعلمت واحد، التاني هياخد منك ساعة.