TechPilot
Tutorials

Python-Tutorial: Eigenen KI-Chatbot mit LangChain und lokalen Dokumenten bauen

Python-Tutorial: Eigenen KI-Chatbot mit LangChain und lokalen Dokumenten bauen

Warum einen eigenen KI-Chatbot mit lokalen Dokumenten?

Die Integration von künstlicher Intelligenz in eigene Anwendungen ist mittlerweile auch für einzelne Entwickler zugänglich geworden. Mit LangChain, einem leistungsstarken Python-Framework, lassen sich KI-Chatbots erstellen, die auf eigenen Dokumenten basieren. Das ist besonders nützlich für Unternehmenswissen, technische Dokumentationen oder spezifische Wissensdatenbanken, die nicht in öffentlichen Large Language Models enthalten sind.

In diesem linux-installation-ohne-dual-boot-2026" title="Kali Linux in 5 Minuten auf jedem PC installieren">Tutorial zeige ich dir, wie du einen funktionsfähigen Chatbot erstellst, der deine lokalen Dokumente durchsucht und intelligent beantwortet. Wir verwenden dabei moderne Technologien wie Embeddings, Vektordatenbanken und Retrieval-Augmented Generation (RAG).

Voraussetzungen und Installation

Bevor wir starten, benötigst du Python 3.8 oder höher. Erstelle zunächst ein neues Projektverzeichnis und eine virtuelle Umgebung:

Python code - Python-Tutorial: Eigenen KI-Chatbot mit LangChain und lokalen Dokumenten bauen
Foto: Matheus Bertelli / Pexels
mkdir chatbot-projekt cd chatbot-projekt python -m venv venv source venv/bin/activate # Windows: venv\Scripts\activate

Installiere nun die erforderlichen Paketen:

pip install langchain langchain-community langchain-openai pip install chromadb pypdf python-dotenv tiktoken

Für dieses Projekt verwenden wir ChromaDB als Vektordatenbank, da sie einfach zu handhaben ist und keine externe Infrastruktur benötigt. PyPDF ermöglicht das Einlesen von PDF-Dokumenten, und tiktoken hilft bei der Tokenisierung.

Projekt-Struktur und Konfiguration

Erstelle folgende Dateien in deinem Projektverzeichnis:

chatbot-projekt/ ├── .env ├── main.py ├── document_loader.py ├── chatbot.py └── documents/ # Ordner für deine Dokumente

In der .env-Datei speicherst du deinen OpenAI API-Schlüssel:

OPENAI_API_KEY=dein_api_schluessel_hier

Wenn du keine OpenAI API verwenden möchtest, kannst du alternativ auf Open-Source-Modelle wie Llama oder Mistral über Ollama zurückgreifen. Das würde den Chatbot vollständig lokal und kostenfrei machen.

Dokumente laden und verarbeiten

Der erste Schritt besteht darin, deine Dokumente zu laden und in kleinere Textabschnitte zu unterteilen. Erstelle die Datei document_loader.py:

Python code - Python-Tutorial: Eigenen KI-Chatbot mit LangChain und lokalen Dokumenten bauen
Foto: Matheus Bertelli / Pexels
from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader from langchain.text_splitter import RecursiveCharacterTextSplitter import os class DocumentProcessor: def __init__(self, documents_path="./documents"): self.documents_path = documents_path self.text_splitter = RecursiveCharacterTextSplitter( chunk_size=1000, chunk_overlap=200, length_function=len ) def load_documents(self): loader = DirectoryLoader( self.documents_path, glob="**/*.pdf", loader_cls=PyPDFLoader ) documents = loader.load() return self.text_splitter.split_documents(documents) def get_document_count(self): pdf_files = [f for f in os.listdir(self.documents_path) if f.endswith('.pdf')] return len(pdf_files)

Die Klasse DocumentProcessor lädt alle PDF-Dateien aus dem Dokumentenordner und teilt sie in Chunks von 1000 Zeichen auf. Die Überlappung von 200 Zeichen stellt sicher, dass zusammenhängende Informationen nicht getrennt werden.

Vektordatenbank und Embeddings erstellen

Nun erstellen wir die eigentliche Chatbot-Logik in chatbot.py. Hier implementieren wir die Vektordatenbank und das Retrieval-System:

from langchain_openai import OpenAIEmbeddings, ChatOpenAI from langchain_community.vectorstores import Chroma from langchain.chains import ConversationalRetrievalChain from langchain.memory import ConversationBufferMemory import os from dotenv import load_dotenv load_dotenv() class DocumentChatbot: def __init__(self, documents): self.embeddings = OpenAIEmbeddings() self.vectorstore = Chroma.from_documents( documents=documents, embedding=self.embeddings, persist_directory="./chroma_db" ) self.memory = ConversationBufferMemory( memory_key="chat_history", return_messages=True, output_key="answer" ) self.llm = ChatOpenAI( temperature=0.7, model_name="gpt-3.5-turbo" ) self.qa_chain = ConversationalRetrievalChain.from_llm( llm=self.llm, retriever=self.vectorstore.as_retriever(search_kwargs={"k": 3}), memory=self.memory, return_source_documents=True ) def ask(self, question): result = self.qa_chain({"question": question}) return result["answer"], result["source_documents"]

Diese Implementierung erstellt Embeddings für alle Dokumenten-Chunks und speichert sie in ChromaDB. Das ConversationalRetrievalChain-Objekt kombiniert Retrieval und Sprachmodell, während die Memory-Komponente den Gesprächsverlauf speichert.

Hauptanwendung zusammenführen

Jetzt fügen wir alles in der main.py zusammen:

from document_loader import DocumentProcessor from chatbot import DocumentChatbot import sys def main(): print("Initialisiere Chatbot...") # Dokumente laden processor = DocumentProcessor() doc_count = processor.get_document_count() print(f"Gefundene Dokumente: {doc_count}") if doc_count == 0: print("Keine Dokumente gefunden. Bitte PDF-Dateien in ./documents ablegen.") return documents = processor.load_documents() print(f"Dokumente in {len(documents)} Chunks aufgeteilt") # Chatbot initialisieren chatbot = DocumentChatbot(documents) print("Chatbot bereit!\n") # Chat-Schleife while True: question = input("Du: ") if question.lower() in ['exit', 'quit', 'bye']: print("Auf Wiedersehen!") break answer, sources = chatbot.ask(question) print(f"\nBot: {answer}\n") if sources: print("Quellen:") for i, doc in enumerate(sources[:2], 1): print(f"{i}. Seite {doc.metadata.get('page', 'N/A')}") print() if __name__ == "__main__": main()

Den Chatbot testen und erweitern

Lege nun einige PDF-Dokumente in den documents-Ordner und starte den Chatbot:

python main.py

Der Chatbot wird die Dokumente einlesen, verarbeiten und ist dann bereit für Fragen. Er antwortet basierend auf dem Inhalt deiner Dokumente und gibt sogar die Quellen an.

Mögliche Erweiterungen:

  • Unterstützung für weitere Dateiformate (TXT, DOCX, Markdown)
  • Web-Interface mit Streamlit oder Flask
  • Verwendung lokaler Modelle über Ollama für vollständige Offline-Funktionalität
  • Optimierung der Chunk-Größe für spezifische Dokumenttypen
  • Implementierung von Metadaten-Filtern für gezielteres Retrieval

Performance-Optimierung und Best Practices

Für produktive Anwendungen solltest du folgende Aspekte beachten: Die initiale Verarbeitung großer Dokumentensammlungen kann zeitintensiv sein. Speichere die Vektordatenbank persistent und lade sie bei Bedarf neu, statt sie jedes Mal neu zu erstellen. Die Chunk-Größe beeinflusst die Antwortqualität erheblich – experimentiere mit verschiedenen Werten zwischen 500 und 2000 Zeichen.

Bei sensiblen Daten empfiehlt sich der Einsatz lokaler Modelle. Ollama bietet eine einfache Möglichkeit, Modelle wie Llama 2 oder Mistral lokal auszuführen. Dafür musst du lediglich die LLM-Komponente anpassen und statt OpenAI die Ollama-Integration von LangChain verwenden.

Tipp: Verwende für große Dokumentensammlungen produktionsreife Vektordatenbanken wie Pinecone, Weaviate oder Qdrant, die bessere Skalierbarkeit bieten.

Fehlerbehandlung und Troubleshooting

Häufige Probleme und Lösungen: Wenn der Import fehlschlägt, überprüfe die Installation aller Pakete. Bei API-Fehlern stelle sicher, dass dein OpenAI-Schlüssel gültig ist und ausreichend Credits verfügbar sind. Falls die Antworten ungenau sind, experimentiere mit der Anzahl der abgerufenen Dokumente (Parameter k im Retriever) und passe die Chunk-Größe an.

Mit diesem Tutorial hast du einen funktionsfähigen KI-Chatbot erstellt, der deine eigenen Dokumente intelligent durchsuchen und beantworten kann. Das Grundgerüst lässt sich beliebig erweitern und an spezifische Anforderungen anpassen.