RAG-Apps ohne OpenAI erstellen – Teil Eins
OpenAI ist das am häufigsten bekannte Large Language Model (LLM). Aber es ist nicht das einzige LLM. Wenn Sie diesen Blog regelmäßig lesen, wissen Sie bereits, dass wir viele RAG-artige Anwendungen mit LangChain, Milvus und OpenAI entwickelt haben. In diesem Projekt setzen wir Nebula (Klicken Sie auf die Nebula-Website, um einen API-Schlüssel anzufordern) als Ersatz für OpenAI ein, und wir verwenden ein Embedding-Modell von Hugging Face anstelle der OpenAI-Embeddings.
In diesem Beitrag behandeln wir:
Conversational-RAG-Tech-Stack
LangChain
Symbl AI
Milvus
Hugging Face
Wie man eine einfache Conversational-RAG-App erstellt
Richten Sie Ihren Conversational-RAG-Stack ein
Erstellen Sie Ihre Konversation
Stellen Sie Fragen
Zusammenfassung zum Erstellen eines Conversational RAG ohne OpenAI
Conversational-RAG-Tech-Stack
Conversational RAG ist die häufigste Form von RAG. Daran denken wir, wenn wir an RAG-Chatbots denken. Letztes Jahr haben wir besprochen, wie CVP (ChatGPT-ähnliches LLM + Vektordatenbank + Prompt as code) der kanonische Stack für RAG ist. In diesem Stack fügen wir ein weiteres Modell hinzu – ein separates Embedding-Modell von Hugging Face. Dieser Stack verwendet LangChain für die Prompt-Orchestrierung, Symbl AI zur Bereitstellung des LLM, Milvus als Vektordatenbank und Hugging Face als unser Embedding-Modell.
LangChain
Falls Sie es noch nicht gehört haben, hören Sie es jetzt: LangChain ist das beliebteste Framework zur Orchestrierung von LLM-Apps. Dieses Tutorial ist eine Adaption eines Projekts, das wir mit Conversational Memory mit LangChain und OpenAI durchgeführt haben. Diesmal führen wir dasselbe Projekt ohne OpenAI-Embeddings oder GPT durch.
Symbl AI
Symbl AI hat ein Conversational LLM erstellt, das mit Konversationsdaten trainiert wurde. Ihr LLM heißt Nebula und verfügt über eine LangChain-Integration. In diesem Tutorial ersetzen wir OpenAIs GPT-3.5, das wir zuvor verwendet haben, durch Nebula.
Milvus
Der strahlende Star unseres Beitrags zu Conversational Memory ist eine Vektordatenbank. Wie besprochen, sind Vektordatenbanken dafür ausgelegt, mit unstrukturierten Daten zu arbeiten, sobald diese in Vektoren umgewandelt wurden. Wir verwenden Milvus als Speicher für den Conversational-Memory-Teil dieses Projekts.
Hugging Face
Hugging Face ist der weltweit größte Model Hub. Es lässt sich außerdem direkt in LangChain integrieren. Wir verwenden ein Embedding-Modell von Hugging Face anstelle der OpenAI-Embeddings, die wir in unserem letzten Projekt verwendet haben.
Wie man eine einfache Conversational-RAG-App erstellt
Da wir nun den Technologie-Stack kennen:
Es gibt ein wenig Einrichtung zu erledigen.
Wir definieren eine Beispielkonversation, auf der die App RAG ausführen soll.
Wir schließen ab, indem wir eine Beispielfrage stellen.
Richten Sie Ihren Conversational-RAG-Stack ein
Richten wir unseren Conversational-RAG-Stack ein. Wir müssen sechs Bibliotheken installieren: LangChain, Milvus (Lite), PyMilvus, python-dotenv und Sentence Transformers. Im ersten Abschnitt importieren wir einige der wesentlichen Bestandteile aus LangChain – die Objekte Vector Store Retriever Memory, Conversation Chain und Prompt Template. Wir verwenden diese Bestandteile, um unser Beispiel für Conversational Memory zu erstellen.
Zwei der anderen Importe sind `os` und `load_dotenv`. Wir verwenden diese, um unsere Umgebungsvariablen zu laden. Wenn Sie sich an andere Tutorials erinnern, die wir gemacht haben, laden wir normalerweise unseren OpenAI-API-Schlüssel; diesmal laden wir den Nebula-API-Schlüssel.
! pip install langchain milvus pymilvus python-dotenv sentence_transformers
from langchain.memory import VectorStoreRetrieverMemory
from langchain.chains import ConversationChain
from langchain.prompts import PromptTemplate
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv("NEBULA_KEY")
Als Nächstes beginnen wir mit unserer Vektordatenbank und unserem Embedding-Modell. Wir importieren den `default_server` aus Milvus Lite und starten ihn für unsere Vektordatenbank. Als Nächstes importieren wir die Hugging Face Embeddings aus LangChain und verwenden sie als unsere Embedding-Funktion. Das Standardmodell ist `all-mpnet-base-v2`, das eine Dimensionalität von 768 hat.
from milvus import default_server
default_server.start()
from langchain_community.embeddings import HuggingFaceEmbeddings
# is this model by default: sentence-transformers/all-mpnet-base-v2
embeddings = HuggingFaceEmbeddings()
Der folgende Abschnitt ist eher ein „Aufräum“-Abschnitt. Er ist irrelevant, wenn du LangChain mit Milvus noch nicht verwendet hast. Hier stellen wir eine Verbindung zu Milvus her und löschen die bestehende LangChain-Collection, um Data Poisoning zu vermeiden.
from pymilvus import utility, connections
connections.connect(host="127.0.0.1", port=default_server.listen_port)
utility.drop_collection('LangChainCollection')
Erstelle deine Konversation
Jetzt ist es an der Zeit, unsere Konversation zu erstellen und zu speichern.
Wir beginnen damit, ein Milvus-Vektorspeicher-Collection-Objekt aus LangChain zu importieren und es mit einer leeren Menge von Dokumenten zu starten. Außerdem übergeben wir ihm die zuvor erstellte Hugging Face Embeddings-Funktion. Für die Verbindungsargumente übergeben wir den Host und Port unserer Milvus Lite-Instanz. Der letzte Parameter für dieses Objekt, den wir diesmal verwenden, ist `consistency_level`, der das Datenkonsistenzniveau festlegt, in diesem Fall „Strong“, das höchste verfügbare Niveau der Datenkonsistenz.
from langchain.vectorstores import Milvus
vectordb = Milvus.from_documents(
{},
embeddings,
connection_args={"host": "127.0.0.1", "port": default_server.listen_port},
consistency_level="Strong")
Als Nächstes richten wir mit LangChain einen Vektorspeicher-Retriever ein, indem wir die Milvus-Collection und Suchargumente übergeben. Für diese Suche möchten wir nur das oberste Ergebnis zurückerhalten. Dann übergeben wir diesen Retriever an ein Memory-Objekt, das wir mit LLMs als Teil des LangChain RAG-Stacks verwenden können.
Wir benötigen außerdem eine Startkonversation. Im echten Leben ist diese Konversation wie ein Kundendienstanruf. In diesem Beispiel gebe ich einige Informationen über mich selbst. Du solltest ihm einige Informationen über dich selbst geben. Nachdem eine Beispielkonversation erstellt wurde, müssen wir diese als Kontext in unserem Memory speichern.
Beim Speichern von Kontext übergeben wir unserem Memory-Objekt zwei Dictionaries. Für dieses Beispiel übergeben wir die Beispieleingabe und -ausgabe jeweils als „input“ und „output“. Wenn du damit herumspielen möchtest, kannst du für die Schlüssel und Werte der Funktion `save_context` alles übergeben, was du möchtest.
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": "I also love Taylor Swift"}
]
for example in about_me:
memory.save_context({"input": example["input"]}, {"output": example["output"]})
Fragen stellen
Jetzt ist alles bereit, damit wir unserer konversationellen RAG-App Fragen stellen können. In diesem Fall verfügt sie über eine Vektordatenbank mit der Erinnerung an unsere bisherige Konversation, ein Embedding-Modell von Hugging Face und ein Nicht-OpenAI-LLM, Nebula. Bevor wir Fragen stellen, lass uns kurz überprüfen, ob die App sich an unsere Konversation erinnert.
Bitten wir es, uns zu zeigen, ob es sich an etwas aus der vorgeladenen Unterhaltung erinnert. In diesem Beispiel frage ich, wer mein Lieblingsmusiker (Taylor Swift) ist. Was passiert hier im Hintergrund? Das Memory-Objekt verwendet das bereitgestellte Embedding-Modell, um den Prompt zu vektorisieren und den Verlauf zu durchsuchen.
print(memory.load_memory_variables({"prompt": "who is my favorite musician?"})["history"])
Wir sollten eine Ausgabe wie im folgenden Beispiel erhalten.
Jetzt erstellen wir eine Prompt-Vorlage, um die Conversation Chain zu speisen. Dies ist der Teil, in dem wir ein LLM benötigen. Alles, was wir hier dafür tun, ist, Nebula zu importieren und ihm den API-Schlüssel zu übergeben. Wir können den Prompt wie einen mehrzeiligen String behandeln und die geschweifte-Klammern-Notation verwenden, um Variablen zu übergeben, wie wir es bei f-Strings tun.
Anschließend übergeben wir diesen String und die Variablennamen an ein LangChain-Prompt-Template-Objekt. Mit der Prompt-Vorlage, dem LLM und dem Memory können wir unsere „Konversation“ mithilfe eines Conversation-Chain-Objekts erstellen.
from langchain_community.llms.symblai_nebula import Nebula
llm = Nebula(nebula_api_key=api_key)
_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
)
Stellen wir die erste Frage. Wir fragen das LLM einfach, was los ist.
conversation_with_summary.predict(input="Hi Nebula, what's up?")
Du solltest eine Antwort wie die unten sehen. Mit der Kombination aus den Trainingsdaten für Nebula und den Beispieldaten, die wir gegeben haben, können wir sehen, dass das LLM erwartet, dass wir, „Human“, als Nächstes etwas sagen.
Fragen wir für unsere nächsten Fragen, ob es meinen Lieblingsmusiker kennt. Denke daran, dass wir dem LLM zuvor gesagt haben, dass mein Lieblingsmusiker Taylor Swift ist, und wir diese Information im Memory gespeichert haben.
conversation_with_summary.predict(input="Who did I say was my favorite musician?")
Du kannst erwarten, eine Antwort wie die unten zu sehen. Wir haben gerade eine konversationelle RAG-App ohne GPT erstellt.
Zusammenfassung zum Aufbau einer konversationellen RAG-App ohne OpenAI
Dieser Beitrag ist der erste Teil einer Tutorial-Reihe zum Aufbau von RAG-Apps ohne OpenAI. In diesem Tutorial haben wir uns Nebula angesehen, ein konversationelles LLM, das von Symbl AI erstellt wurde. Wir haben Milvus als unsere Vektordatenbank, MPNet V2 von Hugging Face als unser Embedding-Modell und LangChain verwendet, um alles zu orchestrieren.
Für dieses Beispiel haben wir eine konversationelle RAG-App erstellt. Wir haben unsere App eingerichtet, indem wir Milvus als unsere Vektordatenbank gestartet und unser Embedding-Modell von Hugging Face bezogen haben. Dann verwenden wir LangChain, um Milvus als unseren Memory Store mit MPNet V2 als unserem Embedding-Modell für unser Memory zu nutzen.
Nachdem die vorherigen Schritte bereit sind, erstellen wir eine Konversation, um Daten zu haben, mit denen wir arbeiten können. Wir laden die Konversation ins Memory und prüfen schnell, ob die Daten vorhanden sind. Als Nächstes bereiten wir unseren Prompt und das LLM vor. Dann laden wir all diese Daten in ein Conversation-Chain-Objekt, damit wir Fragen stellen können.
Zum Abschluss dieses Beispiels stellen wir der konversationellen RAG-App zwei Fragen. „Was gibt’s?“ und „Wer ist mein Lieblingsmusiker?“ Bleib dran, während wir diese Reihe weiter ausbauen!
Eine Zusammenfassung dieser Implementierung findest du im Blog, der von Symbl.ai veröffentlicht wurde.
Weiterlesen

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.
Stop Building AI Data Infra for the Wrong Stage
Learn how AI data infrastructure should evolve from prototype to enterprise scale, and when Vector Lakebase becomes the right architecture for AI apps.

Zilliz Cloud Delivers Better Performance and Lower Costs with Arm Neoverse-based AWS Graviton
Zilliz Cloud adopts Arm-based AWS Graviton3 CPUs to cut costs, speed up AI vector search, and power billion-scale RAG and semantic search workloads.



