Manfaat dan Implementasi Web Grounding LLM


Pendahuluan

Saat memanggil model bahasa besar dengan pertanyaan tentang peristiwa terbaru atau yang dijadwalkan, jawabannya seringkali bisa salah karena model hanya memiliki akses ke data yang mereka pelajari di masa lalu. Misalnya, jika Anda menanyakan siapa presiden kepada LLM yang dilatih sebelum pemilihan presiden terakhir, tanpa memberikannya akses ke web, model tersebut akan merespons dengan presiden sebelumnya atau membuat jawaban untuk Anda. Contoh pertanyaan ke Llama 3.3 70B ada di bawah ini, di mana batas pengetahuan latihan adalah Desember 2023.

response = call_llm("Who is the current president?")
print(f"Response: {response}")
Response: As of my knowledge cutoff in 2023, Joe Biden is the President of the United States. However, please note that my information may not be up-to-date, and I recommend checking with a reliable news source for the most current information.

Sebagian besar API LLM menyelesaikan masalah ini dengan “membumikan” permintaan Anda dalam pencarian web. Membumikan web adalah proses yang mirip dengan generasi yang ditingkatkan dengan pengambilan (retrieval augmented generation) di mana alur kerja menentukan apakah input pengguna memerlukan informasi terkini dari web, melakukan pencarian web, menambahkan hasil pencarian sebagai konteks ke prompt akhir, dan mengembalikan respons kepada pengguna.

Jika Anda memilih untuk menggunakan model open source alih-alih API LLM dengan web grounding bawaan, Anda mungkin perlu mengimplementasikan alur ini sendiri. Dalam tutorial ini, Anda akan mengimplementasikan alur kerja menggunakan Python yang memanfaatkan web grounding untuk meningkatkan akurasi respons model Anda.

Poin Penting

  • LLM hanya memiliki informasi hingga tanggal saat mereka dilatih. Web grounding menggunakan pencarian web waktu nyata untuk memberikan akses informasi terkini kepada LLM melalui prompt.

  • Web grounding adalah jenis generasi yang diperkuat dengan pengambilan informasi, di mana alur kerjanya menemukan dan menyediakan konteks tambahan untuk prompt pengguna saat memanggil LLM. Ini menentukan informasi tambahan apa yang diperlukan untuk menanggapi sebuah prompt, mencari di web untuk itu, dan menyertakan detail pencarian web dalam konteks prompt.

  • Banyak model sumber tertutup dari OpenAI dan Google memiliki pemrosesan berbasis web bawaan, tetapi untuk model lain, pengguna perlu membuat alur kerja pemrosesan berbasis web mereka sendiri dengan beberapa logika Python dan akses ke API pencarian web.

Langkah 1 — Mendapatkan Kunci API Anda

Anda akan membutuhkan alat yang dapat mencari di web dan mengembalikan respons. Banyak layanan pencarian, termasuk Google dan Bing, baru-baru ini menghentikan API pencarian mereka demi layanan dasar web kepemilikan mereka sendiri yang mengharuskan pengguna untuk menggunakan model mereka atau menggunakan ekosistem agen mereka. Dalam tutorial ini, Anda akan menggunakan pencarian Duck Duck Go melalui rencana gratis terbatas dengan Serp API. API pencarian apa pun dapat digunakan, selama Anda memiliki akses ke judul, cuplikan, dan tanggal hasil pencarian web.

Untuk membuat akun gratis dengan Serp Api dan mendapatkan kunci API, kunjungi situs web mereka dan buat akun dengan paket gratis mereka.

Anda juga akan memerlukan akses ke LLM. Tutorial ini menggunakan Llama 3.3 70B melalui alat Serverless Inference di Platform AI Gradient Linux-Console.net. Anda perlu mendapatkan kunci akses model untuk menggunakan Serverless Inference di Platform AI Gradient Linux-Console.net.

Langkah 2 — Menyiapkan Lingkungan Anda

Jika Anda belum memiliki Python, Anda perlu mengunduh dan menginstalnya dari situs web mereka.

Buat sebuah skrip Python bernama web_grounding_tutorial.py. Dalam skrip tersebut, impor pustaka requests. Tambahkan kunci API Serp Anda. Ganti nilai placeholder your_api_key yang disorot dengan kunci API dari akun Serp API gratis Anda. Untuk menemukan kunci API Anda dengan Serp API, masuk ke situs web mereka, lalu pergi ke bagian kunci API di dasbor Anda.

Kemudian tambahkan URL inferensi Linux-Console.net dengan header untuk permintaan inferensi. Ganti nilai placeholder your_model_access_key yang disorot dengan kunci akses yang Anda dapatkan dari konsol Platform AI Gradient Linux-Console.net.

import requests

SERP_API_KEY = "your_api_key"

llm_url = "https://inference.do-ai.run/v1/chat/completions"
headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer your_model_access_key"
}

Header untuk permintaan ke URL LLM telah ditentukan untuk mendefinisikan tipe konten JSON dan kunci akses model untuk otorisasi. Sekarang Anda perlu mendefinisikan sebuah fungsi untuk memanggil LLM Anda. Fungsi ini akan membuat permintaan HTTP ke endpoint Inference Serverless Linux-Console.net.

def call_llm(prompt):
    data = {
        "model": "llama3.3-70b-instruct",
        "messages": [
            {
                "role": "user",
                "content": prompt
            }
        ],
        "max_tokens": 500
    }

    response = requests.post(llm_url, headers=headers, json=data)
    message = response.json()['choices'][0]['message']['content']
    return message

Fungsi call_llm mengambil sebuah prompt, melakukan panggilan ke model menggunakan permintaan HTTP, dan mengembalikan teks respons.

Langkah 3 — Mengidentifikasi jika Prompt Membutuhkan Dasar

Tidak semua permintaan perlu didasarkan pada pencarian web. Misalnya, jika Anda meminta resep sup, Anda mungkin ingin LLM memberikan resep tanpa melakukan pencarian web. API pencarian web Anda mungkin memiliki batasan atau biaya yang ingin Anda kurangi. Pencarian web juga dapat menambah latensi, jadi sebaiknya LLM Anda hanya melakukan kueri bila diperlukan.

Untuk memeriksa apakah pencarian web diperlukan, Anda memerlukan fungsi yang memanggil LLM untuk menanyakan apakah input pengguna perlu dilengkapi dengan hasil dari pencarian web.

def needs_web_grounding(query):

    prompt = f"Does the following prompt need information more recent than December 2023 to answer correctly?. Answer only YES or NO.\nQuestion: {query}\nAnswer:"

    judgement = call_llm(prompt)

    return judgement.strip().upper().startswith("YES")

Fungsi needs_web_grounding menanyakan kepada model apakah prompt pengguna membutuhkan informasi yang lebih terbaru daripada batas pengetahuan model Llama 3.3 70B yang kami gunakan pada Desember 2023. Jika jawaban dari LLM adalah 'YA', fungsi ini akan mengembalikan objek boolean True. Jika tidak, ia akan mengembalikan objek False. Kami akan menggunakan jawaban dari fungsi ini untuk menentukan apakah perlu melakukan pencarian web atau tidak.

Jika Anda memanggil fungsi needs_web_grounding pada pertanyaan “Siapa presiden saat ini?”, itu akan mengembalikan “YA” (Benar), dan jika Anda memanggilnya pada “Mengapa langit berwarna biru?”, itu akan mengembalikan “TIDAK” (Salah).

Prompt dalam fungsi needs_web_grounding tidak akan selalu mampu mengidentifikasi dengan akurat apakah suatu prompt membutuhkan pencarian web atau tidak. Misalnya, jika suatu negara mengganti ibu kotanya, model mungkin berpikir bahwa negara jarang mengganti ibu kotanya dan bisa mengembalikan jawaban 'TIDAK'. Ada banyak contoh serupa yang membuat mengidentifikasi kebutuhan pencarian web secara akurat menjadi masalah yang kompleks dengan banyak lapisan kedalaman. Prompt sederhana yang digunakan di atas cukup baik untuk tujuan tutorial ini. Dalam lingkungan produksi, Anda sebaiknya menyesuaikan prompt ini agar sesuai dengan tingkat kesalahan yang dapat diterima untuk aplikasi Anda.

Langkah 4 — Menerapkan Pencarian Web

Sekarang, Anda perlu membuat fungsi pencarian web yang akan mengambil kueri pencarian dan mengembalikan tiga hasil teratas dari kueri pencarian tersebut.

def search_web(search_query): 
    params = {
        'engine': 'duckduckgo_light',
        'q': search_query,
        'api_key': SERP_API_KEY,
    }

    response = requests.get('https://serpapi.com/search', params=params)
    data = response.json()

    return data["organic_results"][:3]

Fungsi search_web mengambil input pengguna dan menggunakan SERP_API_KEY yang telah didefinisikan pada langkah 2 untuk melakukan pencarian web Duck Duck Go dengan input pengguna melalui Serp API. Fungsi ini kemudian mengembalikan detail dari tiga hasil pencarian teratas. Anda akan mengambil hasil yang dikembalikan dan menambahkannya ke prompt pengguna sebelum membuat LLM memproses respons.

Langkah 5 — Menulis Logika Alur Kerja

Sekarang, Anda perlu menulis sebuah fungsi yang akan memanggil semua fungsi lain yang telah Anda tulis. Fungsi ini perlu mengambil input dari pengguna, memanggil fungsi needs_web_grounding untuk menentukan apakah pencarian web diperlukan, kemudian baik mencari di web dan menambahkan konteks ke prompt atau memanggil LLM tanpa konteks tambahan.

def answer_with_web_grounding(user_input):

    if needs_web_grounding(user_input):
        print("Web search needed; fetching info...")
        search_results = search_web(user_input)
        prompt = f"Please respond to the user's query: {user_input}\n\nYou may use the following web search results as context in your answer: {search_results}"
    
    else:
        print("Web search NOT needed; answering from LLM knowledge.")
        prompt = user_input
      
    answer = call_llm(prompt)
    return answer

Jika fungsi needs_web_grounding mengembalikan respons boolean True, fungsi tersebut akan menulis prompt yang meminta LLM untuk menggunakan hasil pencarian web sebagai konteks dalam jawabannya. Jika tidak, fungsi hanya akan menggunakan input pengguna sebagai prompt.

Sekarang, ketika Anda menjalankan kode berikut:

answer_with_web_grounding("Who is the current president?")

Anda akan mendapatkan respons yang mirip dengan yang di bawah ini.

The current president of the United States is Donald J. Trump. He was sworn in as the 47th president on January 20, 2025, and his current term is set to end on January 20, 2029.

Hasil ini tidak hanya terbaru, tetapi tanggal pengangkatan dan tanggal berakhirnya masa jabatan menunjukkan tingkat detail yang mungkin tidak dikembalikan dengan benar jika Anda hanya menggunakan model saja.

Meningkatkan Alur Kerja Pematangan Web Anda

Untuk meningkatkan alur kerja LLM ini untuk aplikasi Anda, langkah berikutnya adalah memperbarui metode untuk menentukan apakah prompt membutuhkan pencarian web atau tidak berdasarkan kebutuhan aplikasi Anda. Jika aplikasi Anda hanya dimaksudkan untuk menemukan informasi konser yang akan datang, Anda mungkin memerlukan pencarian web setiap saat. Jika tidak, jika tujuannya hanya untuk menangkap persentase jawaban yang sudah usang, lanjutkan dengan alur yang telah Anda tulis dalam tutorial ini. Prompt dalam fungsi needs_web_grounding dapat disesuaikan untuk tujuan ini.

Selanjutnya, membersihkan hasil keluaran dari pencarian dapat mengurangi jumlah token yang digunakan dan meningkatkan akurasi respons. Fungsi search_web saat ini mengembalikan objek JSON yang terlihat seperti ini:

[
  {
    "position": 1,
    "title": "President Donald J. Trump - The White House",
    "link": "https://www.whitehouse.gov/administration/donald-j-trump/",
    "displayed_link": "www.whitehouse.gov/administration/donald-j-trump/",
    "snippet": "President Trump built on his success in private life when he entered into politics and public service. He remarkably won the Presidency in his first ever run for any political office.",
    "favicon": "https://external-content.duckduckgo.com/ip3/www.whitehouse.gov.ico"
  },
  {
    "position": 2,
    "title": "Donald Trump Sworn In as 47th President in Capitol Ceremony ... - Yahoo",
    ...
  }
]

Banyak dari bidang ini, termasuk "position", "link", "displayed_link", dan lain-lain mungkin tidak diperlukan. Periksa format hasil yang dikembalikan oleh API pencarian Anda, dan buat fungsi yang menghapus bidang yang tidak perlu untuk mengurangi jumlah informasi yang Anda sertakan dalam konteks. Bisa juga menguntungkan untuk mengekode JSON ke dalam format TOON guna mengurangi jumlah token yang digunakan.

Anda mungkin akan menemukan bahwa jawaban untuk banyak pertanyaan tidak termasuk dalam potongan hasil pencarian. Misalnya, jika Anda menanyakan waktu pertandingan Seahawks berikutnya, mungkin diketahui harinya tetapi tidak waktunya tanpa akses ke konten dari halaman tautan yang sebenarnya.

answer_with_web_grounding("What time is the next Seahawks game?")
The next Seahawks game is today, Sunday, December 28, 2025, against the Panthers. However, the exact time of the game is not specified in the provided search results. I recommend checking the official Seattle Seahawks website...

Salah satu cara untuk memperbaiki ini adalah dengan menambahkan langkah tambahan di mana alur kerja menggunakan pustaka Python seperti Beautiful Soup untuk mengambil konten dari halaman web dan menyertakan konteksnya dalam kueri. Setelah menambahkan fungsionalitas tambahan itu, konteks dari halaman jadwal resmi Seahawks disertakan, dan model dapat mengetahui bahwa pertandingan hari ini sudah selesai dan hari serta waktu pasti untuk pertandingan berikutnya masih belum dijadwalkan.

The next Seahawks game is scheduled for Week 18, but the date, time, and location are still "TBD" (to be determined) as it is against the 49ers at Levi's Stadium.

Untuk praktik terbaik keamanan, hapus kunci API dan URL yang dikodekan secara langsung dari kode Anda. Salah satu opsi adalah menyimpannya sebagai variabel lingkungan dan mengimpor mereka ke dalam skrip.

Terakhir, semua alur kerja LLM harus memiliki penanganan kesalahan yang memadai di dalam kodenya untuk mengantisipasi sifat non-determinis dan tidak dapat diprediksi yang melekat dalam aplikasi AI.

Pertanyaan yang Sering Diajukan

Apakah saya bisa mengaktifkan web grounding dalam percakapan, bukan hanya pada satu prompt saja?

Ya, jika Anda ingin memiliki format percakapan di mana pengguna dapat mengajukan pertanyaan lanjutan, Anda dapat menyertakan konteks dalam percakapan itu sendiri. Jika ini menambahkan terlalu banyak token ke dalam konteks percakapan, pertimbangkan untuk menghapus entri percakapan sebelumnya untuk mempersingkat jumlah token jika aplikasi Anda memungkinkan hal itu.

Menambahkan dasar web meningkatkan latensi karena pencarian web memakan waktu. Adakah cara untuk mempercepatnya?

Ya, Anda dapat menjalankan panggilan LLM secara asinkron dengan mengirimkan prompt pengguna ke LLM tanpa hasil pencarian dalam konteks pada saat yang sama ketika Anda mengirimkan panggilan yang menanyakan kepada LLM apakah prompt pengguna harus didasarkan pada pencarian web. Setelah hasilnya dikembalikan, jika pencarian web diperlukan, Anda dapat melakukan pencarian web, dan memanggil LLM lagi dengan konteks dari pencarian web tersebut. Ini akan memungkinkan Anda mengurangi latensi untuk panggilan LLM yang tidak memerlukan pencarian web. Namun, ini akan menghabiskan token tambahan karena Anda akan membuang respons LLM pertama jika pencarian web diperlukan.

Pencarian web menghabiskan terlalu banyak token. Apakah ada cara untuk mengurangi jumlah token yang digunakan untuk semua panggilan ini?

Ya, salah satu caranya adalah menggunakan model yang lebih kecil dalam fungsi needs_web_grounding Anda. Anda mungkin menemukan bahwa Anda tidak memerlukan model dengan 70 miliar parameter untuk menentukan apakah sebuah jawaban membutuhkan pencarian web atau tidak. Jika Anda menggunakan model yang lebih kecil, Anda mungkin akan menemukan bahwa biayanya lebih murah dan prosesnya lebih cepat.

Kesimpulan

Web grounding adalah alat yang kuat yang dapat meningkatkan akurasi aplikasi AI Anda dan dapat diintegrasikan langsung ke dalam alur kerja generasi berbasis penarikan data lainnya yang telah Anda siapkan. Ini memungkinkan Anda mendapatkan hasil yang akurat dan terkini dari model-model lama atau yang lebih kecil yang mungkin telah dilatih dengan informasi yang kurang terbaru.

Dalam tutorial ini, Anda menggunakan endpoint Serp API untuk melakukan pencarian web melalui Duck Duck Go dan menambahkan prompt Anda dengan konteks dari hasil pencarian. Langkah berikutnya adalah menyesuaikan implementasinya untuk aplikasi Anda.

Terima kasih telah belajar bersama Komunitas Linux-Console.net.