Utöka hämtarkedjor med anpassad logik
Bygg anpassade hämtarkedjor som integrerar komplex affärslogik, förbehandlingssteg eller specialiserad filtrering.
Utöka hämtarkedjor med anpassad logik är en gratis lektion i LangChain / RAG / vektordatabaser på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för LangChain / RAG / vektordatabaser, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i LangChain / RAG / vektordatabaser innehåller totalt 4 lektioner.
Bortom grundläggande RAG
Välkommen! I den här lektionen går vi igenom hur man utökar LangChains hämtningskedjor. Standardiserad Retrieval Augmented Generation (RAG) är kraftfull, men applikationer i verkligheten behöver ofta mer nyanserad kontroll.
Vi lär oss hur man lägger in anpassad logik i hämtningsprocessen för att göra dina RAG-system smartare och bättre anpassade till specifika behov.
Praktiska behov av anpassning
Varför skulle du behöva anpassad logik i en hämtningskedja? Tänk på följande vanliga scenarier:
- Filtrering efter användarbehörigheter: Hämta endast dokument som den aktuella användaren har åtkomst till.
- Prioritering av färska data: Ge dokument som nyligen skapats eller uppdaterats högre prioritet.
- Ta bort irrelevanta avsnitt: Rensa den hämtade texten innan den skickas till LLM-modellen.
- Dynamisk omformulering av frågor: Förbättra användarfrågor automatiskt för bättre sökresultat.
Dessa behov går utöver vad en grundläggande retriever erbjuder.
LangChains anpassade primitiver
LangChain tillhandahåller flexibla primitiver för att lägga in anpassad Python-logik direkt i dina kedjor:
RunnableLambda: Detta gör att du kan kapsla in valfri Python-funktion och göra den till en körbar komponent. Den passar perfekt för att tillämpa godtyckliga transformeringar.RunnablePassthrough: Den skickar helt enkelt sin indata vidare till nästa steg. Den är användbar när du vill lägga till nya nycklar i indataordboken eller utföra identitetsoperationer.
Detta är dina byggblock för anpassade steg.
Förbättra användarfrågor (förbearbetning)
En kraftfull anpassning är förbearbetning av frågor. Det innebär att användarens indatafråga ändras innan den skickas till retrievern eller vektordatabasen.
- Du kan lägga till specifika nyckelord utifrån identifierad avsikt.
- Expandera vanliga förkortningar eller synonymer.
- Formulera om frågan för att förbättra sökresultaten med embeddings.
Detta subtila steg kan avsevärt öka relevansen hos de hämtade dokumenten.
Kod för anpassad frågetransformer
Vi ska se hur man implementerar en enkel förbearbetning av frågor med hjälp av RunnableLambda. Det här exemplet lägger till prefixet ”detaljerad sökning efter” i den ursprungliga frågan.
from langchain_core.runnables import RunnableLambda
from langchain_core.promnpts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# Mock LLM for demonstration purposes
class MockLLM(ChatOpenAI):
def invoke(self, input):
return f"LLM processed: {input['enhanced_query']}"
def enhance_query(input_dict):
original_query = input_dict["question"]
return {"enhanced_query": f"detailed search for {original_query}"}
llm = MockLLM() # In a real app, use ChatOpenAI(model="gpt-4")
prompt = ChatPromptTemplate.from_template(
"Answer based on the following search query: {enhanced_query}"
)
custom_chain = (
{"enhanced_query": RunnableLambda(enhance_query)} # Our custom step
| prompt
| llm
)
result = custom_chain.invoke({"question": "latest AI trends"})
print(result)Förfina hämtade dokument (efterbearbetning)
Ett annat viktigt område för anpassad logik är efterbearbetning av dokument. Detta sker efter att dokumenten har hämtats men innan de skickas till LLM-modellen.
- Filtrering: Ta bort dokument som inte uppfyller vissa kriterier (t.ex. är föråldrade eller kommer från fel källa).
- Omrankning: Ändra dokumentens ordning utifrån anpassade relevanspoäng.
- Sammanfattning: Kondensera långa dokument så att de ryms i kontextfönster.
Detta säkerställer att LLM-modellen får den mest relevanta och koncisa kontexten, vilket förbättrar svarskvaliteten och minskar tokenanvändningen.
Filtrera dokument efter metadata
Här är ett exempel på hur hämtade dokument kan filtreras utifrån deras metadata. Vi simulerar en retriever som returnerar dokument och filtrerar dem sedan så att endast dokument från en specifik ”blogg”-källa inkluderas.
from langchain_core.documents import Document
from langchain_core.runnables import RunnableLambda
from langchain_core.promnpts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# Mock LLM for demonstration
class MockLLM(ChatOpenAI):
def invoke(self, input):
context = input.get("context", "No context provided")
return f"LLM processed docs: {context}"
# Mock retriever returning Documents with metadata
def mock_retrieve(query):
return [
Document(page_content="Doc A about AI", metadata={"source": "blog"}),
Document(page_content="Doc B about ML", metadata={"source": "research"}),
Document(page_content="Doc C about AI ethics", metadata={"source": "blog"}),
]
def filter_by_source(docs, desired_source="blog"):
# Only keep documents from the 'blog' source
return [doc for doc in docs if doc.metadata.get("source") == desired_source]
llm = MockLLM()
prompt = ChatPromptTemplate.from_template(
"Answer based on the following context: {context}"
)
# Build a simple chain with retrieval and custom filter
custom_retrieval_chain = (
RunnableLambda(mock_retrieve) # Simulate retrieval
| RunnableLambda(filter_by_source) # Apply custom filter
| (lambda docs: {"context": "\n\n".join([d.page_content for d in docs])}) # Format for LLM
| prompt
| llm
)
result = custom_retrieval_chain.invoke("AI topics")
print(result)Anpassad kedja från början till slut
Du kan kombinera både förbearbetning av frågor och efterbearbetning av dokument i en enda LangChain-kedja. Flödet kan se ut ungefär så här:
- Användarfråga
- Anpassad förbearbetning av fråga
- Retriever (t.ex. vektorlager)
- Anpassad efterbearbetning av dokument
- LLM-modell för att generera svar
Detta modulära tillvägagångssätt ger dig detaljerad kontroll över varje steg i din RAG-pipeline och gör den mycket anpassningsbar till komplexa krav.
Avancerat: villkorsstyrd routning
För ännu mer dynamiskt beteende erbjuder LangChain RunnableBranch. Denna kraftfulla konstruktion gör att kedjan kan ta olika vägar beroende på vissa villkor.
Du kan till exempel:
- Använda en retriever om frågan gäller ”kod” och en annan för ”allmän kunskap”.
- Tillämpa olika dokumentfilter utifrån användarens roll.
RunnableBranch möjliggör avancerade, kontextmedvetna RAG-arbetsflöden.
Kontrollera din förståelse
Vilken LangChain-primitiv passar bäst för att lägga in en enkel Python-funktion som ändrar data (t.ex. filtrerar en lista med dokument) i en kedja?
Sammanfattning: utöka hämtning
Bra jobbat! I den här lektionen har du lärt dig hur man utökar LangChains hämtningskedjor med anpassad logik:
- Vi undersökte behovet av anpassning i RAG-system i verkliga användningsfall.
- Du fick bekanta dig med
RunnableLambdaochRunnablePassthroughsom viktiga verktyg. - Vi såg hur man kan förbearbeta frågor för bättre hämtning.
- Du lärde dig att efterbearbeta hämtade dokument för en mer förfinad kontext.
- Vi berörde avancerade koncept som
RunnableBranchför villkorsstyrd logik.
Experimentera med dessa tekniker för att bygga mycket anpassade och effektiva RAG-applikationer!
Lär dig LangChain / RAG / vektordatabaser med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Utöka hämtarkedjor med anpassad logik” gratis?
Ja – hela texten till ”Utöka hämtarkedjor med anpassad logik” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i LangChain / RAG / vektordatabaser, kan Ni uppgradera till CoddyKit PRO. Kursen i LangChain / RAG / vektordatabaser innehåller totalt 4 lektioner.
Vad lär jag mig i ”Utöka hämtarkedjor med anpassad logik”?
Bygg anpassade hämtarkedjor som integrerar komplex affärslogik, förbehandlingssteg eller specialiserad filtrering. Ni övar på LangChain / RAG / vektordatabaser med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig LangChain / RAG / vektordatabaser?
Du behöver inga förkunskaper. Utbildningen i LangChain / RAG / vektordatabaser på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Utöka hämtarkedjor med anpassad logik”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här LangChain / RAG / vektordatabaser-lektionen?
Ja. Varje LangChain / RAG / vektordatabaser-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Utveckla anpassade dokumentläsare
- Integrera anpassade embeddingmodeller
- Utöka hämtarkedjor med anpassad logik
- Skapa anpassade outputparsers