ٹول کالز اور میموری کا استعمال کرتے ہوئے اپنا مقامی AI ایجنٹ کیسے بنائیں

اس ٹیوٹوریل میں، میں آپ کو دکھاؤں گا کہ LangChain v1، Ollama، Qwen، اور Python کا استعمال کرتے ہوئے ٹول انوکیشن اور قلیل مدتی میموری کے ساتھ مقامی AI ایجنٹ کیسے بنایا جائے۔

ایجنٹ خود فیصلہ کر سکتے ہیں کہ کب کسی ٹول کو کال کرنا ہے اور فطری طور پر فالو اپ سوالات پوچھنے کے لیے گفتگو کو یاد رکھنا ہے۔ رازداری کے لیے سب کچھ آپ کے اپنے کمپیوٹر پر چلتا ہے اور کوئی API لاگت نہیں ہے۔

انڈیکس

پس منظر

ایک مقامی ایل ایل ایم اپنے طور پر بیرونی دنیا تک رسائی حاصل نہیں کر سکتا۔ جب آپ لوگوں سے پوچھتے ہیں کہ یہ کیا وقت ہے یا ایک جملے میں کتنے الفاظ ہیں، تو وہ اکثر اندازہ لگاتے ہیں یا ‘نہیں’ کہتے ہیں جب تک کہ آپ انہیں جواب تلاش کرنے کا طریقہ نہ بتائیں۔ ماڈل میں صرف وہی ہے جو آپ کے تربیتی ڈیٹا میں ہے اور جو آپ نے پرامپٹ میں درج کیا ہے۔

دوسرا، ماڈل کوئی میموری نہیں ہے. جب آپ انہیں نیا پیغام بھیجتے ہیں تو وہ سب کچھ بھول جاتے ہیں۔ آپ سوالات پوچھتے ہیں، جوابات حاصل کرتے ہیں، اور فالو اپس کے لیے پوچھتے ہیں، اور ماڈل کو کچھ معلوم نہیں کہ آپ کس کے بارے میں بات کر رہے ہیں۔ ہر موڑ 0 سے شروع ہوتا ہے۔

کلاؤڈ ہوسٹنگ ماڈل جیسے کلاڈ اور چیٹ جی پی ٹی پہلے ہی ان خصوصیات کو سپورٹ کرتے ہیں۔ تاہم، مقامی ایل ایل ایم کے ساتھ ایسا نہیں ہے۔ اس ٹیوٹوریل میں، میں آپ کو دکھاؤں گا کہ ایک مقامی AI ایجنٹ کیسے بنایا جائے جو دو مسائل کو حل کرے۔ یہ ضرورت پڑنے پر ازگر کے فنکشنز کو اپنے طور پر کال کرتا ہے اور گفتگو کو یاد رکھتا ہے، اس لیے فالو اپ سوالات صحیح طریقے سے کام کرتے ہیں۔ یہ رازداری کی وجہ سے مکمل طور پر آپ کے مقامی کمپیوٹر پر چلتا ہے اور اس کی کوئی API لاگت نہیں ہے۔

جاری رکھنے کے لیے آپ کو اپنے کمپیوٹر پر اولاما انسٹال کرنا چاہیے۔ یہ مثال macOS، Windows اور Linux پر کام کرتی ہے۔ میں 32 جی بی ریم کے ساتھ میک بک پرو استعمال کر رہا ہوں، لیکن اگر آپ اولاما سے چھوٹا Qwen ماڈل اٹھاتے ہیں، تو آپ اسے کم میموری سسٹم پر بھی چلا سکتے ہیں۔

ٹول کال ایک ایسا نمونہ ہے جس میں ایل ایل ایم طے کرتا ہے کہ ازگر کے فنکشن کو وقت سے پہلے کال کرنے کی بجائے ازگر کے فنکشن کو کب انجام دینا ہے۔ ایک ٹول صرف ایک Python فنکشن ہے جسے آپ کا ماڈل کال کر سکتا ہے۔ ماڈل اس بات کا تعین کرتا ہے کہ کب کال کرنی ہے اور کن دلائل کو پاس کرنا ہے۔ اس بات کا تعین کریں کہ ٹول اصل میں کیا کرتا ہے۔

اندرونی طور پر، ماڈلز براہ راست کوڈ پر عمل نہیں کرتے ہیں۔ یہ دراصل ایک منظم درخواست کو خارج کرتا ہے جس میں کہا گیا ہے کہ "ان دلائل کے ساتھ اس ٹول کو کال کریں۔” جب آپ کا کوڈ کسی فنکشن کو انجام دیتا ہے اور نتائج کو واپس ماڈل کو بھیجتا ہے، تو ماڈل فیصلہ کرتا ہے کہ آگے کیا کرنا ہے: کسی دوسرے ٹول کو کال کریں یا حتمی جواب تیار کریں۔

تمام ماڈلز ٹول کی درخواست کو اچھی طرح سے سپورٹ نہیں کرتے ہیں۔ کیوین کو یہاں استعمال کیا گیا ہے کیونکہ یہ مقامی ٹول کی درخواست کے تجربات کے لیے ایک طاقتور اوپن ویٹنگ آپشن ہے۔

LangChain v1 create_agent ٹول کالز کو ہینڈل کرتا ہے۔ آپ اسے ایک ماڈل، ٹولز کی فہرست، اور سسٹم پرامپٹس دیتے ہیں، اور یہ ماڈل مکمل ہونے تک کال اور رسپانس سائیکل کو ہینڈل کرتا ہے۔

ایل ایل ایم میں میموری کیا ہے؟

ایل ایل ایم بے وطن ہے۔ ہر کال پوری گفتگو کو بطور ان پٹ بھیجتی ہے اور ماڈل صرف اس ان پٹ کی بنیاد پر جواب دیتا ہے۔ ایجنٹ کی "میموری” صرف وہ پیٹرن ہے جسے وہ اگلی کال پر ماڈل کو واپس بھیجنے کے لیے منتخب کرتا ہے۔

اصل میں دو اہم اقسام ہیں:

  1. شارٹ ٹرم میموری موجودہ گفتگو کا ریکارڈ ہے۔ اگلی کال پر دوبارہ بھیجنا وہی ہے جو متعدد بات چیت کو مستقل محسوس کرتا ہے۔ سیشن ختم ہونے پر یہ غائب ہو جاتا ہے۔

  2. طویل مدتی میموری حقائق اور ماضی کے تبادلے ہیں جو آپ تمام سیشنوں میں بتانا چاہتے ہیں۔ یہ ڈیٹا بیس یا ویکٹر اسٹور میں رہتا ہے اور متعلقہ ہونے پر لوڈ کیا جاتا ہے۔

اس ٹیوٹوریل میں ہم شارٹ ٹرم میموری استعمال کریں گے۔ یہ سب سے آسان اور مفید ترین شکل ہے اور ایجنٹ کو ایسی چیز میں بدل دیتی ہے جو حقیقی گفتگو کر سکے۔

LangChain v1 چیک پوائنٹرز کے ذریعے قلیل مدتی میموری کو سپورٹ کرتا ہے، ایک ایسی ریاست جو تھریڈ ID کی بنیاد پر کال() کالوں کے درمیان بات چیت کی تاریخ محفوظ کرتی ہے۔ ہم مختصر مدتی میموری کے لیے بلٹ ان InMemorySaver استعمال کریں گے۔

حوصلہ افزائی اور فن تعمیر

اس پروجیکٹ کے پیچھے محرک مقامی LLM کا استعمال کرنا ہے تاکہ AI ایجنٹوں کو Claude یا ChatGPT سے ملتے جلتے بنانے کے لیے ایک قدم آگے بڑھایا جا سکے۔ یہ مزید خصوصیات فراہم کرکے مقامی LLM کی افادیت کو بھی بڑھاتا ہے۔

یہ پروجیکٹ اولاما کو مقامی Qwen چیٹ ماڈل چلانے کے لیے استعمال کرتا ہے، ہر چیز کو جوڑنے کے لیے LangChain v1، اور بلٹ ان InMemorySaver قلیل مدتی میموری کے لیے ٹیسٹ پوائنٹر۔

جب صارف پیغام بھیجتا ہے، چیک پوائنٹر موجودہ تھریڈ آئی ڈی کے لیے پچھلی گفتگو کو لوڈ کرتا ہے اور اسے پہلے سے جوڑتا ہے۔ ماڈل ایک جواب پیدا کرتا ہے یا ٹول کال کا اخراج کرتا ہے۔ ٹول کالز ایک معیاری کال اور رسپانس سائیکل کے ذریعے کی جاتی ہیں۔ ایک موڑ کے اختتام پر، چیک پوائنٹر ایک نیا پیغام واپس دھاگے میں محفوظ کرتا ہے، اس لیے اگلی باری کا پورا سیاق و سباق ہوگا۔

مرحلہ 1: اولاما انسٹال کریں اور ماڈلز درآمد کریں۔

شروع کرنے کے لیے، اپنے پلیٹ فارم کے لیے Ollama ایپلیکیشن انسٹال کریں۔

ہم qwen3.5:4b بطور ماڈل استعمال کریں گے۔ یہ مقامی طور پر ٹول کالز کی حمایت کرتا ہے۔ میں اسے چیٹ ماڈل کے طور پر استعمال کر رہا ہوں۔ اگر آپ کے کمپیوٹر میں کم ریم ہے، تو آپ اس کی بجائے qwen3.5:0.8b استعمال کر سکتے ہیں۔

ollama pull qwen3.5:4b

مرحلہ 2: ازگر پر انحصار انسٹال کریں۔

python3 -m venv venv
source venv/bin/activate 

pip install langchain langchain-core langchain-ollama langgraph

اس ٹیوٹوریل میں langchain>=1.0.0.

مرحلہ 3: ایجنٹ پائتھن کوڈ

کوڈ تین چیزیں کرتا ہے:

سب سے اوپر کی ترتیب مقامی اولاما ماڈل اور سسٹم پرامپٹس کی وضاحت کرتی ہے۔

ٹولز سیکشن LangChain کے ٹولز کا استعمال کرتے ہوئے دو ٹولز کی وضاحت کرتا ہے۔ @tool ڈیکوریٹر۔ current_time() موجودہ مقامی تاریخ اور وقت لوٹاتا ہے، word_count(text) متن میں الفاظ کی تعداد لوٹاتا ہے۔ ہر ٹول کے لیے docstring وہی ہوتا ہے جو ماڈل یہ فیصلہ کرتے وقت دیکھتا ہے کہ اسے کال کرنا ہے یا نہیں، اس لیے اس کی پیشکش اہم ہے۔

کہ main() فنکشن ایجنٹ کو استعمال کرتے ہوئے بناتا ہے: create_agent()تار InMemorySaver قلیل مدتی میموری کے لیے چیک پوائنٹرز استعمال کریں اور انٹرایکٹو لوپس چلائیں۔ ہر موڑ پر، صارف کا پیغام ایک مقررہ تھریڈ آئی ڈی کے ساتھ ایجنٹ کو بھیجا جاتا ہے تاکہ چیک پوائنٹ کو معلوم ہو کہ کون سی بات چیت کو لوڈ اور اسٹور کرنا ہے۔

کوڈ agent.py فائل

from datetime import datetime

from langchain.agents import create_agent
from langchain_core.tools import tool
from langchain_ollama import ChatOllama
from langgraph.checkpoint.memory import InMemorySaver

CHAT_MODEL = "qwen3.5:4b"   # Ollama chat model. Must support tool calling.

SYSTEM_PROMPT = (
    "You are a helpful assistant with access to tools for getting the current time and counting words in text. "
    "Use tools when the user's request needs one. "
    "If the question doesn't need a tool, answer directly. "
    "If a tool returns an error, explain the error plainly."
)

# ----- Tools -----
@tool
def current_time() -> str:
    """Return the current local date and time.
    Use this when the user asks what time or date it is.
    """
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

@tool
def word_count(text: str) -> int:
    """Count the number of words in a piece of text.
    Use this when the user asks how long a piece of writing is,
    or asks you to count the words in something they've shared.
    Returns the word count as an integer.
    """
    return len(text.split())


TOOLS = [current_time, word_count]


# ----- Agent -----

def build_agent():
    model = ChatOllama(model=CHAT_MODEL, temperature=0)

    # InMemorySaver keeps conversation history in memory, keyed by thread ID.
    # When the process exits, the history is gone because of short-term memory.
    checkpointer = InMemorySaver()

    return create_agent(
        model=model,
        tools=TOOLS,
        system_prompt=SYSTEM_PROMPT,
        checkpointer=checkpointer,
    )


def main():
    agent = build_agent()

    # The thread ID tells the checkpointer which conversation to load and save.
    config = {"configurable": {"thread_id": "thread"}}

    print("Ready! Ask the agent something. It remembers the conversation.\n")

    # Track how many messages existed before this turn, so we can slice out
    # only the new ones (tool calls + final answer) from the returned state.
    prev_message_count = 0

    while True:
        question = input("You: ").strip()
        if not question or question.lower() == "exit":
            break

        result = agent.invoke(
            {"messages": [{"role": "user", "content": question}]},
            config=config,
        )

        # Only look at messages added during this turn, not the full history.
        new_messages = result["messages"][prev_message_count:]

        # Print any tool calls made in this turn.
        for msg in new_messages:
            tool_calls = getattr(msg, "tool_calls", None)
            if tool_calls:
                for call in tool_calls:
                    print(f"[tool call] {call['name']}({call['args']})")

        print(f"\nAnswer: {result['messages'][-1].content}\n")

        # Update the count for the next turn.
        prev_message_count = len(result["messages"])

مرحلہ 4: ایجنٹ کو چلائیں۔

python agent.py

ایجنٹ ایک انٹرایکٹو لوپ شروع کرتا ہے۔ جب آپ کوئی سوال درج کرتے ہیں، تو یہ یا تو اس کا براہ راست جواب دے گا یا جواب دینے سے پہلے ایک یا زیادہ ٹولز کو کال کرے گا۔ ایجنٹ طے کرتا ہے کہ کون سے سوالات ٹول کال کو متحرک کریں گے۔ کہ [tool call] لائنیں ایجنٹ کے ذریعہ منتخب کردہ ٹول اور دلائل کو دکھاتی ہیں، تاکہ آپ دیکھ سکیں کہ ایجنٹ اصل میں کیا کر رہا ہے۔

جواب پر بھروسہ کرنے سے پہلے اسے فوراً چیک کریں۔ [tool call] یہ لائن اس بات کی تصدیق کرتی ہے کہ ایجنٹ نے صحیح دلائل کے ساتھ صحیح ٹول بلایا ہے۔ مقامی ماڈلز میزبان فرنٹیئر ماڈلز سے چھوٹے ہوتے ہیں اور خاص طور پر ٹول آرگیمنٹس میں زیادہ فریب نظر آتے ہیں۔

آئیے ایجنٹ کو ٹیسٹ رن کے ساتھ چلائیں۔ اوزار اور میموری کے بغیر درج ذیل تین سطروں پر تبصرہ کریں:

return create_agent(
        model=model,
        # tools=TOOLS,
        # system_prompt=SYSTEM_PROMPT,
        # checkpointer=checkpointer,
    )

یہ میرا چیٹ سیشن ہے:

You: hi my name is Darsh

Answer: Hi Darsh! Nice to meet you. How can I help you today?

You: What is my name

Answer: I don't have access to personal information like your name! 

You: what is the current time

Answer: I don't have access to real-time data, so I can't provide the exact current time. 

You: What is the capital of USA

Answer: The capital of the United States is Washington, D.C.

مجھے اپنا نام یاد نہیں۔ آپ کے پاس کسی ٹولز تک بھی رسائی نہیں ہے، لہذا آپ کو وقت کا علم نہیں ہے۔

اب ایجنٹ چلاتے ہیں۔ ٹولز اور میموری کے ساتھ. تبصرہ کی گئی تین لائنوں کو غیر تبصرہ کریں اور ایجنٹ کو چلائیں۔ اب آپ ذیل میں فرق دیکھ سکتے ہیں۔

You: hi my name is Darsh

Answer: Hello Darsh! Nice to meet you. How can I help you today?

You: What is my name

Answer: Your name is Darsh!

You: what is the current time
[tool call] current_time({})

Answer: The current time is 21:30:58 on July 1, 2026.

You: what is the length of my name
[tool call] word_count({'text': 'Darsh'})

Answer: Your name "Darsh" has:
- **1 word** (it's a single word)
- **5 letters** (D-a-r-s-h)

So depending on what you meant by "length," it's either 1 word or 5 letters!

You: What is the capital of USA

Answer: The capital of the USA is Washington, D.C.

ایجنٹ نے 4B مقامی ماڈل کے لیے معقول کارکردگی کا مظاہرہ کیا۔ اسے بلایا گیا تھا current_time وقت کے سوالات کے لیے، word_count میرے نام کے حروف کی تعداد گننے کے لیے۔

ٹول کال کے معیار کو بہتر بنانے کے لیے، آپ درج ذیل کے ساتھ تجربہ کر سکتے ہیں:

  1. ٹول ٹپس: ہر ٹول کے لیے docstrings زیادہ تر کام کرتی ہیں۔ مخصوص، کارروائی پر مبنی ہدایات ایجنٹوں کو صحیح ٹول منتخب کرنے میں مدد کرتی ہیں۔

  2. سسٹم پرامپٹس: اپنے ماڈل کو واضح رہنمائی فراہم کریں کہ ٹولز کا استعمال کب کرنا ہے اور غیر ضروری کالز کو کب کم کرنا ہے۔

طویل مدتی میموری

اس مثال میں شارٹ ٹرم میموری صرف موجودہ گفتگو کے تھریڈ پر لاگو ہوتی ہے۔ ایجنٹوں کو علیحدہ چیٹس سے مواد یاد رکھنے کو یقینی بنانے کے لیے طویل مدتی میموری کی ضرورت ہوتی ہے۔

LangChain v1 میں، طویل مدتی میموری کو پوسٹگریس جیسی میموری اسٹور میں محفوظ کیا جاتا ہے تاکہ اسے مستقبل کی بات چیت میں دوبارہ حاصل کیا جا سکے۔

طویل مدتی میموری کو نافذ کرنے کے لیے، دو طریقوں میں سے ایک استعمال کریں۔ یا تو ماڈل صارف کی معلومات کو ذخیرہ کرنے اور بازیافت کرنے کے لیے ایک ٹول کا استعمال کرتا ہے، یا ایجنٹ نام اور جوابی ترجیحات جیسے حقائق کو خود بخود ذخیرہ کرنے کے لیے مڈل ویئر یا آس پاس کے پائتھون کوڈ کا استعمال کرتا ہے۔

اس ٹیوٹوریل کے لیے مختصر مدت کی میموری مناسب ہے۔ اگر آپ ایک سے زیادہ سیشنوں میں کچھ یاد رکھنا چاہتے ہیں تو طویل مدتی میموری قدرتی اگلا مرحلہ ہے۔ آپ LangChain دستاویزات میں طویل مدتی میموری کے بارے میں مزید پڑھ سکتے ہیں۔

نتیجہ

اس ٹیوٹوریل میں، آپ نے سیکھا کہ LangChain v1 کا استعمال کرتے ہوئے ٹول کالنگ اور قلیل مدتی میموری کے ساتھ مقامی AI ایجنٹ کیسے بنایا جائے۔ create_agent, @tool ڈیکوریٹر، اور InMemorySaver چوکی یہ سب آپ کے اپنے کمپیوٹر پر چلتا ہے، لیپ ٹاپ سے باہر کوئی ڈیٹا نہیں بھیجا جاتا ہے، اور آپ کو مکمل کنٹرول حاصل ہے کہ آپ کے ایجنٹ کن ٹولز تک رسائی حاصل کر سکتے ہیں، بغیر کسی API کے اخراجات۔

یہاں آپ اپنے ٹولز شامل کر سکتے ہیں، جیسے کہ نوٹ لینے کا ٹول، فائلوں کی فہرست بنانا، یا فائلیں پڑھنا۔ ٹول ٹپ کو تبدیل کریں اور دیکھیں کہ ایجنٹ کا رویہ کیسے بدلتا ہے۔ اسے دوسرے ماڈل سے تبدیل کرنے کی کوشش کریں، جیسے کہ qwen3.5:0.8b یا اس سے بڑا Qwen، یہ دیکھنے کے لیے کہ ٹول کالز ماڈل کے سائز کے ساتھ کیسے بدلتی ہیں۔ مبارک ہو ٹنکرنگ!

اگر آپ کو یہ سبق پسند آیا ہے، تو آپ میرے بلاگ پر میری مزید تحریریں (حالیہ پوسٹس میں سسٹمز ڈیزائن پیپرز سیریز شامل ہیں)، میری ذاتی ویب سائٹ پر میرا کام، اور LinkedIn پر اپ ڈیٹس حاصل کر سکتے ہیں۔

اوپر تک سکرول کریں۔