دليل شامل لبناء أنابيب تحليل النصوص باستخدام LangGraph

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

الميزات الرئيسية لـ LangGraph:

  • إدارة الحالة: الحفاظ على حالة ثابتة عبر التفاعلات.
  • التوجيه المرن: تحديد تدفقات معقدة بين المكونات.
  • الاستمرارية: حفظ سير العمل واستئنافه.
  • التصور: رؤية وفهم بنية وكيلك.

في هذا الدليل، سنوضح LangGraph من خلال بناء أنبوب تحليل نصوص متعدد الخطوات يعالج النص عبر ثلاث مراحل:

مراحل أنبوب تحليل النصوص:

  1. تصنيف النص: تصنيف النص المدخل إلى فئات محددة مسبقًا.
  2. استخراج الكيانات: تحديد الكيانات الرئيسية من النص.
  3. تلخيص النص: إنشاء ملخص موجز للنص المدخل.

يُظهر هذا الأنبوب كيفية استخدام LangGraph لإنشاء سير عمل نمطي قابل للتوسيع لمهام معالجة اللغة الطبيعية.

إعداد بيئة العمل:

قبل الغوص في الكود، دعونا نقوم بإعداد بيئة التطوير الخاصة بنا.

التثبيت:

استخدم الأمر التالي لتثبيت الحزم المطلوبة:

!pip install langgraph langchain langchain-openai python-dotenv

إعداد مفاتيح API:

سنحتاج إلى مفتاح API من OpenAI لاستخدام نماذجها. إذا لم يكن لديك بالفعل، يمكنك الحصول على واحد من https://platform.openai.com/signup.

import os
from dotenv import load_dotenv

# تحميل متغيرات البيئة من ملف .env (أنشئ هذا الملف مع مفتاح API الخاص بك)
load_dotenv()

# تعيين مفتاح API لـ OpenAI
os.environ["OPENAI_API_KEY"] = os.getenv('OPENAI_API_KEY')

اختبار الإعداد:

دعونا نتأكد من أن بيئتنا تعمل بشكل صحيح من خلال إنشاء اختبار بسيط باستخدام نموذج OpenAI:

from langchain_openai import ChatOpenAI

# تهيئة مثيل ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini")

# اختبار الإعداد
response = llm.invoke("مرحباً! هل تعمل؟")
print(response.content)

بناء أنبوب تحليل النصوص:

الآن، دعونا نقوم باستيراد الحزم اللازمة لأنبوب تحليل نصوص LangGraph الخاص بنا:

import os
from typing import TypedDict, List, Annotated
from langgraph.graph import StateGraph, END
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain_core.runnables.graph import MermaidDrawMethod
from IPython.display import display, Image

تصميم ذاكرة وكيلنا:

تمامًا كما يتطلب الذكاء البشري ذاكرة، يحتاج وكيلنا إلى طريقة لتتبع المعلومات. نقوم بإنشاء هذا باستخدام TypedDict لتحديد بنية حالتنا:

class State(TypedDict):
    text: str
    classification: str
    entities: List[str]
    summary: str

إنشاء القدرات الأساسية لوكيلنا:

الآن سنقوم بإنشاء المهارات الفعلية التي سيستخدمها وكيلنا. يتم تنفيذ كل من هذه القدرات كدالة تؤدي نوعًا محددًا من التحليل.

1. عقدة التصنيف:

def classification_node(state: State):
    '''تصنيف النص إلى إحدى الفئات: أخبار، مدونة، بحث، أو غير ذلك'''
    prompt = PromptTemplate(
        input_variables=["text"],
        template="صنف النص التالي إلى إحدى الفئات: أخبار، مدونة، بحث، أو غير ذلك.nnالنص:{text}nnfئة:"
    )
    message = HumanMessage(content=prompt.format(text=state["text"]))
    classification = llm.invoke([message]).content.strip()
    return {"classification": classification}

2. عقدة استخراج الكيانات:

def entity_extraction_node(state: State):
    '''استخراج جميع الكيانات (شخص، منظمة، موقع) من النص'''
    prompt = PromptTemplate(
        input_variables=["text"],
        template="استخرج جميع الكيانات (شخص، منظمة، موقع) من النص التالي. قدم النتيجة كقائمة مفصولة بفواصل.nnالنص:{text}nnالكيانات:"
    )
    message = HumanMessage(content=prompt.format(text=state["text"]))
    entities = llm.invoke([message]).content.strip().split(", ")
    return {"entities": entities}

3. عقدة التلخيص:

def summarization_node(state: State):
    '''تلخيص النص في جملة واحدة قصيرة'''
    prompt = PromptTemplate(
        input_variables=["text"],
        template="لخص النص التالي في جملة واحدة قصيرة.nnالنص:{text}nnملخص:"
    )
    message = HumanMessage(content=prompt.format(text=state["text"]))
    summary = llm.invoke([message]).content.strip()
    return {"summary": summary}

ربط كل شيء معًا:

الآن يأتي الجزء الأكثر إثارة – ربط هذه القدرات في نظام منسق باستخدام LangGraph:

# إنشاء سير عمل StateGraph
workflow = StateGraph(State)

# إضافة العقد إلى الرسم البياني
workflow.add_node("classification_node", classification_node)
workflow.add_node("entity_extraction", entity_extraction_node)
workflow.add_node("summarization", summarization_node)

# إضافة الحواف إلى الرسم البياني
workflow.set_entry_point("classification_node") # تعيين نقطة البداية للرسم البياني
workflow.add_edge("classification_node", "entity_extraction")
workflow.add_edge("entity_extraction", "summarization")
workflow.add_edge("summarization", END)

# تجميع الرسم البياني
app = workflow.compile()

(يتبع المزيد من الشرح حول اختبار الوكيل وإضافة المزيد من القدرات والحواف الشرطية في الأقسام التالية، مع الحفاظ على تنسيق Markdown.)

المصدر: MarkTechPost