paint-brush
Depășiți halucinațiile LLM folosind baze de cunoștințede@kattasundeep110
Noua istorie

Depășiți halucinațiile LLM folosind baze de cunoștințe

de Sundeep Goud Katta7m2024/11/07
Read on Terminal Reader

Prea lung; A citi

Halucinațiile în LLM pot fi evitate sau reduse prin îmbunătățirea răspunsului folosind baze de cunoștințe. Bazele de cunoștințe pot fi oricare dintre datele organizației. Răspunsul LLM este împământat și un răspuns îmbunătățit este oferit utilizatorului.
featured image - Depășiți halucinațiile LLM folosind baze de cunoștințe
Sundeep Goud Katta HackerNoon profile picture
0-item

Ce?

Dacă solicitați un LLM „sugerați un limbaj de programare excelent pentru învățarea automată”


Răspunsul LLM ar fi: „Unul dintre cele mai recomandate limbaje de programare pentru învățarea automată este Python. Python este un nivel înalt...”


Ce se întâmplă dacă doriți ca organizația dvs. să furnizeze informații specifice unei organizații verificate, adică să sporească răspunsul cu informații autentice ale organizației?


Să facem asta când interacționăm cu LLM

De ce?

LLM-urile populare, cum ar fi chatGPT de la OpenAI, Google Gemini sunt instruiți pe date disponibile publicului. De multe ori le lipsesc informațiile specifice organizației. Există anumite momente în care organizațiile ar dori să se bazeze pe LLM. Cu toate acestea, ar dori să îmbunătățească răspunsul specific unei anumite organizații sau să adauge declinări de responsabilitate atunci când nu sunt disponibile date de bază.


Procesul de a face acest lucru este cunoscut sub denumirea de Grounding of LLM’s response using Knowledge baze.

Cum?

În timp ce, pot doar să vorbesc despre asta.


În calitate de inginer, privind unele fragmente de cod îmi dă încredere.


Executarea lor îmi ridică încrederea și, de asemenea, dă fericire. Împărtășirea îmi dă satisfacție 😄

Cod? De ce nu! → Python? Desigur!!

  1. Instalați bibliotecile necesare

     pip install openai faiss-cpu numpy python-dotenv
  • openai : pentru a interacționa cu modelele și înglobările GPT ale OpenAI.
  • faiss-cpu : O bibliotecă de Facebook AI pentru căutare eficientă de similaritate, folosită pentru a stoca și a căuta încorporații.
  • numpy : Pentru operații numerice, inclusiv gestionarea înglobărilor ca vectori.
  • python-dotenv : Pentru a încărca în siguranță variabilele de mediu (de exemplu, chei API) dintr-un fișier .env .


  1. Configurați variabilele de mediu

    • Navigați la https://platform.openai.com/settings/organization/api-keys
    • Faceți clic pe „Creați o cheie secretă nouă”, așa cum se arată în imaginea de mai jos.
    • Furnizați detalii, puteți utiliza un cont de serviciu. Furnizați un nume pentru „ID contului de serviciu” și selectați un proiect.
    • Copiați cheia secretă în clipboard
    • Creați un fișier .env în directorul de proiect. Adăugați cheia dvs. API OpenAI la acest fișier.
     OPENAI_API_KEY=your_openai_api_key_here
    • Acest fișier vă păstrează cheia API în siguranță și separată de cod.


  2. Inițializați clientul și încărcați variabilele de mediu

    • load_dotenv() încarcă fișierul .env , iar os.getenv("OPENAI_API_KEY") preia cheia API. Această configurare vă păstrează cheia API în siguranță.
 import os from openai import OpenAI from dotenv import load_dotenv import faiss import numpy as np # Load environment variables load_dotenv() client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))


  1. Definiți baza de date/cunoștințe de bază
    • Acest dicționar conține informații de bază pentru subiecte. În realitate, acesta ar putea fi un set de date mai mare sau o bază de date.
 # Grounding data grounding_data = { "Python": "Python is dynamically typed, which can be a double-edged sword. While it makes coding faster and more flexible, it can lead to runtime errors that might have been caught at compile-time in statically-typed languages.", "LLMs": "Large Language Models (LLMs) are neural networks trained on large text datasets.", "Data Science": "Data Science involves using algorithms, data analysis, and machine learning to understand and interpret data.", "Java": "Java is great, it powers most of the machine learning code, and has a rich set of libraries available." }


  1. Generați încorporare de text

    • O funcție pentru a genera încorporare pentru un text dat folosind modelul de încorporare OpenAI. Această funcție apelează API-ul OpenAI pentru a obține încorporarea pentru o intrare de text, care este apoi returnată ca o matrice NumPy
     # Function to generate embedding for a text def get_embedding(text): response = client.embeddings.create( model="text-embedding-ada-002", input=text ) return np.array(response.data[0].embedding)


  2. Index FAISS și încorporare pentru date de împământare

    • Creați un index FAISS, o structură optimizată pentru căutări rapide de similaritate și populați-o cu încorporarea datelor de bază.
     # Create FAISS index and populate it with grounding data embeddings dimension = len(get_embedding("test")) # Dimension of embeddings index = faiss.IndexFlatL2(dimension) # L2 distance index for similarity search grounding_embeddings = [] grounding_keys = list(grounding_data.keys()) for key, text in grounding_data.items(): embedding = get_embedding(text) grounding_embeddings.append(embedding) index.add(np.array([embedding]).astype("float32"))

    • dimension : dimensiunea fiecărei încorporare, necesară pentru inițializarea indexului FAISS.
    • index = faiss.IndexFlatL2(dimension) : creează un index FAISS care utilizează distanța euclidiană (L2) pentru similitudine.
    • Pentru fiecare intrare în grounding_data , acest cod generează o încorporare și o adaugă la indexul FAISS.


  3. Funcție de căutare vectorială

    • Funcția caută în indexul FAISS cea mai asemănătoare intrare de date de împământare la o interogare.
 # Function to perform vector search on FAISS def vector_search(query_text, threshold=0.8): query_embedding = get_embedding(query_text).astype("float32").reshape(1, -1) D, I = index.search(query_embedding, 1) # Search for the closest vector if I[0][0] != -1 and D[0][0] <= threshold: return grounding_data[grounding_keys[I[0][0]]] else: return None # No similar grounding information available
  • Query Embedding : convertește textul interogării într-un vector de încorporare.
  • FAISS Search : caută în index cel mai apropiat vector de interogare.
  • Threshold Check : Dacă distanța celui mai apropiat vector (D) este sub prag, returnează informațiile de împământare. În caz contrar, indică că nu a fost găsită o împământare fiabilă.
  1. Interogați LLM

    Interogăm LLM folosind API-ul chatgpt și modelul gpt-4 al OpenAI.

     # Query the LLM def query_llm(prompt): response = client.chat.completions.create( model="gpt-4", messages=[ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": prompt} ] ) return response.choices[0].message.content


  1. Răspuns îmbunătățit

    • Adaugă informații de împământare dacă sunt disponibile sau
    • Adaugă o declinare a răspunderii dacă nu se găsesc informații relevante de împământare.
     def enhance_response(topic, llm_response): grounding_info = vector_search(llm_response) if grounding_info: # Check if the LLM's response aligns well with grounding information return f"{llm_response}\n\n(Verified Information: {grounding_info})" else: # Add a disclaimer when no grounding data is available return f"{llm_response}\n\n(Disclaimer: This information could not be verified against known data and may contain inaccuracies.)"
  2. Definiți funcția principală

    Funcția principală combină totul, permițându-vă să introduceți un subiect, să interogați LLM și să verificați dacă răspunsul este aliniat cu datele de bază.

     # Main function to execute the grounding check def main(): topic = input("Enter a topic: ") llm_response = query_llm(f"What can you tell me about {topic}?") grounding_info = vector_search(llm_response, threshold=0.8) print(f"LLM Response: {llm_response}") print(f"Grounding Information: {grounding_info}") if grounding_info != "No grounding information available": print("Response is grounded and reliable.") else: print("Potential hallucination detected. Using grounded information instead.") print(f"Grounded Answer: {grounding_info}") if __name__ == "__main__": main()

Rezultat

Executați scriptul

Invocați acest fragment folosind

 python groundin_llm.py


Raspunsul:

Răspuns îmbunătățit bazat

Explicaţie

Dacă observați răspunsul, deși răspunsul de la LLM a fost „Unul dintre cele mai recomandate limbaje de programare pentru învățarea automată…”, răspunsul bazat a fost „Java este grozav, alimentează cea mai mare parte a codului de învățare automată, are un set bogat de biblioteci disponibile”.


Acest lucru este posibil folosind biblioteca FAISS a Meta pentru căutarea vectorială bazată pe asemănare.

Proces :

  1. Mai întâi, recuperați răspunsul LLM.
  2. Verificați dacă baza noastră de cunoștințe are informații relevante folosind căutarea vectorială.
  3. Dacă există, returnați răspunsul de la „baza de cunoștințe”
  4. Dacă nu, returnați răspunsul LLM așa cum este.


Iată codul: https://github.com/sundeep110/groundingLLMs

Împământare fericită!!