Rumah > Peranti teknologi > AI > Meningkatkan Rag: Beyond Vanilla Pendekatan

Meningkatkan Rag: Beyond Vanilla Pendekatan

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2025-02-25 16:38:09
asal
630 orang telah melayarinya

Enhancing RAG: Beyond Vanilla Approaches

Generasi pengambilan semula (RAG) dengan ketara meningkatkan model bahasa dengan mengintegrasikan pengambilan maklumat luaran. Rag standard, sambil meningkatkan relevan tindak balas, sering kali ganda dalam situasi pengambilan kompleks. Artikel ini mengkaji kekurangan kain asas dan membentangkan kaedah lanjutan untuk meningkatkan ketepatan dan kecekapan.

Batasan RAG Asas

Pertimbangkan satu senario mudah: Mendapatkan maklumat yang relevan dari beberapa dokumen. Dataset kami termasuk:

    Dokumen utama yang memperincikan amalan gaya hidup yang sihat dan produktif.
  • Dua dokumen yang tidak berkaitan yang mengandungi beberapa kata kunci bertindih, tetapi dalam konteks yang berbeza.
<code>main_document_text = """
Morning Routine (5:30 AM - 9:00 AM)
✅ Wake Up Early - Aim for 6-8 hours of sleep to feel well-rested.
✅ Hydrate First - Drink a glass of water to rehydrate your body.
✅ Morning Stretch or Light Exercise - Do 5-10 minutes of stretching or a short workout to activate your body.
✅ Mindfulness or Meditation - Spend 5-10 minutes practicing mindfulness or deep breathing.
✅ Healthy Breakfast - Eat a balanced meal with protein, healthy fats, and fiber.
✅ Plan Your Day - Set goals, review your schedule, and prioritize tasks.
...
"""</code>
Salin selepas log masuk
Salin selepas log masuk
Sistem Rag Asas, apabila ditanya dengan:

  1. Bagaimana saya dapat meningkatkan kesihatan dan produktiviti saya? Apakah strategi terbaik untuk gaya hidup yang sihat dan produktif?
  2. boleh berjuang untuk mendapatkan dokumen utama secara konsisten kerana kehadiran kata -kata yang sama dalam dokumen yang tidak berkaitan.

fungsi penolong: menyelaraskan saluran paip RAG

Untuk meningkatkan ketepatan pengambilan semula dan memudahkan pemprosesan pertanyaan, kami memperkenalkan fungsi penolong. Fungsi -fungsi ini mengendalikan tugas -tugas seperti menanyakan API CHATGPT, mengira embeddings dokumen, dan menentukan skor persamaan. Ini mewujudkan saluran paip RAG yang lebih cekap.

Berikut adalah fungsi penolong:

<code># **Imports**
import os
import json
import openai
import numpy as np
from scipy.spatial.distance import cosine
from google.colab import userdata

# Set up OpenAI API key
os.environ["OPENAI_API_KEY"] = userdata.get('AiTeam')</code>
Salin selepas log masuk
Salin selepas log masuk
<code>def query_chatgpt(prompt, model="gpt-4o", response_format=openai.NOT_GIVEN):
    try:
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.0 , # Adjust for more or less creativity
            response_format=response_format
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        return f"Error: {e}"</code>
Salin selepas log masuk
Salin selepas log masuk
<code>def get_embedding(text, model="text-embedding-3-large"): #"text-embedding-ada-002"
    """Fetches the embedding for a given text using OpenAI's API."""
    response = client.embeddings.create(
        input=[text],
        model=model
    )
    return response.data[0].embedding</code>
Salin selepas log masuk
<code>def compute_similarity_metrics(embed1, embed2):
    """Computes different similarity/distance metrics between two embeddings."""
    cosine_sim = 1- cosine(embed1, embed2)  # Cosine similarity

    return cosine_sim</code>
Salin selepas log masuk
Menilai RAG Asas
<code>def fetch_similar_docs(query, docs, threshold = .55, top=1):
  query_em = get_embedding(query)
  data = []
  for d in docs:
    # Compute and print similarity metrics
    similarity_results = compute_similarity_metrics(d["embedding"], query_em)
    if(similarity_results >= threshold):
      data.append({"id":d["id"], "ref_doc":d.get("ref_doc", ""), "score":similarity_results})

  # Sorting by value (second element in each tuple)
  sorted_data = sorted(data, key=lambda x: x["score"], reverse=True)  # Ascending order
  sorted_data = sorted_data[:min(top, len(sorted_data))]
  return sorted_data</code>
Salin selepas log masuk

Kami menguji kain asas menggunakan pertanyaan yang telah ditetapkan untuk menilai keupayaannya untuk mendapatkan dokumen yang paling relevan berdasarkan persamaan semantik. Ini menyoroti batasannya.

Teknik lanjutan untuk RAG yang dipertingkatkan
<code>"""# **Testing Vanilla RAG**"""

query = "what should I do to stay healthy and productive?"
r = fetch_similar_docs(query, docs)
print("query = ", query)
print("documents = ", r)

query = "what are the best practices to stay healthy and productive ?"
r = fetch_similar_docs(query, docs)
print("query = ", query)
print("documents = ", r)</code>
Salin selepas log masuk

Untuk memperbaiki proses pengambilan semula, kami memperkenalkan fungsi yang menghasilkan maklumat berstruktur untuk meningkatkan pengambilan dokumen dan pemprosesan pertanyaan.

Tiga peningkatan utama dilaksanakan:

1. Menjana Soalan Lazim

Membuat Soalan Lazim dari dokumen memperluaskan kemungkinan pertanyaan yang sesuai. Soalan Lazim ini dihasilkan sekali dan disimpan, memperkayakan ruang carian tanpa kos berulang.

2. Mewujudkan gambaran keseluruhan
<code>def generate_faq(text):
  prompt = f'''
  given the following text: """{text}"""
  Ask relevant simple atomic questions ONLY (don't answer them) to cover all subjects covered by the text. Return the result as a json list example [q1, q2, q3...]
  '''
  return query_chatgpt(prompt, response_format={ "type": "json_object" })</code>
Salin selepas log masuk

Ringkasan ringkas menangkap idea teras dokumen, meningkatkan keberkesanan pengambilan semula. Embedding gambaran keseluruhan ditambah ke koleksi dokumen.

3. Penguraian pertanyaan
<code>def generate_overview(text):
  prompt = f'''
  given the following text: """{text}"""
  Generate an abstract for it that tells in maximum 3 lines what is it about and use high level terms that will capture the main points,
  Use terms and words that will be most likely used by average person.
  '''
  return query_chatgpt(prompt)</code>
Salin selepas log masuk

Pertanyaan luas dipecahkan ke dalam sub-Queries yang lebih kecil dan lebih tepat. Sub-Queries ini dibandingkan dengan Koleksi Dokumen yang Dipertingkatkan (dokumen asal, Soalan Lazim, dan Gambaran Keseluruhan). Hasilnya digabungkan untuk relevansi yang lebih baik.
<code>main_document_text = """
Morning Routine (5:30 AM - 9:00 AM)
✅ Wake Up Early - Aim for 6-8 hours of sleep to feel well-rested.
✅ Hydrate First - Drink a glass of water to rehydrate your body.
✅ Morning Stretch or Light Exercise - Do 5-10 minutes of stretching or a short workout to activate your body.
✅ Mindfulness or Meditation - Spend 5-10 minutes practicing mindfulness or deep breathing.
✅ Healthy Breakfast - Eat a balanced meal with protein, healthy fats, and fiber.
✅ Plan Your Day - Set goals, review your schedule, and prioritize tasks.
...
"""</code>
Salin selepas log masuk
Salin selepas log masuk

Menilai RAG yang dipertingkatkan

Mengembalikan semula pertanyaan awal dengan peningkatan ini menunjukkan peningkatan yang ketara. Penguraian pertanyaan menjana pelbagai sub-Queries, yang membawa kepada pengambilan semula yang berjaya dari kedua-dua Soalan Lazim dan dokumen asal.

<code># **Imports**
import os
import json
import openai
import numpy as np
from scipy.spatial.distance import cosine
from google.colab import userdata

# Set up OpenAI API key
os.environ["OPENAI_API_KEY"] = userdata.get('AiTeam')</code>
Salin selepas log masuk
Salin selepas log masuk

Contoh Output FAQ:

<code>def query_chatgpt(prompt, model="gpt-4o", response_format=openai.NOT_GIVEN):
    try:
        response = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.0 , # Adjust for more or less creativity
            response_format=response_format
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        return f"Error: {e}"</code>
Salin selepas log masuk
Salin selepas log masuk

analisis kos-manfaat

Semasa pra-proses (menjana Soalan Lazim, Gambaran Keseluruhan, dan Embeddings) menambah kos pendahuluan, ia adalah kos satu kali setiap dokumen. Ini mengimbangi ketidakcekapan sistem RAG yang tidak dioptimumkan: pengguna kecewa dan peningkatan kos pertanyaan daripada mendapatkan maklumat yang tidak relevan. Untuk sistem volum tinggi, pra-proses adalah pelaburan yang berbaloi.

Kesimpulan

Menggabungkan Preprocessing Document (FAQs dan Gambaran Keseluruhan) dengan penguraian pertanyaan mewujudkan sistem RAG yang lebih pintar yang mengimbangi ketepatan dan keberkesanan kos. Ini meningkatkan kualiti pengambilan, mengurangkan hasil yang tidak relevan, dan meningkatkan pengalaman pengguna. Penyelidikan masa depan dapat meneroka pengoptimuman selanjutnya seperti ambang dinamik dan pembelajaran tetulang untuk penghalusan pertanyaan.

Atas ialah kandungan terperinci Meningkatkan Rag: Beyond Vanilla Pendekatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan