Überspringen und zum Inhalt gehen →

Win funktionieren LangChain Document Embeddings

LangChain ist ein Open Source Python (und wohl auch JavaScript) Framework, das die Erstellung von Anwendungen mit großen Sprachmodellen (LLMs) vereinfachen soll.

https://python.langchain.com/

Möchte man z.B. einen RAG (Retrieval-Augmented Generation) Anwendung mit einem Huggingface Model erstellen, kann einem die LangChain Bibliothek eine Menge Arbeit abnehmen.

Neo4j Vektor Index erstellen und verwenden

Neo4j ist eine Open-Source-Graph Datenbank mit integrierter Unterstützung für Vector-Similarity-Search. Damit ist es möglich, in einer Vektor Datenbank nach Vektoren (Embedding) zu suchen, die dem Suchvektor am ähnlichsten sind.

Verfügt man uber einen Index mit sehr vielen Embeddings kann man z.B. den Prompt in ein Embedding-Vektor umwandeln und die Relevanten Texte aus dem Vektor-Index selektieren und einem LLM als Kontext mitgeben. Details dazu habe ich schon einem hier behandelt.

Eine einfache Neo4J Implementierung könnte z.B. wie folgt aussehen:

from langchain.docstore.document import Document
from langchain.document_loaders import TextLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Neo4jVector

loader = TextLoader("state_of_the_union.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
docs = text_splitter.split_documents(documents)

url = "bolt://localhost:7687"
username = "neo4j"
password = "password"

model_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': False}
embeddings = HuggingFaceEmbeddings(
    model_name=model_name,
    model_kwargs=model_kwargs,
    encode_kwargs=encode_kwargs
)

index_name = "state_of_the_union"
db = Neo4jVector.from_documents(
    docs,
    embeddings,
    url=url,
    username=username,
    password=password,
    index_name=index_name
)
query = "What did the president say about Ketanji Brown Jackson"
docs_with_score = db.similarity_search_with_score(query, k=2)

for doc, score in docs_with_score:

    print("Score: ", score)
    print(doc.page_content)

Beispiel basiert auf https://python.langchain.com/docs/integrations/vectorstores/neo4jvector

Das Skript lädt die Datei state_of_the_union.txt mit dem TextLoader, schneidet die Datei mit dem CharacterTextSplitter in kleine Stücke, erzeugt mit HuggingFaceEmbeddings die Embedding-Vektoren, schreibt alles mit dem Neo4jVector in eine Neo4J Datenbank und kann mit dem Neo4jVector auch die Similarity-Search Funktion ausführen. Alle verwendeten Komponenten kommen aus der LangChain Bibliothek.

from langchain.docstore.document import Document
from langchain.document_loaders import TextLoader
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Neo4jVector

Dabei ist LangChain in den meisten Fällen nur ein Wrapper, der die darunterliegende Komplexität verbirgt und dem Entwickler eine abstrahierte Schnittstelle bietet, um bestimmte Funktionen oder Operationen einfacher und effizienter zu nutzen.

So muss man sich z.B. nicht mit der Abfragesprache TODO von Neo4J befassen und auch keine detailliertes Wissen über Huggingface haben und kann die Funktionen trotzdem nutzen.

Das Similarity-Search Ergebnis zu der Query „What did the president say about Ketanji Brown Jackson“ in dem Dokument state_of_the_union.txt sieht dann wie folgt aus:

Score:  0.6991977691650391
Tonight. I call on the Senate to: Pass the Freedom to Vote Act. Pass the John Lewis Voting Rights Act. And while you’re at it, pass the Disclose Act so Americans can know who is funding
 our elections. 
Tonight, I’d like to honor someone who has dedicated his life to serve this country: Justice Stephen Breyer—an Army veteran, Constitutional scholar, and retiring Justice of the United S
tates Supreme Court. Justice Breyer, thank you for your service. 
One of the most serious constitutional responsibilities a President has is nominating someone to serve on the United States Supreme Court. 
And I did that 4 days ago, when I nominated Circuit Court of Appeals Judge Ketanji Brown Jackson. One of our nation’s top legal minds, who will continue Justice Breyer’s legacy of excel
lence.


Score:  0.6261880397796631
As Frances Haugen, who is here with us tonight, has shown, we must hold social media platforms accountable for the national experiment they’re conducting on our children for profit. 
It’s time to strengthen privacy protections, ban targeted advertising to children, demand tech companies stop collecting personal data on our children. 
And let’s get all Americans the mental health services they need. More people they can turn to for help, and full parity between physical and mental health care. 
Third, support our veterans. 
Veterans are the best of us. 
I’ve always believed that we have a sacred obligation to equip all those we send to war and care for them and their families when they come home. 
My administration is providing assistance with job training and housing, and now helping lower-income veterans get VA care debt-free.  
Our troops in Iraq and Afghanistan faced many dangers.

Alles ist aus einem Guss und greift perfekt ineinander.

Ähnliche Loader gibt es auch für JSON, JSONL, CSV, HTML, Markdown und PDF-Dateien. Details dazu kann man hier nachlesen. Auch zum Neo4J Vektor-Store gibt es alternativen wie z.B. ChromaDB, LanceDB, FAISS und Pinecone. Das gleiche gilt auch für die Embeddings. Neben den HuggingFaceEmbeddings gibt es noch viele mehr unter https://python.langchain.com/docs/integrations/text_embedding zu entdecken.

Veröffentlicht in Allgemein