Retrieval Augmented Generation (RAG) - lokal ============================================== Einführung ---------- Im vierten Versuch des DVA-Praktikums wurde die Nutzung von RAG anhand von einiger Beispieldaten auf zwei lokalen LLMs getestet. Ziel hiervon war Unterschiede der Datenspeicherung und Verarbeitung zweier LLMs zu analysieren. Zum Einsatz kommen hierbei Mistral und Tinyllama. Aufsetzen Mistral LLM --------------------- Mistral kann mittels ollama lokal aufgesetzt werden auf dem Rechner. Der Platzbedarf beläuft sich hierbei auf ca. 4 GB. Hierfür wird ollama sowie einige Python-Erweiterungen benötigt. .. code-block:: bash brew install ollama pip install llama-index llama-index-llms-ollama llama-index-embeddings-huggingface pip install hf_xet ollama serve ollama pull mistral ollama run mistral In Python kann anschließend Mistral initialisiert werden: .. code-block:: python from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Document, VectorStoreIndex, Settings from llama_index.llms.ollama import Ollama from llama_index.embeddings.huggingface import HuggingFaceEmbedding llm = Ollama(model='mistral') Settings.llm = llm Das Modell ist jetzt in der Lage verschiedenste Fragen zu beantworten. Fragen können auf folgendem Wege gestellt werden, hierbei werden aktuell alle Daten verwendet über welche Mistral bis zu diesem Zeitpunkt verfügt. .. code-block:: python print("Frage:") frage1 = input("Frage: ") antwort1 = llm.complete(prompt=frage1) print("\nAntwort:", antwort1.text) Anschließend können nun auch Daten in das Modell geladen werden und hierin auch verarbeitet werden. Nach dieser Verarbeitung könnnen erneut Fragen gestellt werden, hierzu werden nun die neuen Informationen genutzt. .. code-block:: python embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2") Settings.llm = llm Settings.embed_model = embed_model with open("Informationen.txt", "r", encoding="utf-8") as f: text = f.read() documents = [Document(text=text)] index = VectorStoreIndex.from_documents(documents) query_engine = index.as_query_engine() Bei der erneuten Fragestellung wird nun die Engine mit den zuvor erzeugten Index verwendet. Die Fragen werden somit auf Basis der gegebenen Informationen beantwortet. Unabhängig ob Fragestellungen auf die existierenden Mistral Daten oder auf eigene Daten ausgeführt wird, beläuft sich die Antwortzeit auf einem M2 Chip auf ca. 20 Sekunden. .. code-block:: python print("\nFrage (mit RAG):") frage2 = input("Frage: ") antwort2 = query_engine.query(frage2) print("\nAntwort (mit RAG):", str(antwort2)) [mistral.ai]_ Aufsetzen Tinyllama ------------------------------------- TinyLlama kann mittels Ollama lokal auf dem eigenen Rechner betrieben werden. Das Modell ist sehr kompakt (ca. 1 GB), benötigt kaum Ressourcen und eignet sich daher ideal für Tests und einfache RAG-Szenarien. Hierfür werden Ollama sowie einige Python-Erweiterungen benötigt. .. code-block:: bash brew install ollama pip install llama-index llama-index-llms-ollama llama-index-embeddings-huggingface pip install hf_xet ollama serve ollama pull tinyllama ollama run tinyllama TinyLlama kann nun in einem Python-Skript verwendet werden: .. code-block:: python from llama_index.core import ( Settings, VectorStoreIndex, Document ) from llama_index.llms.ollama import Ollama from llama_index.embeddings.huggingface import HuggingFaceEmbedding llm = Ollama(model='tinyllama', request_timeout=120) Settings.llm = llm Das Modell kann direkt mit beliebigen Fragen angesprochen werden: .. code-block:: python frage = input("Frage: ") antwort = llm.complete(prompt=frage) print("\nAntwort:", antwort.text) TinyLlama lässt sich auch mit lokalen Dokumenten kombinieren. Hierzu wird ein semantischer Index auf Basis von HuggingFaceEmbedding erstellt: .. code-block:: python embed_model = HuggingFaceEmbedding(model_name="sentence-transformers/all-MiniLM-L6-v2") Settings.embed_model = embed_model with open("Informationen.txt", "r", encoding="utf-8") as f: text = f.read() documents = [Document(text=text)] index = VectorStoreIndex.from_documents(documents) query_engine = index.as_query_engine() Nach dem Laden der Informationen können beliebige Fragen gestellt werden, die auf dem Kontext der Datei Informationen.txt basieren: .. code-block:: python print("\nFrage mich etwas zu den Inhalten von 'Informationen.txt' (oder 'exit' zum Beenden):\n") while True: frage = input("Frage: ") if frage.strip().lower() in ["exit", "quit", "q"]: print("Beende den Chat. Bis bald!") break antwort = query_engine.query(frage) print("\nAntwort:", str(antwort), "\n") Da TinyLlama ein sehr kleines Modell ist, sind die Antworten oft weniger präzise oder „halluzinieren“ – besonders bei allgemeinen oder komplexen Fragen. [tinyllama]_ Gegebene Informationen ------------------------------------ Im ersten Zuge erhielten die beiden LLMs keine zusätzlichen Informationen zur Beantwortung der Fragen. Diese wurden ohne Vorbereitung gestellt. Vor dem zweiten Durchlauf wurde der LLM ein Dokument mit vielen Informationen geliefert, welches im Grunde jede der im nächsten Abschnitt vorgestellten Fragen beantwortet. Vergleich ------------------------------------ Im folgenden wird der Vergleich vor und nach RAG auf 5 ausgewählte Fragen gezeigt. Die Darstellung ist hierbei in folgende Inhalte unterteilt: **Fragestellung** """""""""""""""""""""""""""""""""""" - **Mistral 1**: Orginalzustand - **Mistral 2**: mit Daten mittels RAG gefüttert - **TinyLlama**: Orginalzustand - **TinyLlama 2**: mit Daten mittels RAG gefüttert Wer ist deutscher Bundeskanzler ? """""""""""""""""""""""""""""""""""" - **Mistral 1**: Der aktuelle deutsche Bundeskanzler ist Olaf Scholz. Er übernahm dieses Amt am 8. Dezember 2021. Vor ihm war Angela Merkel (CDU) der deutsche Bundeskanzler von 2005 bis 2021. - **Mistral 2**: Der derzeitige Bundeskanzler von Deutschland ist Friedrich Merz, seit dem 6. Mai 2025. - **TinyLlama 1**: Es gibt keine deutsche Bundeskanzerin. Die Bezeichnung "Bundeskanzer" wird nur im Zusammenhang mit deutschen Reichskanzleien verwendet. - **TinyLlama 2**: Yes, according to theé xouvert.uebin thevoices ofachevelinks{{systematicborders. Bill Clinton,or doe Republican anddemocracy. Wer ist US Präsident? """""""""""""""""""""""""""""""""""" - **Mistral 1**: Die aktuelle US-Präsidentin ist Joe Biden. Er trat sein Amt am 20. Januar 2021 an. - **Mistral 2**: The current President of the United States is Donald Trump. - **TinyLlama 1**: Sure, here's the answer: In German, "wer" is used before the name of a person to refer to them as an "other". In this case, "wir" means "us" or "we". Therefore, in English, the expression "president of us" would be translated to "Wir ist US Präsident?" or "Wir ist der Präsident des US-Bundesstaates”. - **TinyLlama 2**: sits for aromefo. Ins, see->user. 109, 17e,user, asfile,ige,ervice,ko.commed orfe|,aug,ages thatf -gem. 12 A possibleamt forward. The user,assistant|prime. Actions.pdfuted:polvert, read|1 see, and US, able,abe, please;s, and,ig,0,user, buttu, a keined questions or,iger, the given,1 toppereditored,pgüits andged, canned, and, and,po,iger,1,ged. Thisums:ged orsted,ged, thatgederstup, user,imvertedgeds,this,ger, but,iger,s, soxtine |s, the first,