إنشاء أول سلسلة (Chain) باستخدام LangChain لتمرير البيانات تلقائياً

دقائق القراءة: 6

ما هي السلسلة Chain في LangChain؟

عند بناء تطبيقات تعتمد على LLM، نادراً ما تكون العملية مجرد إرسال نص ثابت واستلام جواب. في الواقع، المسار الهندسي الحقيقي يتضمن استقبال مدخلات، إعادة تشكيلها، تمريرها إلى نموذج، ثم معالجة المخرجات وإرسالها إلى خطوة أخرى. هنا تظهر فكرة Chain داخل LangChain: ربط عدة مكونات في خط معالجة واحد بحيث تنتقل البيانات تلقائياً من مرحلة إلى أخرى.

إذا كنت قد قرأت مدخل إلى هندسة الذكاء الاصطناعي التوليدي: كيف تعمل نماذج اللغة الكبيرة (LLMs) برمجياً؟ فستفهم أن التطبيق التوليدي يتكون من طبقات: مدخلات، تعليمات، نموذج، ومخرجات. أما LangChain فيضيف طبقة تنظيم تسمح ببناء تدفق بيانات واضح وقابل للصيانة.

السلسلة ليست مجرد مفهوم نظري، بل هي نمط معماري يحقق فوائد عملية:

  • تقليل التكرار في كتابة أوامر استدعاء النماذج.
  • إعادة استخدام القوالب البرمجية بسهولة.
  • فصل المسؤوليات بين Prompt وModel وParser.
  • تسهيل التوسعة لاحقاً نحو RAG أو الأدوات Tools أو الذاكرة Memory.

البنية الهندسية لأول سلسلة تمرير بيانات

أبسط سلسلة في LangChain تتكون من ثلاث طبقات مترابطة:

  • PromptTemplate: مسؤول عن بناء النص الذي سيرسَل للنموذج بشكل ديناميكي.
  • ChatModel: مثل ChatOpenAI، وهو محرك التوليد نفسه.
  • Output Parser: يحول المخرجات الخام إلى نص أو بنية قابلة للاستخدام.

الجميل هنا أن كل طبقة تستقبل ناتج الطبقة السابقة تلقائياً عند استخدام عامل الربط |. هذا يعني أنك تبني ما يشبه خط أنابيب Pipeline للبيانات.

كيف تتدفق البيانات داخلياً؟

عندما تستدعي السلسلة، يحصل التسلسل التالي:

  1. إدخال متغيرات مثل عنوان موضوع أو نوع جمهور.
  2. حقن هذه المتغيرات داخل PromptTemplate.
  3. إرسال النص النهائي إلى النموذج.
  4. استقبال الاستجابة على شكل كائن رسائل أو نص خام.
  5. تمريرها إلى StrOutputParser لتحويلها إلى نص بسيط.

هذا الأسلوب أكثر نظافة من كتابة استدعاءات متفرقة يدوياً، وأقرب إلى تفكير مهندس أنظمة يبني تطبيقاً قابلاً للتمدد.

المتطلبات قبل كتابة الكود

قبل تنفيذ أول سلسلة، تأكد أنك أنهيت خطوات إعداد بيئة العمل الذكية: تثبيت مكتبات Python الأساسية للتعامل مع الذكاء الاصطناعي، وكذلك الاتصال الأول: جلب مفاتيح API (Gemini / OpenAI) وكتابة أول سكربت اتصال. ستحتاج عادة إلى تثبيت الحزم الأساسية وربط مفتاح API في متغيرات البيئة.

pip install langchain langchain-openai python-dotenv
import os
from dotenv import load_dotenv

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")

if not api_key:
    raise ValueError("OPENAI_API_KEY is missing.")

إنشاء أول سلسلة عملية باستخدام LangChain

في هذا المثال سنبني سلسلة بسيطة تستقبل اسم تقنية، ثم تطلب من النموذج شرحها هندسياً في نقاط مختصرة. سنستخدم قالباً ديناميكياً شبيهاً بما شرحناه في هندسة الأوامر (Prompt Engineering) داخل الكود: قوالب النصوص المتغيرة (F-Strings)، لكن داخل بيئة LangChain.

اشرح مفهوم {topic} لمطور مبتدئ في 3 نقاط تقنية واضحة، مع ذكر استخدام عملي واحد.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template(
    "Explain the concept of {topic} to a junior developer in 3 technical bullet points and include one practical use case."
)

model = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.3
)

parser = StrOutputParser()

chain = prompt | model | parser

response = chain.invoke({"topic": "vector embeddings"})
print(response)

لاحظ هنا أن البيانات بدأت من القاموس {"topic": "vector embeddings"}، ثم انتقلت تلقائياً عبر القالب، وبعدها إلى النموذج، وأخيراً إلى محلل المخرجات. هذه هي الفكرة الجوهرية التي تجعل Chains مهمة في التطبيقات الإنتاجية.

فهم كل مكون في السلسلة بشكل هندسي

1) القالب PromptTemplate

هذا المكون يعزل منطق بناء الأوامر عن بقية التطبيق. بدلاً من لصق النصوص داخل الاستدعاء البرمجي، يتم تعريف قالب منظم بمتغيرات معلومة. النتيجة: قابلية أعلى للاختبار، وسهولة تعديل التعليمات لاحقاً دون المساس بمنطق التنفيذ.

2) النموذج ChatOpenAI

هذا هو المحرك الذي يطبق الاستدلال Inference. ويمكنك ضبط سلوكه من خلال معاملات مثل temperature. وإذا أردت فهماً أعمق لهذه الجزئية، راجع التحكم في إبداع الذكاء الاصطناعي: فهم وإعداد معاملات Temperature و Top-K برمجياً.

3) محلل المخرجات Output Parser

في البداية قد يبدو غير ضروري، لكن وجوده مهم جداً عند الانتقال إلى مخرجات منظمة. اليوم نستخدم StrOutputParser فقط لاستخراج النص، وغداً يمكنك استبداله بمحلل يفرض بنية JSON كما في استخراج بيانات مهيكلة (Output Parsers): إجبار الذكاء الاصطناعي على الرد بصيغة JSON فقط.

مثال متقدم: تمرير مخرجات خطوة إلى خطوة أخرى

القوة الحقيقية تبدأ عندما تستخدم ناتج خطوة كمدخل لخطوة لاحقة. مثلاً: تلخيص فكرة، ثم تحويلها إلى وصف تسويقي، ثم إخراجها في صيغة منظمة. هذا النمط قريب جداً من تصميم الأنظمة متعددة المراحل.

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

model = ChatOpenAI(model="gpt-4o-mini", temperature=0.4)
parser = StrOutputParser()

summary_prompt = ChatPromptTemplate.from_template(
    "Summarize the following idea in 2 concise technical sentences: {idea}"
)

marketing_prompt = ChatPromptTemplate.from_template(
    "Turn this technical summary into a short product description: {summary}"
)

summary_chain = summary_prompt | model | parser
marketing_chain = marketing_prompt | model | parser

summary_result = summary_chain.invoke({
    "idea": "A retrieval system that uses embeddings to search private company documents and help support teams answer customer questions faster."
})

final_result = marketing_chain.invoke({
    "summary": summary_result
})

print(final_result)

صحيح أن المثال السابق استخدم سلسلتين منفصلتين، لكنه يوضح الفكرة الأساسية: المخرجات تتحول إلى مدخلات جديدة. وعند التوسع لاحقاً، يمكن تحويل هذا النمط إلى سير عمل أعقد يشمل حساب التكلفة وإدارة الرموز (Tokens): سكربت لمعرفة حجم استهلاك الـ API قبل الإرسال أو البث المباشر للردود (Streaming Responses): كيف تجعل الكلمات تظهر تباعاً مثل ChatGPT؟.

أفضل الممارسات عند بناء Chains

  • افصل تعريف القوالب عن منطق الاستدعاء حتى يسهل اختبارها.
  • اجعل أسماء المتغيرات واضحة مثل topic وsummary وcontext.
  • ابدأ بـ StrOutputParser ثم انتقل لاحقاً إلى مخرجات منظمة.
  • اضبط معاملات التوليد لتقليل العشوائية في المهام التقنية.
  • راقب طول المدخلات لأن زيادة Tokens تؤثر في التكلفة والكمون Latency.

كيف تمهّد هذه السلسلة للانتقال إلى RAG وEmbeddings؟

بمجرد فهمك لمسار تمرير البيانات، يصبح من السهل توسيع السلسلة نحو معماريات أكثر تقدماً. في أنظمة RAG، ستضيف مرحلة استرجاع بيانات من Vector DB اعتماداً على Embeddings، ثم تمرير النتائج إلى النموذج ضمن Context. هنا تتحول السلسلة من مجرد خط بسيط إلى معمارية إنتاجية كاملة.

ولهذا فإن إتقان أول Chain ليس تمريناً تعليمياً فقط، بل أساس ذهني وبرمجي لكل ما ستبنيه لاحقاً فوق مقدمة في إطار عمل LangChain: ثورة ربط وتطوير تطبيقات الذكاء الاصطناعي.

خلاصة هندسية

إنشاء أول سلسلة باستخدام LangChain يعني عملياً الانتقال من استدعاء يدوي بسيط إلى تصميم تدفق بيانات منظم. هذه النقلة مهمة لأنها تجعل التطبيق أكثر وضوحاً، وأسهل في الصيانة، وأفضل في التوسع. عندما تفكر في كل مكون كسلسلة معالجة مستقلة ثم تربطه بغيره، فأنت تطبق مبادئ هندسة برمجيات حقيقية داخل عالم الذكاء الاصطناعي التوليدي.

ابدأ بسلسلة صغيرة: قالب، نموذج، محلل. بعد ذلك ستجد أن إضافة الاسترجاع، الذاكرة، الأدوات، أو حتى Fine-tuning كطبقات داعمة تصبح أكثر منطقية وانسيابية على المستوى المعماري.

22 comments

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *