سجل المحادثات لتطبيقات الذكاء الاصطناعي باستخدام Azure Cosmos DB Go SDK

تغطي هذه التدوينة كيفية بناء تنفيذ تاريخ المحادثات باستخدام Azure Cosmos DB ل NoSQL Go SDK و LangChainGo. إذا كنت جديدًا على Go SDK، فإن التطبيق العيني للروبوت المحادث المقدم في التدوينة يعتبر مقدمة عملية، حيث يغطي العمليات الأساسية مثل القراءة، والتحديث، وما إلى ذلك. كما يوضح استخدام محاكي Azure Cosmos DB القائم على Linux (في مرحلة المعاينة في وقت كتابة هذا) لاختبارات التكامل مع Testcontainers لـ Go.

مطوري Go الذين يسعون لبناء تطبيقات الذكاء الاصطناعي يمكنهم استخدام LangChainGo، وهو إطار عمل لتطبيقات LLM-powered. يوفر واجهات برمجة تطبيقات قابلة للتوصيل لمكونات مثل تخزين النوافذ، وتضمين، وتحميل المستندات، وسلاسل (لتكوين عمليات متعددة)، تاريخ المحادثات، والمزيد.


قبل الانغماس في التفاصيل، دعنا نعود خطوة لنفهم الأساسيات.

ما هو تاريخ المحادثات، ولماذا هو مهم لتطبيقات الذكاء الاصطناعي الحديثة؟

المتطلب الشائع لتطبيقات الذكاء الاصطناعي التحادثية هو القدرة على تخزين واسترجاع الرسائل المتبادلة كجزء من المحادثات. يُشار إليها في كثير من الأحيان باسم “تاريخ المحادثات”. إذا كنت قد استخدمت تطبيقات مثل ChatGPT (الذي يستخدم أيضًا Azure Cosmos DB، بالمناسبة!)، فقد تكون على دراية بهذه الفكرة.

عندما يقوم المستخدم بتسجيل الدخول، يمكنه البدء في الدردشة، وتُحفظ الرسائل المتبادلة كجزء من المحادثة. عندما يقوم بتسجيل الدخول مرة أخرى، يمكنه رؤية محادثاته السابقة والاستمرار من حيث توقف.

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

مثال بسيط يوضح ذلك: لنفترض أنك تطلب من نموذج لوجستي لغوي عبر واجهة برمجة التطبيقات، “أخبرني عن Azure Cosmos DB”، ويُجيب بفقرة طويلة. إذا طلبت ثمّ نصفت ذلك بنقاط تحتية لتسهيل القراءة، فقد يُربك النموذج لعدم وجود السياق من التفاعل السابق.

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

كيفية تشغيل الروبوت الدردشة

كما ذكرت سابقًا، تعتبر تطبيق العينة وسيلة مفيدة لاستكشاف langchaingo، تنفيذ تاريخ الدردشة في Azure Cosmos DB، بالإضافة إلى Go SDK.

قبل استكشاف تفاصيل التنفيذ، من الجيد أن ترى التطبيق في العمل. يرجى الرجوع إلى القسم README في مستودع GitHub, الذي يوفر تعليمات حول كيفية تكوين وتشغيل التطبيق وبدء المحادثة مع روبوت الدردشة.

نظرة عامة على التطبيق

يتبع تطبيق الدردشة نموذج مجالي مباشر: يمكن للمستخدمين بدء محادثات متعددة، ويمكن أن تحتوي كل محادثة على رسائل متعددة. تم بناء التطبيق باستخدام Go، ويتضمن مكونات الجزء الخلفي والجزء الأمامي.

الجزء الخلفي

يحتوي على عدة أجزاء فرعية:

  • تنفيذ تاريخ الدردشة في Azure Cosmos DB.
  • تعرض العمليات الأساسية مثل بدء محادثة، وإرسال/استقبال الرسائل، واسترداد تاريخ المحادثة من خلال واجهة برمجة التطبيقات الراحة.
  • تستفيد واجهة REST API من سلسلة langchaingo لمعالجة رسائل المستخدم. تقوم السلسلة تلقائيًا بتضمين تاريخ المحادثات لضمان إرسال المحادثات السابقة إلى LLM. langchaingo تتولى كل التنسيق – استدعاء LLM، تضمين تاريخ المحادثات، والمزيد دون الحاجة إلى تنفيذ يدوي.

واجهة المستخدم

تم بناؤها باستخدام JavaScript، HTML، و CSS. وهي مُعبأة كجزء من خادم الويب Go (باستخدام حزمة embed) وتستدعي واجهات REST الخلفية استجابةً لتفاعلات المستخدم.

تنفيذ تاريخ المحادثات باستخدام Azure Cosmos DB

LangChainGo هو إطار عمل قابل للتوصيل، بما في ذلك مكون تاريخ المحادثات (أو الذاكرة الداخلية). لدمج Azure Cosmos DB، تحتاج إلى تنفيذ واجهة schema.ChatMessageHistory، التي توفر طرقًا لإدارة تاريخ المحادثات:

  • AddMessage لإضافة رسائل إلى محادثة (أو بدء محادثة جديدة).
  • Messages لاسترداد جميع الرسائل لمحادثة.
  • Clear لحذف جميع الرسائل في محادثة.

بينما يمكنك إنشاء مثيل CosmosDBChatMessageHistory مباشرة واستخدام هذه الأساليب، النهج الموصى به هو دمجه في تطبيق langchaingo. فيما يلي مثال على استخدام تاريخ الدردشة في Azure Cosmos DB مع LLMChain:

Go

 

// إنشاء مثيل لتاريخ الدردشة
cosmosChatHistory, err := cosmosdb.NewCosmosDBChatMessageHistory(cosmosClient, databaseName, containerName, req.SessionID, req.UserID)
if err != nil {
    log.Printf("Error creating chat history: %v", err)
    sendErrorResponse(w, "Failed to create chat session", http.StatusInternalServerError)
    return
}

// إنشاء ذاكرة باستخدام تاريخ الدردشة
chatMemory := memory.NewConversationBuffer(
    memory.WithMemoryKey("chat_history"),
    memory.WithChatHistory(cosmosChatHistory),
)

// إنشاء سلسلة LLM
chain := chains.LLMChain{
    Prompt:       promptsTemplate,
    LLM:          llm,
    Memory:       chatMemory,
    OutputParser: outputparser.NewSimple(),
    OutputKey:    "text",
}

من وجهة نظر قاعدة بيانات Azure Cosmos DB، يجب ملاحظة أن التنفيذ في هذا المثال هو واحد من العديد من الخيارات الممكنة. الذي يُظهر هنا يعتمد على مزيج من معرف المستخدم كمفتاح تقسيمي ومعرف المحادثة (المعروف أيضًا باسم معرف الجلسة في بعض الأحيان) كمفتاح فريد (id لعنصر Azure Cosmos DB).

يتيح هذا للتطبيق:

  • الحصول على جميع الرسائل لمحادثة. هذا هو قراءة نقطية باستخدام المعرف الفريد (معرف المحادثة) والمفتاح التقسيمي (معرف المستخدم).
  • أضف رسالة جديدة إلى محادثة. يستخدم عملية upsert (بدلاً من create) لتجنب الحاجة إلى read قبل الكتابة.
  • احذف محادثة معينة. يستخدم عملية delete لإزالة محادثة (وكل رسائلها).

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

بسهولة الاختبار باستخدام محاكي Azure Cosmos DB و Testcontainers

يتضمن التطبيق العيني حالات اختبار أساسية لكلاً من تاريخ المحادثات في قاعدة بيانات Azure Cosmos DB والتطبيق الرئيسي. يجدر بالذكر استخدام testcontainers-go لدمج حاوية دوكر محاكي Azure Cosmos DB القائم على نظام Linux.

هذا رائع لاختبارات الدمج نظرًا لتوافر قاعدة البيانات محليًا وتشغيل الاختبارات بشكل أسرع بكثير (دون نسيان توفير التكاليف أيضًا!). الجميل في الأمر هو أنك لست بحاجة لإدارة دورة حياة حاوية الدوكر يدويًا. يتم التعامل مع هذا كجزء من مجموعة الاختبارات، بفضل واجهة برمجة تطبيقات testcontainers-go التي تجعل من السهل بدء تشغيل الحاوية قبل تشغيل الاختبارات وإنهائها عند اكتمالها.

يمكنك الرجوع إلى حالات الاختبار في التطبيق العيني لمزيد من التفاصيل. إليك مقتطف من كيفية استخدام testcontainers-go:

Go

 

func setupCosmosEmulator(ctx context.Context) (testcontainers.Container, error) {
    req := testcontainers.ContainerRequest{
        Image:        emulatorImage,
        ExposedPorts: []string{emulatorPort + ":8081", "1234:1234"},
        WaitingFor:   wait.ForListeningPort(nat.Port(emulatorPort)),
    }

    container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
        ContainerRequest: req,
        Started:         true,
    })
    if err != nil {
        return nil, fmt.Errorf("failed to start container: %w", err)
    }

    // منح المحاكي المزيد من الوقت للتهيئة الكاملة
    time.Sleep(5 * time.Second)

    return container, nil
}

إذا كنت مهتمًا باستخدام محاكي Azure Cosmos DB في أنابيب CI، تحقق من مقال المدونة.

اختتام

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

بينما التنفيذ في تطبيق العينة بسيط نسبيًا، يعتمد كيفية نمذجة بيانات تاريخ المحادثات على المتطلبات. أحد السيناريوهات التي تم تقديمها هو هذا المدونة الممتازة حول كيفية توسيع Microsoft Copilot ليشمل ملايين المستخدمين باستخدام Azure Cosmos DB.

قد تشمل بعض متطلباتك:

  • تخزين البيانات الوصفية، مثل ردود الفعل (بالإضافة إلى الرسائل)
  • عرض أحدث N رسالة
  • أخذ فترة احتفاظ بيانات تاريخ المحادثات في الاعتبار (باستخدام TTL)
  • دمج تحليلات إضافية (حول تفاعلات المستخدمين) بناءً على بيانات تاريخ المحادثات والمزيد.

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

هل تستخدم بالفعل أو تخطط للاستفادة من قاعدة بيانات Azure Cosmos DB لتطبيقات Go الخاصة بك؟ نود أن نسمع منك! أرسل لنا أسئلتك وملاحظاتك.

Source:
https://dzone.com/articles/chat-history-ai-applications-azure-cosmos-db-go-sdk