Nutzung von Milvus und Friendli Serverless Endpoints für fortgeschrittene RAG und multimodale Abfragen
FriendliAI ist auf Infrastruktur für generative KI spezialisiert und bietet Lösungen, die es Organisationen ermöglichen, große Sprachmodelle (LLMs) und andere generative KI-Modelle effizient bereitzustellen und zu verwalten – mit optimierter Leistung und reduzierten Kosten. Nutzer haben die Möglichkeit, aus produktionsreifen konventionellen LLMs zu wählen, die über APIs zugänglich sind, oder benutzerdefinierte feinabgestimmte LLMs auf der Hardware ihrer Wahl bereitzustellen, sei es in der Public Cloud oder auf privaten On-Premise-Clustern.
Milvus ist eine Open-Source-Vektordatenbank, die unstrukturierte Daten im Milliardenmaßstab mithilfe hochdimensionaler Vektoreinbettungen speichert, indexiert und durchsucht. Sie eignet sich perfekt für den Aufbau moderner KI-Anwendungen wie Retrieval-Augmented Generation (RAG), semantische Suche, multimodale Suche und Empfehlungssysteme.
In diesem Artikel untersuchen wir, wie Milvus mit Friendli Serverless Endpoints verwendet werden kann, um Retrieval-Augmented Generation (RAG) auf bestimmten Dokumenten und Materialien durchzuführen und multimodale Abfragen auszuführen, die Bilder und andere visuelle Inhalte einbeziehen. Diese leistungsstarke Kombination ermöglicht anspruchsvollere und kontextbewusstere KI-Anwendungen.
RAG und multimodale Modelle verstehen
Retrieval-Augmented Generation (RAG)
RAG ist eine Technik, die Sprachmodelle verbessert, indem sie ihnen relevante Informationen bereitstellt, die hauptsächlich aus einer von einer Vektordatenbank gestützten Wissensdatenbank abgerufen werden. Dieser Ansatz ermöglicht es KI-Modellen, genauere und kontextuell passendere Antworten zu generieren, indem sie auf festgelegte externe Datenquellen verweisen.
Multimodale Modelle
Multimodale Modelle können mehrere Arten von Eingabedaten verarbeiten und verstehen, z. B. Text, Bilder und Audio. Sie können auf Grundlage vielfältiger Informationsquellen analysieren und Antworten generieren, wodurch umfassendere und nuanciertere Interaktionen ermöglicht werden.
Warum RAG und multimodale Modelle gemeinsam einbeziehen?
Die Kombination von RAG und multimodalen Fähigkeiten verbessert KI-Systeme erheblich, indem sie gleichzeitig die folgenden Funktionen bereitstellt:
- Ermöglichung vielfältigerer und reichhaltigerer Eingabetypen nach Wahl des Nutzers
- Bereitstellung aktueller Informationen
- Verbesserung der Genauigkeit und Relevanz von Antworten
- Ermöglichung kontextbewusster Interaktionen
Praktische Implementierung
Tauchen wir in die praktische Implementierung von RAG und multimodalen Abfragen mit der Milvus-Vektordatenbank und Friendli Serverless Endpoints ein.
Schritt 1: Voraussetzungen installieren und Milvus-Dokumentation herunterladen
Zunächst installieren wir die erforderlichen Bibliotheken und laden die Milvus-Dokumentation herunter, die wir für unseren RAG-Job verwenden werden:
!pip install --upgrade pymilvus requests tqdm langchain langchain-community langchain-huggingface langchain-openai friendli-client tiktoken
!wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
!rm -rf milvus_docs
!unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
Schritt 2: Dokumentationsdateien verarbeiten
Als Nächstes lesen wir die Milvus-Dokumentationsdateien und verwenden eine einfache Dateiaufteilungsstrategie, um jede Textzeile als einzelnen Chunk zu behandeln:
from glob import glob
text_lines = []
for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
with open(file_path, "r") as file:
file_text = file.read()
text_lines += file_text.split("# ")
Schritt 3: Embeddings vorbereiten
Wir verwenden die Hugging Face Embeddings-Bibliothek, um ein einfaches all-MiniLM-L6-Modell zu nutzen und Vektorrepräsentationen unseres Textes zu erstellen:
from langchain_huggingface import HuggingFaceEmbeddings
embeddings_model_name = "sentence-transformers/all-MiniLM-L6-v2"
embedding = HuggingFaceEmbeddings(model_name=embeddings_model_name)
test_embedding = embedding.embed_query("This is a test")
embedding_dim = len(test_embedding)
print(embedding_dim)
print(test_embedding[:10])
Schritt 4: Milvus-Client einrichten
Bereiten wir nun den Milvus-Client für unsere RAG-Implementierung vor. In diesem einfachen Beispiel verwenden wir Milvus Lite, das lokal ausgeführt wird und eine Datei in einer lokalen Datei materialisiert. Sie können auch andere Milvus-Bereitstellungsoptionen in Betracht ziehen:
Wenn Sie nur eine lokale Vektordatenbank für Daten in kleinem Umfang oder für Prototyping benötigen, ist das Festlegen der uri als lokale Datei, z. B../milvus.db, die bequemste Methode, da dadurch automatisch Milvus Lite verwendet wird, um alle Daten in dieser Datei zu speichern.
Für größere Datenmengen und höheren Traffic in der Produktion können Sie einen Milvus-Server auf Docker oder Kubernetes einrichten. Verwenden Sie in diesem Setup bitte die Serveradresse und den Port als Ihre uri, z. B.http://localhost:19530. Wenn Sie die Authentifizierungsfunktion in Milvus aktivieren, setzen Sie das token auf "<your_username>:<your_password>", andernfalls muss das Token nicht gesetzt werden.
Sie können auch vollständig verwaltetes Milvus auf Zilliz Cloud verwenden. Setzen Sie einfach uri und token auf den Public Endpoint und API-Schlüssel Ihrer Zilliz Cloud-Instanz.
from pymilvus import MilvusClient
milvus_client = MilvusClient(uri="./milvus_demo.db")
collection_name = "my_rag_collection"
Schritt 5: Milvus-Collection erstellen
Wir erstellen eine Collection im Milvus-Client, falls sie noch nicht existiert:
if milvus_client.has_collection(collection_name):
milvus_client.drop_collection(collection_name)
milvus_client.create_collection(
collection_name=collection_name,
dimension=embedding_dim,
metric_type="IP", # Inner product distance
consistency_level="Strong", # Strong consistency level
)
Schritt 6: Text einbetten und in Milvus einfügen
Lassen Sie uns unseren Text einbetten und in die Milvus-Collection einfügen:
from tqdm import tqdm
data = []
for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
data.append({"id": i, "vector": embedding.embed_query(line), "text": line})
milvus_client.insert(collection_name=collection_name, data=data)
Schritt 7: RAG-Abfrage durchführen
Nun können wir eine Frage stellen und in unserer Milvus-Datenbank nach relevanten Daten suchen:
question = "How is data stored in milvus?"
search_res = milvus_client.search(
collection_name=collection_name,
data=[
embedding.embed_query(question)
],
limit=3, # Return top 3 results
search_params={"metric_type": "IP", "params": {}}, # Inner product distance
output_fields=["text"], # Return the text field
)
import json
retrieved_lines_with_distances = [
(res["entity"]["text"], res["distance"]) for res in search_res[0]
]
print(json.dumps(retrieved_lines_with_distances, indent=4))
context = "\n".join(
[line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]
)
Schritt 8: Prompts für RAG erstellen
Lassen Sie uns die System- und Benutzer-Prompts für unsere RAG-Abfrage erstellen:
SYSTEM_PROMPT = """
Human: You are an AI assistant. You are able to find answers to the questions from the contextual passage snippets provided.
"""
USER_PROMPT = f"""
Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
<context>
{context}
</context>
<question>
{question}
</question>
"""
Schritt 9: Friendli-Token einrichten
Beziehen Sie Ihr FRIENDLI_TOKEN aus der Friendli Suite und legen Sie es als Umgebungsvariable fest:
import os
if "FRIENDLI_TOKEN" not in os.environ:
os.environ["FRIENDLI_TOKEN"] = 'flp_FILL_IN_WITH_YOUR_OWN_PERSONAL_ACCESS_TOKEN'
Schritt 10: RAG-Abfrage ausführen
Nun können wir unsere RAG-Abfrage mithilfe der Friendli Serverless Endpoints ausführen:
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="meta-llama-3.1-70b-instruct",
base_url="https://api.friendli.ai/serverless/v1",
api_key=os.environ["FRIENDLI_TOKEN"],
)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
("system", SYSTEM_PROMPT),
("user", USER_PROMPT)
])
output_parser = StrOutputParser()
chain = prompt | llm | output_parser
print(chain.invoke({"input": question}))
Dies erzeugt die Antwort auf Grundlage der bereitgestellten Dokumente:
In Milvus werden Daten in zwei Formen gespeichert: eingefügte Daten und Metadaten.
Eingefügte Daten (Vektordaten, skalare Daten und sammlungsspezifisches Schema) werden im persistenten Speicher als inkrementelle Protokolle gespeichert. Milvus unterstützt mehrere Object-Storage-Backends, darunter MinIO, AWS S3, Google Cloud Storage (GCS), Azure Blob Storage, Alibaba Cloud OSS und Tencent Cloud Object Storage (COS).
Metadaten hingegen werden innerhalb von Milvus erzeugt und in etcd gespeichert, wobei jedes Milvus-Modul über eigene Metadaten verfügt.
Schritt 11: Multi-modale Abfragen
Für multi-modale Abfragen verwenden wir das Modell Llama-3.2-11b-vision:
multimodalllm = ChatOpenAI(
model="llama-3.2-11b-vision-instruct",
base_url="https://api.friendli.ai/serverless/beta",
api_key=os.environ["FRIENDLI_TOKEN"],
)
image_url = "https://milvus.io/docs/v2.4.x/assets/highly-decoupled-architecture.png"
message = HumanMessage(
content=[
{"type": "text", "text": "describe what is in this image"},
{"type": "image_url", "image_url": {"url": image_url}},
],
)
response = multimodalllm.invoke([message])
print(response.content)
Aus seiner Antwort können wir schließen, dass das Modell das Bild korrekt versteht:
Das Bild zeigt ein Flussdiagramm der Komponenten eines Systems mit den folgenden Komponenten:
**Coordinator Service**
* Root
* Query
…
Schritt 12: RAG- und Multi-Modal-Fähigkeiten kombinieren
Kombinieren wir abschließend die RAG- und Multi-Modal-Fähigkeiten:
question = "How is data stored in milvus with respect to this picture?"
USER_PROMPT = f"""
Use the following pieces of information enclosed in <context> tags to provide an answer to the question enclosed in <question> tags.
<context>
{context}
</context>
<question>
{question}
</question>
"""
message = HumanMessage(
content=[
{"type": "text", "text": USER_PROMPT},
{"type": "image_url", "image_url": {"url": image_url}},
],
)
response = multimodalllm.invoke([message])
print(response.content)
Das Modell generiert korrekt eine richtige Antwort auf Grundlage des Bildes und der Dokumente:
**Schritt 1: Identifizieren der Komponenten, die an der Speicherung von Daten in Milvus beteiligt sind.**
Zu den Komponenten, die an der Speicherung von Daten in Milvus beteiligt sind, gehören:
* Access Layer
* Message Storage
* Worker Node
**Schritt 2: Bestimmen, wie Daten in Milvus gespeichert werden.**
Daten werden in der Access Layer und im Message Storage gespeichert.
**Schritt 3: Bestimmen, wo Daten in Milvus gespeichert werden.**
Daten werden sowohl in der Access Layer als auch im Message Storage gespeichert.
**Antwort:** Daten werden sowohl in der Access Layer als auch im Message Storage gespeichert.
Den vollständigen Code und weitere Details findest du in diesem Colab notebook.
Fazit
Dieses Tutorial hat gezeigt, wie man Milvus und Friendli Serverless Endpoints nutzen kann, um fortgeschrittene RAG- und multimodale Abfragen zu implementieren. Durch die Kombination dieser leistungsstarken Technologien kannst du anspruchsvollere KI-Anwendungen erstellen, die unterschiedliche Arten von Informationen verstehen und verarbeiten können, was zu genaueren und kontextbewussteren Antworten führt.
Weiterlesen

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

The Great AI Agent Protocol Race: Function Calling vs. MCP vs. A2A
Compare Function Calling, MCP, and A2A protocols for AI agents. Learn which standard best fits your development needs and future-proof your applications.

VidTok: Rethinking Video Processing with Compact Tokenization
VidTok tokenizes videos to reduce redundancy while preserving spatial and temporal details for efficient processing.



