دمج دالة تضمين النص في ميلفوس مع لانغتشين
يوضح هذا الدليل كيفية استخدام دالة تضمين النص في Milvus 2.6 في Milvus (المعروفة أيضًا باسم Data In Data Out) مع LangChain. تسمح هذه الميزة لخادم Milvus بتحويل النص الخام تلقائيًا إلى تضمينات متجهة، مما يبسّط التعليمات البرمجية من جانب العميل ويجعل إدارة مفاتيح واجهة برمجة التطبيقات مركزية.
Milvus هي قاعدة بيانات المتجهات الأكثر تقدمًا في العالم مفتوحة المصدر، وهي مصممة خصيصًا لدعم تضمين تطبيقات البحث عن التشابه والذكاء الاصطناعي. LangChain هو إطار عمل لتطوير التطبيقات المدعومة بنماذج لغوية كبيرة (LLMs). من خلال دمج وظيفة تضمين النص في Milvus، يمكنك تحقيق حل بحث متجه أبسط وأكثر كفاءة في تطبيقات LangChain الخاصة بك.
المتطلبات الأساسية
قبل تشغيل هذا البرنامج التعليمي، تأكد من تثبيت التبعيات التالية:
! pip install --upgrade langchain-milvus langchain-core langchain-openai
إذا كنت تستخدم Google Colab، لتمكين التبعيات المثبتة للتو، قد تحتاج إلى إعادة تشغيل وقت التشغيل (انقر على قائمة "وقت التشغيل" في أعلى الشاشة، وحدد "إعادة تشغيل الجلسة" من القائمة المنسدلة).
تكوين خادم ميلفوس
هام: ميزة وظيفة تضمين النص (إدخال البيانات في البيانات) متوفرة فقط في Milvus Server. لا يدعم Milvus Lite هذه الميزة. أنت بحاجة إلى استخدام خادم Milvus منتشر مع Docker/Kubernetes.
قبل استخدام خاصية تضمين النص، تحتاج إلى تكوين بيانات الاعتماد لتضمين موفري الخدمة على خادم Milvus.
أعلن مفاتيحك ضمن بيانات الاعتماد:
يمكنك سرد مفتاح واحد أو أكثر من مفاتيح واجهة برمجة التطبيقات - قم بإعطاء كل منها تسمية تخترعها وستشير إليها لاحقًا.
# milvus.yaml
credential:
apikey_dev:
apikey: <YOUR_OPENAI_API_KEY>
أخبر ميلفوس بالمفتاح الذي ستستخدمه لمكالمات OpenAI
في نفس الملف، وجّه موفر OpenAI إلى التسمية التي تريده أن يستخدمها.
function:
textEmbedding:
providers:
openai:
credential: apikey_dev
# url: https://api.openai.com/v1/embeddings # (optional) custom url
للمزيد من طرق التكوين، يرجى الرجوع إلى وثائق وظيفة تضمين ميلفوس.
بدء تشغيل خدمة Milvus
تأكد من تشغيل خادم Milvus Server وتمكين ميزة التضمين. يمكنك نشر خادم Milvus باستخدام Docker أو Kubernetes. ملاحظة: لا يدعم ميلفوس لايت وظيفة تضمين النص.
فهم التضمين: جانب العميل مقابل جانب الخادم
قبل الغوص في الاستخدام، دعونا أولاً نفهم الاختلافات بين نهجي التضمين.
التضمين باستخدام فئة Embeddings الخاصة بـ LangChain (من جانب العميل)
في نهج LangChain التقليدي، يحدث التضمين من جانب العميل باستخدام فئةEmbeddings . يحتاج تطبيقك إلى استخدام أسلوب embed_query الخاص بالفئة لاستدعاء واجهة برمجة تطبيقات التضمين، ثم تخزين المتجهات التي تم إنشاؤها في ميلفوس.
from langchain_openai import OpenAIEmbeddings
from langchain_milvus import Milvus
# Generate embedding on client side
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("Hello, world!")
# [0.123, -0.456, ...] A vector of floats
vector_store = Milvus(
embedding_function=embeddings,
connection_args={"uri": "http://localhost:19530"},
collection_name="traditional_approach_collection",
)
مخطط التسلسل:
الخصائص:
- يستدعي العميل مباشرة واجهة برمجة تطبيقات التضمين
- تحتاج إلى إدارة مفاتيح واجهة برمجة التطبيقات من جانب العميل
- تدفق البيانات: نص ← عميل ← واجهة برمجة تطبيقات التضمين ← واجهة برمجة تطبيقات التضمين ← ناقل ← ملفوس
وظيفة تضمين النص في ميلفوس (إدخال البيانات من جانب الخادم وإخراج البيانات)
تسمح دالة تضمين النص في ميلفوس 2.6 (البيانات في البيانات الخارجة) لخادم ميلفوس بتحويل النص الخام تلقائيًا إلى تضمينات متجهة. يحتاج العميل فقط إلى توفير النص، وسيقوم ميلفوس تلقائياً بمعالجة توليد التضمين.
مخطط التسلسل:
الخصائص:
- خادم ميلفوس يستدعي واجهة برمجة تطبيقات التضمين
- تتم إدارة مفاتيح واجهة برمجة التطبيقات مركزياً من جانب الخادم
- تدفق البيانات: النص ← ميلفوس ← تضمين واجهة برمجة التطبيقات ← ناقل (مخزن في ميلفوس)
مقارنة بين الطريقتين
| الميزة | تضمين سلسلة اللغات (من جانب العميل) | وظيفة تضمين النص في ميلفوس (من جانب الخادم) |
|---|---|---|
| موقع المعالجة | تطبيق العميل | خادم ميلفوس |
| مكالمات واجهة برمجة التطبيقات | يستدعي العميل مباشرةً واجهة برمجة تطبيقات التضمين | خادم Milvus يستدعي واجهة برمجة تطبيقات التضمين |
| إدارة مفاتيح API | تحتاج إلى إدارة من جانب العميل | إدارة مركزية من جانب الخادم، أكثر أمانًا |
| تعقيد التعليمات البرمجية | الحاجة إلى إدارة مفاتيح واجهة برمجة التطبيقات والمكالمات من جانب العميل | تحتاج فقط إلى التهيئة مرة واحدة في تكوين Milvus |
| حالات الاستخدام | - الحاجة إلى التحكم من جانب العميل في عملية التضمين - الحاجة إلى تخزين نتائج التضمين مؤقتاً على جانب العميل - الحاجة إلى دعم تبديل نماذج التضمين المتعددة | - تبسيط التعليمات البرمجية من جانب العميل - إدارة مفاتيح واجهة برمجة التطبيقات مركزياً من جانب الخادم - الحاجة إلى معالجة كميات كبيرة من المستندات دفعة واحدة - تريد تقليل التفاعلات من جانب العميل مع واجهات برمجة التطبيقات الخارجية - الحاجة إلى الدمج مع ميزات Milvus المدمجة مثل BM25 |
| متطلبات إصدار Milvus | جميع الإصدارات (بما في ذلك Milvus Lite) | ميلفوس لايت غير مدعوم |
يقدم هذا البرنامج التعليمي في المقام الأول طريقة وظيفة تضمين النص من جانب الخادم Milvus (تضمين البيانات في البيانات)، وهي ميزة جديدة تم تقديمها في Milvus 2.6 والتي يمكن أن تبسط بشكل كبير التعليمات البرمجية من جانب العميل وتحسن الأمان.
استخدام دالة تضمين النص
مثال 1: التضمين من جانب الخادم فقط
هذه أبسط حالة استخدام، حيث تعتمد بشكل كامل على خادم Milvus لإنشاء التضمينات. لا يحتاج العميل إلى أي وظيفة تضمين.
from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction
from langchain_core.documents import Document
# Create Text Embedding Function
text_embedding_func = TextEmbeddingBuiltInFunction(
input_field_names="text", # Input field name (field containing text)
output_field_names="vector", # Output field name (field storing vectors)
dim=1536, # Vector dimension (must specify)
params={
"provider": "openai", # Service provider
"model_name": "text-embedding-3-small", # Model name
"credential": "apikey_dev", # Optional: use credential label configured in milvus.yaml
},
)
# Create Milvus vector store
# Note: embedding_function=None, because embedding is done on server side
vector_store = Milvus(
embedding_function=None, # Do not use client-side embedding
builtin_function=text_embedding_func,
connection_args={"uri": "http://localhost:19530"},
collection_name="my_collection",
# consistency_level="Strong", # Strong consistency level, default is "Session"
auto_id=True,
# drop_old=True, # If you want to drop old collection and create a new one
)
على connection_args:
- يجب استخدام خادم ميلفوس: ميزة وظيفة تضمين النص متوفرة فقط في خادم Milvus Server، Milvus Lite غير مدعوم.
- استخدم الخادم uri، مثل
http://localhost:19530(نشر Docker المحلي) أوhttp://your-server:19530(خادم بعيد). - في حالة استخدام Zilliz Cloud، استخدم نقطة النهاية العامة
uriوقم بتعيين المعلمةtoken.
عند إضافة المستندات، تحتاج فقط إلى توفير النص، ولا حاجة لحساب المتجهات مسبقًا. سيقوم ميلفوس تلقائيًا باستدعاء واجهة برمجة تطبيقات OpenAI لإنشاء التضمينات.
# Add documents (only need to provide text, no need to pre-compute vectors)
documents = [
Document(page_content="Milvus simplifies semantic search through embeddings."),
Document(
page_content="Vector embeddings convert text into searchable numeric data."
),
Document(
page_content="Semantic search helps users find relevant information quickly."
),
]
vector_store.add_documents(documents)
[462726375729313252, 462726375729313253, 462726375729313254]
أثناء البحث، استخدم الاستعلامات النصية مباشرة، وسيقوم Milvus تلقائيًا بتحويل نص الاستعلام إلى متجهات للبحث.
# Search (directly use text query)
results = vector_store.similarity_search(
query="How does Milvus handle semantic search?", k=2
)
for doc in results:
print(f"Content: {doc.page_content}")
print(f"Metadata: {doc.metadata}\n")
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
I0000 00:00:1765186679.227345 12227536 fork_posix.cc:71] Other threads are currently calling into gRPC, skipping fork() handlers
Content: Milvus simplifies semantic search through embeddings.
Metadata: {'pk': 462726375729313252}
Content: Semantic search helps users find relevant information quickly.
Metadata: {'pk': 462726375729313254}
مثال 2: الجمع بين تضمين النص و BM25 (البحث الهجين)
يتيح الجمع بين البحث الدلالي (تضمين النص) والبحث بالكلمات المفتاحية (BM25) إمكانات بحث هجين أكثر قوة. يتفوق البحث الدلالي في فهم مقصد الاستعلام، بينما يتفوق البحث بالكلمات المفتاحية في المطابقة التامة.
from langchain_milvus import Milvus
from langchain_milvus.function import TextEmbeddingBuiltInFunction, BM25BuiltInFunction
# Text Embedding Function (semantic search)
text_embedding_func = TextEmbeddingBuiltInFunction(
input_field_names="text",
output_field_names="vector_dense",
dim=1536,
params={
"provider": "openai",
"model_name": "text-embedding-3-small",
},
)
# BM25 Function (keyword search)
bm25_func = BM25BuiltInFunction(
input_field_names="text",
output_field_names="vector_sparse",
)
# Create Milvus vector store
vector_store = Milvus(
embedding_function=None,
builtin_function=[text_embedding_func, bm25_func],
connection_args={"uri": "http://localhost:19530"},
vector_field=["vector_dense", "vector_sparse"],
collection_name="hybrid_search_collection",
# consistency_level="Strong", # Strong consistency level, default is "Session"
auto_id=True,
# drop_old=True, # If you want to drop old collection and create a new one
)
# Add documents
documents = [
Document(page_content="Machine learning and artificial intelligence"),
Document(page_content="The cat sat on the mat"),
]
vector_store.add_documents(documents)
[462726375729313255, 462726375729313256]
استخدم WeightedRanker للتحكم في أوزان البحث الدلالي والبحث بالكلمات المفتاحية. عندما يكون الوزن الكثيف أعلى، تكون النتائج أكثر انحيازًا للتشابه الدلالي؛ وعندما يكون الوزن المتناثر أعلى، تكون النتائج أكثر انحيازًا لمطابقة الكلمات المفتاحية.
# Hybrid search, use WeightedRanker to control weights
# 70% semantic search, 30% keyword search
results = vector_store.similarity_search(
query="AI technology",
k=2,
ranker_type="weighted",
ranker_params={"weights": [0.7, 0.3]},
)
# If you want to be more biased towards keyword matching, you can adjust weights
# 30% semantic search, 70% keyword search
results_keyword_focused = vector_store.similarity_search(
query="cat mat",
k=2,
ranker_type="weighted",
ranker_params={"weights": [0.3, 0.7]},
)
results
[Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence'),
Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat')]
results_keyword_focused
[Document(metadata={'pk': 462726375729313256}, page_content='The cat sat on the mat'),
Document(metadata={'pk': 462726375729313255}, page_content='Machine learning and artificial intelligence')]
الملخص
تهانينا! لقد تعلمت كيفية استخدام خاصية تضمين النص في ميلفوس (تضمين البيانات في البيانات) مع لانغ تشين. من خلال نقل توليد التضمين إلى جانب الخادم، يمكنك تبسيط التعليمات البرمجية من جانب العميل، وإدارة مفاتيح واجهة برمجة التطبيقات مركزيًا، وتنفيذ البحث المختلط بسهولة. بالاقتران مع وظيفة تضمين النص و BM25، يوفر لك Milvus إمكانات بحث متجهية قوية.