Del 2 af 5: Retrieval-Augmented Generation
Velkommen tilbage! I dag dykker vi ned i RAG-systemer — en af de mest praktiske måder at gøre AI nyttig for dine specifikke forretningsbehov.
Hvad er RAG helt præcist?
Lad mig forklare RAG med en simpel analogi. Forestil dig, at du tager en åben bog-eksamen. I stedet for kun at stole på det, du har lært udenad, kan du slå information op i dine lærebøger for at give bedre, mere præcise svar. Det er i bund og grund, hvad RAG gør for AI-modeller.
RAG = AI-model + Din tilpassede videnbase
AI-modellen giver "intelligensen" til at forstå spørgsmål og generere menneskelignende svar, mens din videnbase giver de specifikke, opdaterede oplysninger om din virksomhed.
Hvorfor skulle du bekymre dig om RAG?
Her er det med store sprogmodeller som ChatGPT — de er utroligt smarte, men de ved ikke noget om din specifikke virksomhed. De kan ikke fortælle kunderne om dine seneste produktfunktioner, dine virksomhedspolitikker eller besvare spørgsmål ved hjælp af din interne dokumentation.
RAG løser dette ved at:
- Gøre AI-svar mere nøjagtige og relevante for din virksomhed
- Holde oplysninger opdaterede (opdater bare dine dokumenter, ingen omtræning nødvendig)
- Give transparens (du kan se, hvilke dokumenter AI brugte til at svare)
- Være omkostningseffektiv (meget billigere end finjustering af store modeller)
Lad os bygge en sammen
Jeg viser dig, hvordan du bygger et RAG-system ved hjælp af Googles Gemini AI. Vi'll skabe et system, der kan besvare spørgsmål om "MyNextDeveloper". Her er trinvis proces:
Trin 1: Installer de nødvendige værktøjer
!pip install -q -U google-generativeai langchain-google-genai langchain faiss-cpu pypdf langchain-community
Disse biblioteker vil håndtere det tunge arbejde for os:
- google-generativeai: Adgang til Googles Gemini-modeller
- langchain-google-genai: Gemini-integration med LangChain
- LangChain: Framework til at bygge AI-applikationer
- FAISS: Hurtig lighedssøgning (finding relevante dokumenter)
Trin 2: Opsæt Google AI API
import os from google.colab import userdata import google.generativeai as genaiGOOGLE_API_KEY = userdata.get('GOOGLE_API_KEY') genai.configure(api_key=GOOGLE_API_KEY)
Du skal få en gratis API-nøgle fra Google AI Studio og tilføje den til dit miljø.
Trin 3: Forbered din videnbase
raw_text = """ MyNextDeveloper (MND) is a remote-first tech company founded in 2022 in Mumbai. They focus on supplying pre-vetted, highly skilled developers to startups. Their mission is to solve the trust gap between startups and engineers by emphasizing empathy, communication, and transparency.The company promotes agile practices, test-driven development, and POSH-compliant culture. MND offers services like staff augmentation, API and web development, UI/UX design, and AI/ML solutions. Their tech stack includes Angular, React, Next.js, Node.js, Django, Python, Docker, and AWS. Clients appreciate their transparency and delivery quality. Project pricing starts at $10,000 with hourly rates between $25 and $49. MND claims startups can save up to 30% through their freelance model. They operate globally, serving startups, Y Combinator and Techstars alumni. It is headquartered in Malabar Hill, Mumbai. """# Konverter til LangChain-dokument from langchain_core.documents import Document documents = [Document(page_content=raw_text)] print(f"Loaded {len(documents)} document(s).")
I en rigtig applikation ville dette være din produktdokumentation, FAQ, virksomhedspolitikker eller anden tekstbaseret information om din virksomhed.
Trin 4: Opdel informationen i stykker
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter( chunk_size=300, chunk_overlap=50, length_function=len, add_start_index=True, )
chunks = text_splitter.split_documents(documents)
print(f"Split into {len(chunks)} chunks.")
Hvorfor deler vi teksten op? AI-modeller fungerer bedre med mindre, fokuserede informationsstykker. chunk_overlap=50 sikrer, at vi ikke mister kontekst ved chunk-grænserne, mens add_start_index=True hjælper os med at spore, hvor informationen kommer fra.
Trin 5: Opret indlejringer og vektorlager
from langchain_google_genai import GoogleGenerativeAIEmbeddings from langchain_community.vectorstores import FAISS
embeddings = GoogleGenerativeAIEmbeddings( model="models/embedding-001", google_api_key=GOOGLE_API_KEY )
print("Creating FAISS vector store...")
vector_store = FAISS.from_documents(chunks, embeddings)
print("FAISS vector store created.")
Det vigtigste trin. Hvert stykke tekst konverteres til en "vektor" (numerisk repræsentation). Når nogen stiller et spørgsmål, finder vi de stykker, hvis vektorer er mest lig spørgsmålets vektor.
Trin 6: Opsæt spørgsmål-og-svar-systemet
from langchain_google_genai import ChatGoogleGenerativeAI from langchain.chains import RetrievalQA from langchain_core.prompts import PromptTemplate
retriever = vector_store.as_retriever(search_kwargs={"k": 3})
llm = ChatGoogleGenerativeAI( model="gemini-1.5-flash", temperature=0.3, google_api_key=GOOGLE_API_KEY )
prompt_template = """ You are an AI assistant that answers questions based on the provided context. If the answer is not available in the context, politely state that you don't know.
Context:
{context}
Question:
{question}
Answer: """ RAG_PROMPT = PromptTemplate.from_template(prompt_template)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True,
chain_type_kwargs={"prompt": RAG_PROMPT}
)
temperature=0.3 holder svarene fokuserede og faktuelle, mens search_kwargs={"k": 3} betyder, at vi henter de 3 mest relevante stykker for hvert spørgsmål.
Trin 7: Test det
questions = [ "What does MyNextDeveloper (MND) do?", "Where is MND headquartered?", "What services does MND offer?", "What technologies does MND use?", "How does MND help startups save money?", "What is the capital of France?" # This should trigger "I don't know" ]
for i, question in enumerate(questions):
print(f"nQuestion {i+1}: {question}")
response = qa_chain.invoke({"query": question})
print(f"Answer: {response['result']}")
if 'source_documents' in response:
print("Source Documents:")
for doc in response['source_documents']:
print(f"- Content (truncated): {doc.page_content[:150]}...")
Eksempel på output:
Question 1: What does MyNextDeveloper (MND) do? Answer: MyNextDeveloper (MND) is a remote-first tech company that supplies pre-vetted, highly skilled developers to startups. They offer services such as staff augmentation, API and web development, UI/UX design, and AI/ML solutions. Their goal is to bridge the trust gap between startups and engineers through empathy, communication, and transparency.
Question 6: What is the capital of France? Answer: I'm sorry, but I don't know the capital of France. The provided text is about a company called MND and doesn't contain information about France's capital.
Bemærk, hvordan systemet korrekt besvarer spørgsmål om MND, men høfligt afslår at besvare spørgsmål uden for sin videnbase.
Google Colab
Her er Google Colab-linket til denne artikel, som kan køres med et enkelt klik: link
Real-verdens applikationer
Her er nogle praktiske måder, du kan bruge RAG-systemer på:
Kundesupport: Upload dit FAQ, produktmanualer og supportbilletter. Lad AI håndtere almindelige spørgsmål 24/7.
Intern videnbase: Upload virksomhedspolitikker, procedurer og dokumentation. Medarbejdere kan stille spørgsmål på naturligt sprog i stedet for at grave gennem filer.
Salgsassistent: Upload produktspecifikationer, prisfastsættelse og casestudier. Dit salgsteam får øjeblikkelig adgang til enhver information, de har brug for under opkald.
Indholdsfremstilling: Upload dit eksisterende indhold, blogindlæg og markedsføringsmateriale. Generer nyt indhold, der stemmer overens med din brandtone.
Begrænsningerne (lad os være ærlige)
RAG er ikke perfekt:
- Kvaliteten afhænger af dine data: Skrald ind, skrald ud
- Kan hallucinere: Nogle gange kan AI opfinde information, der lyder plausibel
- Kræver vedligeholdelse: Du skal holde din videnbase opdateret
- Omkostningsovervejelser: API-opkald kan summere sig ved høj brug
Vigtige implementeringsindsigter
Fra vores fungerende eksempel er her nogle vigtige tekniske overvejelser:
Stykkets størrelse betyder noget: Vi brugte 300 tegn med 50-tegns overlap. Dette balancerer kontekstbevarelse med hentepræcision.
Indlejringskvalitet: Googles embedding-001-model giver gode generelle indlejringer, men du har muligvis brug for domænespecifikke indlejringer til specialiseret indhold.
Hentestrategi: Parameteren k=3 betyder, at vi henter de 3 mest relevante stykker. Du kan justere dette baseret på dit use case.
Prompt engineering: Vores prompt fortæller eksplicit AI'en at sige "Jeg ved ikke", når information ikke er tilgængelig. Dette forhindrer hallucination.
Tips til succes
- Start småt: Begynd med et specifikt use case i stedet for at prøve at dække alt
- Hold dokumenter opdaterede: Forældet information fører til frustrerede brugere
- Test grundigt: Prøv mange forskellige spørgsmål for at forstå, hvor dit system fungerer godt, og hvor det ikke gør
- Overvåg brug: Holde øje med, hvilke spørgsmål folk stiller for at forbedre din videnbase
- Iterer på stykkets størrelse: Eksperimentér med forskellige stykstørrelser og overlapværdier for dit specifikke indhold
Hvad kommer derefter
I vores næste artikel udforsker vi finjustering — at tage en eksisterende AI-model og træne den specifikt til dit use case. Mens RAG giver AI adgang til dine oplysninger, ændrer finjustering faktisk, hvordan AI "tænker" om dit domæne.
RAG er ofte det bedste udgangspunkt, fordi det er enklere, mere gennemsigtigt og lettere at vedligeholde. Men nogle gange har du brug for det ekstra niveau af tilpasning, som kun finjustering kan give.
Kommer snart: Artikel 3 — "Fine-Tuning LLMs: Teaching AI to Speak Your Language"


