Į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!!
-
Į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.
-
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
-
Inicijuoti klientą ir įkelti aplinkos kintamuosius
load_dotenv()
įkelia.env
failą iros.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"))
- 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."
}
-
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)
-
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.
-
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.
-
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
-
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.)"
-
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:
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:
- Pirmiausia gaukite LLM atsakymą.
- Naudodami vektorinę paiešką patikrinkite, ar mūsų žinių bazėje yra atitinkamos informacijos.
- Jei yra, grąžinkite atsakymą iš „žinių bazės“
- Jei ne, grąžinkite LLM atsakymą tokį, koks yra.
Čia yra kodas: https://github.com/sundeep110/groundingLLMs
Laimingas įžeminimas!!