RELIEVAL-AUGmented Technology (RAG) ist eine leistungsstarke Technik, die die Sprachmodelle durch Einbeziehung externer Informations-Abrufmechanismen verbessert. Während Customary -Lag -Implementierungen die Reaktionsrelevanz verbessern, haben sie häufig in komplexen Abrufszenarien Probleme. In diesem Artikel wird die Einschränkungen eines Vanille -Lappen -Setups untersucht und fortschrittliche Techniken einführt, um seine Genauigkeit und Effizienz zu verbessern.
Die Herausforderung mit Vanille -Lappen
Betrachten Sie ein einfaches Experiment, bei dem wir versuchen, relevante Informationen aus einer Reihe von Dokumenten abzurufen, um Rags Einschränkungen zu veranschaulichen. Unser Datensatz enthält:
- Ein primäres Dokument, in dem Greatest Practices für gesund, produktiv und in gutem Zustand diskutiert werden.
- Zwei zusätzliche Dokumente zu nicht verwandten Themen, enthalten jedoch einige ähnliche Wörter, die in verschiedenen Kontexten verwendet werden.
main_document_text = """
Morning Routine (5:30 AM - 9:00 AM)
✅ Wake Up Early - Goal for 6-8 hours of sleep to really feel well-rested.
✅ Hydrate First - Drink a glass of water to rehydrate your physique.
✅ Morning Stretch or Gentle Train - Do 5-10 minutes of stretching or a brief exercise to activate your physique.
✅ Mindfulness or Meditation - Spend 5-10 minutes training mindfulness or deep respiratory.
✅ Wholesome Breakfast - Eat a balanced meal with protein, wholesome fat, and fiber.
✅ Plan Your Day - Set objectives, evaluate your schedule, and prioritize duties.
...
"""
Mit einem Customary -Lappen -Setup fragen wir das System mit:
- Was soll ich tun, um gesund und produktiv zu bleiben?
- Was sind die besten Praktiken, um gesund und produktiv zu bleiben?
Helferfunktionen
Um die Genauigkeit des Abrufs zu verbessern und die Abfrageverarbeitung zu optimieren, implementieren wir eine Reihe wesentlicher Helferfunktionen. Diese Funktionen dienen verschiedenen Zwecken, von der Abfragung der Chatgpt -API bis hin zur Berechnung von Dokumenteinbettungen und Ähnlichkeitswerten. Durch die Nutzung dieser Funktionen erstellen wir eine effizientere RAG -Pipeline, die die relevantesten Informationen für Benutzeranfragen effektiv abruft.
Um unsere Lappenverbesserungen zu unterstützen, definieren wir die folgenden Helferfunktionen:
# **Imports**
import os
import json
import openai
import numpy as np
from scipy.spatial.distance import cosine
from google.colab import userdata
# Arrange OpenAI API key
os.environ("OPENAI_API_KEY") = userdata.get('AiTeam')
def query_chatgpt(immediate, mannequin="gpt-4o", response_format=openai.NOT_GIVEN):
attempt:
response = shopper.chat.completions.create(
mannequin=mannequin,
messages=({"function": "consumer", "content material": immediate}),
temperature=0.0 , # Alter for roughly creativity
response_format=response_format
)
return response.selections(0).message.content material.strip()
besides Exception as e:
return f"Error: {e}"
def get_embedding(textual content, mannequin="text-embedding-3-large"): #"text-embedding-ada-002"
"""Fetches the embedding for a given textual content utilizing OpenAI's API."""
response = shopper.embeddings.create(
enter=(textual content),
mannequin=mannequin
)
return response.knowledge(0).embedding
def compute_similarity_metrics(embed1, embed2):
"""Computes completely different similarity/distance metrics between two embeddings."""
cosine_sim = 1- cosine(embed1, embed2) # Cosine similarity
return cosine_sim
def fetch_similar_docs(question, docs, threshold = .55, high=1):
query_em = get_embedding(question)
knowledge = ()
for d in docs:
# Compute and print similarity metrics
similarity_results = compute_similarity_metrics(d("embedding"), query_em)
if(similarity_results >= threshold):
knowledge.append({"id":d("id"), "ref_doc":d.get("ref_doc", ""), "rating":similarity_results})
# Sorting by worth (second ingredient in every tuple)
sorted_data = sorted(knowledge, key=lambda x: x("rating"), reverse=True) # Ascending order
sorted_data = sorted_data(:min(high, len(sorted_data)))
return sorted_data
Bewertung des Vanillelappens
Um die Wirksamkeit eines Vanille -Lappen -Setups zu bewerten, führen wir einen einfachen Take a look at mit vordefinierten Abfragen durch. Unser Ziel ist es zu bestimmen, ob das System das relevanteste Dokument basierend auf der semantischen Ähnlichkeit abruft. Anschließend analysieren wir die Einschränkungen und untersuchen mögliche Verbesserungen.
"""# **Testing Vanilla RAG**"""
question = "what ought to I do to remain wholesome and productive?"
r = fetch_similar_docs(question, docs)
print("question = ", question)
print("paperwork = ", r)
question = "what are the most effective practices to remain wholesome and productive ?"
r = fetch_similar_docs(question, docs)
print("question = ", question)
print("paperwork = ", r)
Fortgeschrittene Techniken für einen verbesserten Lappen
Um den Abrufprozess weiter zu verfeinern, führen wir fortschrittliche Funktionen ein, die die Fähigkeiten unseres Lappensystems verbessern. Diese Funktionen generieren strukturierte Informationen, die beim Abrufen von Dokumenten und Abfragen hilft, wodurch unser System robuster und kontextbewusster wird.
Um diese Herausforderungen zu bewältigen, implementieren wir drei wichtige Verbesserungen:
1. Faqs erzeugen
Durch das automatische Erstellen einer Liste der häufig gestellten Fragen im Zusammenhang mit einem Dokument erweitern wir den Bereich der potenziellen Abfragen, die das Modell übereinstimmen kann. Diese FAQs werden einmal generiert und neben dem Dokument gespeichert, wodurch ein reichhaltigerer Suchraum bereitgestellt wird, ohne die anhaltenden Kosten zu ermitteln.
def generate_faq(textual content):
immediate = f'''
given the next textual content: """{textual content}"""
Ask related easy atomic questions ONLY (do not reply them) to cowl all topics lined by the textual content. Return the outcome as a json checklist instance (q1, q2, q3...)
'''
return query_chatgpt(immediate, response_format={ "kind": "json_object" })
2. Erstellen einer Übersicht
Eine hochrangige Zusammenfassung des Dokuments hilft dabei, seine Kernideen zu erfassen und das Abruf effektiver zu machen. Durch das Einbettung des Überblicks neben dem Dokument bieten wir zusätzliche Einstiegspunkte für relevante Abfragen und verbessern die Übereinstimmungsraten.
def generate_overview(textual content):
immediate = f'''
given the next textual content: """{textual content}"""
Generate an summary for it that tells in most 3 strains what's it about and use excessive stage phrases that can seize the details,
Use phrases and phrases that can be most definitely utilized by common individual.
'''
return query_chatgpt(immediate)
3. Abzersetzung von Abfragen
Anstatt mit breiten Nutzeranfragen zu suchen, zerlegen wir sie in kleinere, präzisere Unterbilder. Jedes Unterbild wird dann mit unserer erweiterten Dokumentsammlung verglichen, die jetzt enthält:
- Das Originaldokument
- Die erzeugten FAQs
- Die generierte Übersicht
Durch das Zusammenführen der Abrufergebnisse aus diesen mehreren Quellen verbessern wir die Wahrscheinlichkeit, relevante Informationen zu finden, erheblich.
def decompose_query(question):
immediate = f'''
Given the consumer question: """{question}"""
break it down into smaller, related subqueries
that may retrieve the most effective info for answering the unique question.
Return them as a ranked json checklist instance (q1, q2, q3...).
'''
return query_chatgpt(immediate, response_format={ "kind": "json_object" })
Bewertung des verbesserten Lappen
Wenn wir diese Techniken implementieren, führen wir unsere ersten Fragen erneut aus. Dieses Mal erzeugt die Abersetzung von Abfragen mehrere Untergrenze, die sich jeweils auf verschiedene Aspekte der ursprünglichen Frage konzentrieren. Infolgedessen holt unser System erfolgreich relevante Informationen sowohl aus den FAQ als auch aus dem Originaldokument ab, was eine erhebliche Verbesserung gegenüber dem Vanille -Lappenansatz zeigt.
"""# **Testing Superior Capabilities**"""
## Generate overview of the doc
overview_text = generate_overview(main_document_text)
print(overview_text)
# generate embedding
docs.append({"id":"overview_text", "ref_doc": "main_document_text", "embedding":get_embedding(overview_text)})
## Generate FAQ for the doc
main_doc_faq_arr = generate_faq(main_document_text)
print(main_doc_faq_arr)
faq =json.hundreds(main_doc_faq_arr)("questions")
for f, i in zip(faq, vary(len(faq))):
docs.append({"id": f"main_doc_faq_{i}", "ref_doc": "main_document_text", "embedding": get_embedding(f)})
## Decompose the first question
question = "what ought to I do to remain healty and productive?"
subqueries = decompose_query(question)
print(subqueries)
subqueries_list = json.hundreds(subqueries)('subqueries')
## compute the similarities between the subqueries and paperwork, together with FAQ
for subq in subqueries_list:
print("question = ", subq)
r = fetch_similar_docs(subq, docs, threshold=.55, high=2)
print(r)
print('=================================n')
## Decompose the 2nd question
question = "what the most effective practices to remain healty and productive?"
subqueries = decompose_query(question)
print(subqueries)
subqueries_list = json.hundreds(subqueries)('subqueries')
## compute the similarities between the subqueries and paperwork, together with FAQ
for subq in subqueries_list:
print("question = ", subq)
r = fetch_similar_docs(subq, docs, threshold=.55, high=2)
print(r)
print('=================================n')
Hier sind einige der FAQs, die erzeugt wurden:
{
"questions": (
"What number of hours of sleep are beneficial to really feel well-rested?",
"How lengthy do you have to spend on morning stretching or gentle train?",
"What's the beneficial period for mindfulness or meditation within the morning?",
"What ought to a wholesome breakfast embody?",
"What do you have to do to plan your day successfully?",
"How are you going to reduce distractions throughout work?",
"How usually do you have to take breaks throughout work/examine productiveness time?",
"What ought to a wholesome lunch encompass?",
"What actions are beneficial for afternoon productiveness?",
"Why is it essential to maneuver round each hour within the afternoon?",
"What forms of bodily actions are instructed for the night routine?",
"What ought to a nutritious dinner embody?",
"What actions might help you mirror and unwind within the night?",
"What do you have to do to organize for sleep?",
…
)
}
Kosten-Nutzen-Analyse
Während diese Verbesserungen eine Vorabverarbeitungskosten einführen-generierende FAQs, Übersichten und Einbettungen-, sind dies ein einmalige Kosten professional Dokument. Im Gegensatz dazu würde ein schlecht optimiertes Lappensystem zu zwei großen Ineffizienzen führen:
- Frustrierte Benutzer aufgrund von geringer Qualität.
- Erhöhte Anfragungskosten durch das Abrufen von übermäßigen, locker verwandten Dokumenten.
Für Systeme, die mit hohen Abfragebieten umgehen, setzen sich diese Ineffizienzen schnell zusammen, was die Vorverarbeitung zu einer lohnenden Investition macht.
Abschluss
Durch die Integration von Dokumentenvorverarbeitungen (FAQs und Übersichten) in die Abersetzung von Abfragen erstellen wir ein intelligentes Lag-System, das die Genauigkeit und die Kostenwirksamkeit in Einklang bringt. Dieser Ansatz verbessert die Abrufqualität, reduziert irrelevante Ergebnisse und sorgt für eine bessere Benutzererfahrung.
Während sich Rag weiterentwickelt, werden diese Techniken maßgeblich zur Verfeinerung von AI-gesteuerten Abrufsystemen maßgeblich sein. Zukünftige Forschungen können weitere Optimierungen untersuchen, einschließlich dynamischer Schwellenwert und Verstärkungslernen für die Verfeinerung von Abfragen.