Įveik LLM haliucinacijas naudodamiesi žinių bazėmis

Įveik LLM haliucinacijas naudodamiesi žinių bazėmis


Ką?

Jei paraginsite LLM „pasiūlykite puikią programavimo kalbą mašininiam mokymuisi“

LLM atsakymas būtų toks: „Viena iš labiausiai rekomenduojamų programavimo kalbų mašininiam mokymuisi yra Python. Python yra aukšto lygio…

Ką daryti, jei norite, kad jūsų organizacija pateiktų patikrintą organizacijos informaciją, ty sustiprintų atsakymą autentiška organizacijos informacija?

Padarykime tai bendraujant su LLM

Kodėl?

Populiarūs LLM, tokie kaip „OpenAI“ pokalbių GPT, „Google“ „Gemini“, yra mokomi apie viešai prieinamus duomenis. Jiems dažnai trūksta konkrečios organizacijos informacijos. Tam tikrais atvejais organizacijos norėtų pasikliauti LLM. Tačiau norėtų sustiprinti atsaką, būdingą konkrečiai organizacijai arba pridėti atsakomybės apribojimus kai nėra įžeminimo duomenų.

Šis procesas žinomas kaip LLM atsako įžeminimas naudojant žinių bazes.

Kaip?

Nors aš galiu tiesiog apie tai kalbėti.

Kaip inžinierius, žiūrintis į kai kuriuos kodo fragmentus, man suteikia pasitikėjimo.

Jų vykdymas kelia mano pasitikėjimą ir suteikia laimės. Dalijimasis teikia man pasitenkinimo 😄

Kodas? Kodėl gi ne! → Python? Žinoma!!

  1. Įdiekite reikiamas bibliotekas

    pip install openai faiss-cpu numpy python-dotenv
    
  • openai: sąveikauti su OpenAI GPT modeliais ir įterpimais.
  • faiss-cpu: „Facebook“ AI biblioteka, skirta veiksmingai panašumų paieškai, naudojama įterpimams saugoti ir ieškoti.
  • numpy: Skaitmeninėms operacijoms, įskaitant įterpimų kaip vektorių tvarkymą.
  • python-dotenv: Norėdami įkelti aplinkos kintamuosius (pvz., API raktus) iš a .env failą saugiai.
  1. Nustatykite aplinkos kintamuosius

    • Eikite į https://platform.openai.com/settings/organization/api-keys
    • Spustelėkite „Sukurti naują slaptąjį raktą“, kaip parodyta paveikslėlyje žemiau.
    • Pateikite išsamią informaciją, galite naudoti paslaugos paskyrą. Nurodykite „Paslaugos paskyros ID“ pavadinimą ir pasirinkite projektą.
    • Nukopijuokite slaptąjį raktą į mainų sritį
    • Sukurti a .env failą savo projekto kataloge. Pridėkite OpenAI API raktą prie šio failo.
    OPENAI_API_KEY=your_openai_api_key_here
    
  2. Inicijuoti klientą ir įkelti aplinkos kintamuosius

    • load_dotenv() įkelia .env failą ir os.getenv("OPENAI_API_KEY") nuskaito API raktą. Ši sąranka apsaugo jūsų API raktą.
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. Apibrėžkite įžeminimo duomenis / žinių bazę
    • Šiame žodyne yra pagrindinė temų informacija. Tiesą sakant, tai gali būti didesnis duomenų rinkinys arba duomenų bazė.
# 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. Sukurkite teksto įterpimus

    • Funkcija, skirta tam tikro teksto įterpimams generuoti naudojant OpenAI įdėjimo modelį. Ši funkcija iškviečia OpenAI API, kad gautų teksto įvesties įterpimą, kuris vėliau grąžinamas kaip NumPy masyvas
    # 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. FAISS indeksas ir įžeminimo duomenų įterpimai

    • Sukurkite FAISS indeksą – struktūrą, optimizuotą greitoms panašumų paieškoms, ir užpildykite ją įžeminimo duomenų įterpimais.
    # 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: kiekvieno įterpimo dydis, reikalingas FAISS indeksui inicijuoti.
    • index = faiss.IndexFlatL2(dimension): Sukuria FAISS indeksą, kuris panašumui naudoja euklidinį atstumą (L2).
    • Už kiekvieną įėjimą grounding_datašis kodas sugeneruoja įterpimą ir prideda jį prie FAISS indekso.
  3. Vektorinės paieškos funkcija

    • Funkcija FAISS indekse ieško panašiausio į užklausą įžeminimo duomenų.
# 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: konvertuoja užklausos tekstą į įterpimo vektorių.
  • FAISS Search: Indekse ieško užklausai artimiausio vektoriaus.
  • Threshold Check: Jei artimiausias vektoriaus atstumas (D) yra žemiau slenksčio, jis grąžina įžeminimo informaciją. Kitu atveju tai rodo, kad patikimas įžeminimas nerastas.
  1. Klauskite LLM

    Mes užklausiame LLM naudodami OpenAI chatgpt API ir gpt-4 modelį.

    # 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. Patobulintas atsakas

    • Prideda įžeminimo informaciją, jei ji yra, arba
    • Pridedamas atsakomybės atsisakymas, jei nerandama atitinkamos įžeminimo informacijos.
    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. Apibrėžkite pagrindinę funkciją

    Pagrindinė funkcija sujungia viską, leidžiančią įvesti temą, pateikti užklausą LLM ir patikrinti, ar atsakymas sutampa su įžeminimo duomenimis.

    # 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()
    

Rezultatas

Vykdykite scenarijų

Iškvieskite šį fragmentą naudodami

python groundin_llm.py

Atsakymas:

Įžemintas sustiprintas atsakasĮžemintas sustiprintas atsakas

Paaiškinimas

Jei pastebėsite atsakymą, nors LLM atsakymas buvo „Viena iš labiausiai rekomenduojamų programavimo kalbų mašininiam mokymuisi…“, pagrįstas atsakymas buvo „Java yra puiki, ji maitina didžiąją dalį mašininio mokymosi kodo, joje yra gausus prieinamos bibliotekos“.

Tai įmanoma naudojant Meta FAISS biblioteką vektorinei paieškai pagal panašumą.

Procesas:

  1. Pirmiausia gaukite LLM atsakymą.
  2. Naudodami vektorinę paiešką patikrinkite, ar mūsų žinių bazėje yra atitinkamos informacijos.
  3. Jei yra, grąžinkite atsakymą iš „žinių bazės“
  4. Jei ne, grąžinkite LLM atsakymą tokį, koks yra.

Čia yra kodas: https://github.com/sundeep110/groundingLLMs

Laimingas įžeminimas!!



Source link

Draugai: - Marketingo agentūra - Teisinės konsultacijos - Skaidrių skenavimas - Fotofilmų kūrimas - Miesto naujienos - Šeimos gydytojai - Saulius Narbutas - Įvaizdžio kūrimas - Veidoskaita - Nuotekų valymo įrenginiai - Teniso treniruotės - Pranešimai spaudai -