AI Workflows

How to Fix LLM Hallucinations Using RAG Techniques

Learn how to address and reduce large language model hallucinations with retrieval-augmented generation (RAG) setups.

5 min read

Learn how to address and reduce large language model (LLM) hallucinations with retrieval-augmented generation (RAG) setups and prompt engineering.

Understanding Hallucinations in LLMs

Large language models (LLMs) sometimes produce incorrect or fabricated information, commonly referred to as "hallucinations." This happens because LLMs rely on static parametric knowledge captured during training, which doesn't update over time. As a result, they're limited when asked about recent or highly specific topics.

Key Concepts to Address LLM Hallucinations:

  • Parametric Knowledge: Information encoded in the model's training parameters, which is fixed once training concludes.
  • Source Knowledge: Up-to-date knowledge dynamically provided via prompts at inference time.
  • Retrieval-Augmented Generation (RAG): A method that combines LLMs with an external database to retrieve relevant, current information for a query.
  • Prompt Design: Techniques to guide LLMs toward accurate and grounded outputs.

RAG allows LLMs to access tailored, relevant knowledge from external sources, mitigating hallucinations and improving factual accuracy.

Prerequisites for Implementation

Before getting started, ensure you have access to the required tools and services.

prerequisites

  • OpenAI API: Access to GPT-3.5-turbo or a similar LLM.
  • Hugging Face Datasets: For creating your knowledge base.
  • Vector Database: Pinecone or an equivalent service.
  • Python Libraries: Install langchain, tiktoken, openai, and pinecone.
  • API Keys: For OpenAI and vector database services.

Steps to Build the RAG Pipeline

Follow these steps to create a basic RAG pipeline to address LLM hallucinations.

steps

  1. Ingest and Preprocess Data:

    • Use datasets, such as Wikipedia from Hugging Face, for creating your knowledge base.
    • Split long passages into manageable chunks.
    • Use tokenization to meet tokenizer limits for your chosen LLM.
    python
    from langchain.text_splitter import CharacterTextSplitter
    from langchain.llms import OpenAI
    import tiktoken
    
    # Load and tokenize text data
    dataset = ["This is a long piece of text that needs to be split into chunks."]
    splitter = CharacterTextSplitter(chunk_size=400, chunk_overlap=20)
    chunks = splitter.split_text(dataset[0])
    print(chunks)  # Output: Smaller text chunks
  2. Embed the Data:

    • Create vector embeddings for each text chunk using OpenAI's embedding models (e.g., text-embedding-ada-002).
    python
    from langchain.embeddings import OpenAIEmbeddings
    
    # Initialize embeddings
    embedding_model = OpenAIEmbeddings()
    embeddings = embedding_model.embed_documents(chunks)
    print(len(embeddings[0]))  # Verify embedding dimensionality
  3. Set Up a Vector Database:

    • Use a vector database like Pinecone to store and query embeddings.
    python
    import pinecone
    
    # Initialize Pinecone
    pinecone.init(api_key="YOUR_API_KEY", environment="us-west1-gcp")
    index_name = "rag-index"
    
    if index_name not in pinecone.list_indexes():
        pinecone.create_index(index_name, dimension=1536)
    
    index = pinecone.Index(index_name)
    index.upsert([(f"id-{i}", vector) for i, vector in enumerate(embeddings)])
  4. Integrate Retrieval with LangChain:

    • Query the vector database for relevant embeddings during runtime.
    python
    from langchain.vectorstores import Pinecone
    from langchain.docstore.document import Document
    
    # Load the Pinecone index into LangChain
    vectorstore = Pinecone(index, embedding_model.embed_query, "text")
    
    # Query the database
    query = "Tell me about Benito Mussolini."
    results = vectorstore.similarity_search(query, k=3)
    print([result.page_content for result in results])
  5. Fine-Tune Retrieval with a Language Model:

    • Use retrieved data as context in LLM prompts through LangChain's RetrievalQA component.
    python
    from langchain.chains import RetrievalQA
    
    llm = OpenAI(model="gpt-3.5-turbo", temperature=0)
    qa_chain = RetrievalQA(llm=llm, retriever=vectorstore.as_retriever())
    
    # Query with retrieval augmentation
    answer = qa_chain.run(query)
    print(answer)
  6. Add Citation Generation:

    • Use LangChain's RetrievalQAWithSourcesChain to include source citations in the LLM output.
    python
    from langchain.chains import RetrievalQAWithSourcesChain
    
    qa_with_sources = RetrievalQAWithSourcesChain(llm=llm, retriever=vectorstore.as_retriever())
    answer = qa_with_sources.run(query)
    print("Answer:", answer["answer"])
    print("Sources:", answer["sources"])

Ensuring Reliable Results

Takeaway

RAG techniques significantly minimize LLM hallucinations by grounding model responses in external, dynamically updated knowledge. Using vector databases and embeddings ensures your models output reliable and current information, while citation generation fosters transparency and user trust. By combining retrieval systems and properly designed prompts, businesses can unlock the full potential of AI systems with reduced risk of inaccuracies.

FAQ

How do I fix hallucinations in LLMs without RAG?

To limit hallucinations without RAG, try prompt engineering techniques such as setting deterministic settings (e.g., temperature = 0) and instructing the model to say “I don’t know” when unsure. However, RAG is typically more effective for preventing hallucinations in production.

Why do LLMs hallucinate?

LLMs hallucinate because their parametric knowledge is static and limited to their training dataset. This can lead to fabricated responses when they encounter queries about topics they were never trained on.

What is a vector embedding in RAG?

Vector embeddings are numerical representations of text that capture semantic meaning. In RAG, embeddings allow efficient matching of user queries to relevant knowledge stored in a vector database like Pinecone.


Official reference: OpenAI API documentation.