ذاكرة المحادثة في سلسلة اللغات
LangChain هو إطار عمل قوي لبناء تطبيقات LLM. ومع ذلك، مع هذه القوة يأتي قدر كبير من التعقيد. يوفر LangChain العديد من الطرق لمطالبة LLM وميزات أساسية مثل ذاكرة المحادثة. توفر ذاكرة المحادثة سياقًا لـ LLM لتذكر محادثتك.
في هذا المنشور، نلقي نظرة على كيفية استخدام ذاكرة المحادثة مع LangChain وMilvus. للمتابعة، تحتاج إلى pip
تثبيت أربع مكتبات ومفتاح OpenAI API. يمكن تثبيت المكتبات الأربع التي تحتاجها عن طريق تشغيل pip install langchain milvus pymilvus python-dotenv
. أو تنفيذ الكتلة الأولى في دفتر ملاحظات CoLab لهذه المقالة.
سنتعرف في هذا المنشور على:
- ذاكرة المحادثة مع LangChain
- إعداد سياق المحادثة
- تحفيز ذاكرة المحادثة باستخدام LangChain
- ملخص ذاكرة المحادثة باستخدام لانغ تشين
ذاكرة المحادثة مع لانغ تشين
في الحالة الافتراضية، تتفاعل مع ذاكرة المحادثة مع LLM من خلال مطالبات فردية. إضافة ذاكرة للسياق، أو "ذاكرة المحادثة" تعني أنك لم تعد مضطرًا لإرسال كل شيء من خلال مطالبة واحدة. توفر LangChain القدرة على تخزين المحادثة التي أجريتها بالفعل مع LLM لاسترداد تلك المعلومات لاحقًا.
لإعداد ذاكرة محادثة مستمرة مع مخزن متجه، نحتاج إلى ست وحدات من LangChain. أولاً، يجب أن نحصل على OpenAIEmbeddings
و OpenAI
LLM. نحتاج أيضًا إلى VectorStoreRetrieverMemory
ونسخة LangChain من Milvus
لاستخدام الواجهة الخلفية لمخزن المتجهات. ثم نحتاج إلى ConversationChain
و PromptTemplate
لحفظ محادثتنا والاستعلام عنها.
مكتبات os
و dotenv
و openai
هي في الأساس لأغراض تشغيلية. نستخدمها لتحميل واستخدام مفتاح OpenAI API. تتمثل خطوة الإعداد الأخيرة في تشغيل مثيل Milvus Lite محلي. نقوم بذلك من خلال استخدام default_server
من حزمة Milvus Python.
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.llms import OpenAI
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
from langchain.vectorstores import Milvus
embeddings = OpenAIEmbeddings()
import os
from dotenv import load_dotenv
import openai
load_dotenv()
openai.api_key = os.getenv("OPENAI_API_KEY")
from milvus import default_server
default_server.start()
إعداد سياق المحادثة
الآن بعد أن قمنا بإعداد جميع المتطلبات الأساسية لدينا، يمكننا المتابعة لإنشاء ذاكرة المحادثة الخاصة بنا. خطوتنا الأولى هي إنشاء اتصال بخادم Milvus باستخدام LangChain. بعد ذلك، نستخدم قاموسًا فارغًا لإنشاء مجموعة لانغ تشين ميلفوس الخاصة بنا. بالإضافة إلى ذلك، نقوم بتمرير التضمينات التي أنشأناها أعلاه وتفاصيل الاتصال لخادم ميلفوس لايت.
لاستخدام قاعدة البيانات المتجهة لذاكرة المحادثة، نحتاج إلى إنشائها كمسترجع. نقوم باسترداد النتيجة الأولى فقط في هذه الحالة، مع تعيين k=1
. الخطوة الأخيرة لإعداد ذاكرة المحادثة هي استخدام الكائن VectorStoreRetrieverMemory
كذاكرة محادثة لدينا من خلال المسترد واتصال قاعدة بيانات المتجهات الذي أنشأناه للتو.
لاستخدام ذاكرة المحادثة لدينا، يجب أن تحتوي على بعض السياق فيها. لذا دعونا نعطي الذاكرة بعض السياق. في هذا المثال، سنعطي خمسة أجزاء من المعلومات. دعنا نخزن وجباتي الخفيفة المفضلة (الشوكولاتة)، والرياضة (السباحة)، والبيرة (جينيس)، والحلوى (كعكة الجبن)، والموسيقي (تايلور سويفت). يتم حفظ كل إدخال في الذاكرة من خلال وظيفة save_context
.
vectordb = Milvus.from_documents(
{},
embeddings,
connection_args={"host": "127.0.0.1", "port": default_server.listen_port})
retriever = Milvus.as_retriever(vectordb, search_kwargs=dict(k=1))
memory = VectorStoreRetrieverMemory(retriever=retriever)
about_me = [
{"input": "My favorite snack is chocolate",
"output": "Nice"},
{"input": "My favorite sport is swimming",
"output": "Cool"},
{"input": "My favorite beer is Guinness",
"output": "Great"},
{"input": "My favorite dessert is cheesecake",
"output": "Good to know"},
{"input": "My favorite musician is Taylor Swift",
"output": "Same"}
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
تحفيز ذاكرة المحادثة باستخدام LangChain
حان الوقت لإلقاء نظرة على كيفية استخدام ذاكرة المحادثة. لنبدأ بالاتصال بـ OpenAI LLM من خلال LangChain. نستخدم درجة حرارة 0 للإشارة إلى أننا لا نريد أن تكون ذاكرة LLM الخاصة بنا مبدعة.
بعد ذلك، ننشئ قالبًا. نخبر LLM أنه منخرط في محادثة ودية مع إنسان ونقوم بإدراج متغيرين. يوفر المتغير history
السياق من ذاكرة المحادثة. يوفر المتغير input
المدخلات الحالية. نستخدم الكائن PromptTemplate
لإدراج هذه المتغيرات.
نستخدم الكائن ConversationChain
لدمج كائن لدمج المطالبة وLLM والذاكرة. نحن الآن جاهزون للتحقق من ذاكرة محادثتنا من خلال إعطائها بعض المطالبات. نبدأ بإخبار LLM أن اسمنا هو غاري، المنافس الرئيسي في سلسلة البوكيمون (كل شيء آخر في ذاكرة المحادثة هو حقيقة عني).
llm = OpenAI(temperature=0) # Can be any valid LLM
_DEFAULT_TEMPLATE = """The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know.
Relevant pieces of previous conversation:
{history}
(You do not need to use these pieces of information if not relevant)
Current conversation:
Human: {input}
AI:"""
PROMPT = PromptTemplate(
input_variables=["history", "input"], template=_DEFAULT_TEMPLATE
)
conversation_with_summary = ConversationChain(
llm=llm,
prompt=PROMPT,
memory=memory,
verbose=True
)
conversation_with_summary.predict(input="Hi, my name is Gary, what's up?")
توضح الصورة أدناه كيف يمكن أن تبدو الاستجابة المتوقعة من LLM. في هذا المثال، استجاب في هذا المثال بقوله أن اسمه هو "AI".
لنختبر الآن الذاكرة حتى الآن. نستخدم الكائن ConversationChain
الذي أنشأناه سابقًا ونستعلم عن الموسيقي المفضل لدي.
conversation_with_summary.predict(input="who is my favorite musician?")
تُظهر الصورة أدناه استجابة متوقعة من سلسلة المحادثة. نظرًا لأننا استخدمنا خيار الإسهاب، فإنه يظهر لنا أيضًا المحادثة ذات الصلة. يمكننا أن نرى أنه يُظهر أن الفنان المفضل لدي هو تايلور سويفت، كما هو متوقع.
بعد ذلك، دعنا نتحقق من الحلوى المفضلة لدي - كعكة الجبن.
conversation_with_summary.predict(input="Whats my favorite dessert?")
عندما نستفسر عن الحلوى المفضلة لدي، يمكننا أن نرى أن سلسلة المحادثة تختار مرة أخرى المعلومات الصحيحة من ميلفوس. يجد أن الحلوى المفضلة لدي هي كعكة الجبن، كما أخبرته سابقًا.
الآن بعد أن تأكدنا من أنه يمكننا الاستعلام عن المعلومات التي قدمناها سابقًا، دعنا نتحقق من شيء آخر - المعلومات التي قدمناها في بداية محادثتنا. بدأنا محادثتنا بإخبار الذكاء الاصطناعي أن اسمنا هو غاري.
conversation_with_summary.predict(input="What's my name?")
ينتج عن فحصنا الأخير أن سلسلة المحادثة خزنت الجزء الخاص باسمنا في ذاكرة المحادثة في مخزننا المتجه. يعود أننا قلنا أن اسمنا هو غاري.
ملخص ذاكرة المحادثة في سلسلة اللغات
تعلّمنا في هذا الشرح كيفية استخدام ذاكرة المحادثة في لانغتشين. تقدم لانغ تشين إمكانية الوصول إلى مخزن المتجهات الخلفية مثل ميلفوس لذاكرة المحادثة الدائمة. يمكننا استخدام ذاكرة المحادثة عن طريق حقن التاريخ في مطالباتنا وحفظ السياق التاريخي في الكائن ConversationChain
.
في هذا المثال التعليمي، أعطينا سلسلة المحادثة خمس حقائق عني وتظاهرنا بأننا المنافس الرئيسي في بوكيمون، غاري. بعد ذلك، ضغطنا على سلسلة المحادثة بأسئلة حول المعرفة المسبقة التي قمنا بتخزينها - الموسيقي والحلوى المفضلة لدي. وقد أجاب على هذين السؤالين بشكل صحيح وأظهر الإدخالات ذات الصلة. وأخيراً، سألناها عن اسمنا كما ورد في بداية المحادثة، فأجابت بشكل صحيح بأن اسمنا هو "غاري".
- ذاكرة المحادثة مع لانغ تشين
- إعداد سياق المحادثة
- تحفيز ذاكرة المحادثة باستخدام LangChain
- ملخص ذاكرة المحادثة في سلسلة اللغات
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word