Tanpa KYC — tanpa ID, tanpa selfie, tanpa dokumen. Bayar dengan kripto: BTC, USDT, USDC, ETH, SOL, LTC
Bahasa: Bahasa Indonesia
Dapatkan API key

Docs · LangChain · LlamaIndex

Pencarian web di LangChain dan LlamaIndex: tool dan retriever

Dua bentuk mencakup sebagian besar framework. Tool memungkinkan agen memutuskan kapan harus mencari. Retriever menghubungkan web langsung ke rantai retrieval, di mana setiap halaman yang dibaca menjadi dokumen dengan URL-nya di metadata.

Terakhir diperbarui: · 4 menit baca

Jawaban singkat

Bagaimana cara menambahkan pencarian web langsung ke LangChain atau LlamaIndex?

Bungkus panggilan /search LLMWebSearch dalam @tool LangChain, retriever LangChain, atau FunctionTool LlamaIndex. Masing-masing mengembalikan sumber berperingkat dengan 3 halaman teratas sebagai Markdown beserta URL-nya, siap untuk sitasi. Tidak ada paket dari kami yang perlu dipasang: kode di bawah ini adalah integrasinya. Satu pencarian berbiaya 1 kredit, mulai dari US$1,20/1K pencarian per Oktober 2026. Tanpa KYC; bayar dengan kripto.

Fungsi masing-masing wrapper

Tool LangChainAgen memanggil search_web saat memutuskan perlu web
Retriever LangChainRantai mengambil dokumen baru untuk setiap pertanyaan, tanpa bertanya
FunctionTool LlamaIndexFungsi search_web yang sama, untuk agen LlamaIndex
Paketlangchain-core atau llama-index-core, plus requests
KeyLLMWEBSEARCH_API_KEY di environment
PenagihanSatu kredit membayar satu pencarian: hingga 20 hasil berperingkat, dengan halaman dari 3 hasil teratas dibaca dan dikembalikan sebagai Markdown. Membaca 4 hingga 10 halaman menjadi 2 kredit. Panggilan yang berakhir dengan error tidak dikenakan biaya

Bagaimana cara membuat tool pencarian untuk agen LangChain?

Hiasi fungsi dengan @tool dari langchain_core.tools. LangChain membaca nama, argumen bertipe, dan docstring untuk mendeskripsikan tool ke model, jadi buat docstring tetap singkat dan tepat. Fungsi mengembalikan satu string dengan sumber bernomor, yang cocok untuk setiap model chat dan menjaga URL tetap di samping teks.

Panggil langsung dengan .invoke() untuk mengujinya, lalu masukkan ke daftar tools agen Anda.

Tool LangChain: search_web
import os

import requests
from langchain_core.tools import tool

API = "https://llmwebsearch.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]}


@tool
def search_web(query: str, read: int = 3) -> str:
    """Search the live web. Returns numbered sources with URLs; the first `read` include page text."""
    body = {"q": query, "max_results": 5, "read": max(0, min(read, 10)), "max_chars": 5000}
    resp = requests.post(API, headers=HEADERS, json=body, timeout=60)
    resp.raise_for_status()
    parts = []
    for i, r in enumerate(resp.json()["results"], start=1):
        text = r["content"] if r["content_status"] == "ok" else "(snippet only) " + r["snippet"]
        parts.append(f"[{i}] {r['title']} - {r['url']}\n{text}")
    return "\n\n".join(parts)


print(search_web.invoke({"query": "postgres connection pool size"})[:500])

Bagaimana cara menggunakan web langsung sebagai retriever?

Subclass BaseRetriever dan kembalikan satu Document per halaman yang dibaca. Teks halaman dimasukkan ke page_content; URL, judul, peringkat, dan tanggal dimasukkan ke metadata, tempat rantai yang menyitasi sumbernya mencarinya. Hasil tanpa konten dilewati, karena retriever seharusnya menyerahkan teks yang dapat dikutip model.

Retriever berjalan pada setiap pertanyaan. Itu tepat untuk rantai question-answering tentang topik terkini, dan boros untuk chat di mana sebagian besar giliran tidak memerlukan pencarian; gunakan tool dalam kasus itu.

Retriever LangChain: LLMWebSearchRetriever
import os
from typing import List

import requests
from langchain_core.callbacks import CallbackManagerForRetrieverRun
from langchain_core.documents import Document
from langchain_core.retrievers import BaseRetriever


class LLMWebSearchRetriever(BaseRetriever):
    """Live web search results as Documents, one per page that was read."""

    max_results: int = 5
    read: int = 3
    max_chars: int = 6000

    def _get_relevant_documents(self, query: str, *, run_manager: CallbackManagerForRetrieverRun) -> List[Document]:
        resp = requests.post(
            "https://llmwebsearch.com/api/v1/search",
            headers={"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]},
            json={"q": query, "max_results": self.max_results, "read": self.read, "max_chars": self.max_chars},
            timeout=60,
        )
        resp.raise_for_status()
        docs = []
        for r in resp.json()["results"]:
            if r["content_status"] != "ok":
                continue
            meta = {"source": r["url"], "title": r["title"], "position": r["position"], "published_at": r.get("published_at")}
            docs.append(Document(page_content=r["content"], metadata=meta))
        return docs


retriever = LLMWebSearchRetriever(read=3)
for doc in retriever.invoke("pgbouncer transaction mode limitations"):
    print(doc.metadata["position"], doc.metadata["source"], len(doc.page_content))

Bagaimana cara memberikan pencarian yang sama ke agen LlamaIndex?

Tulis fungsi biasa dan bungkus dengan FunctionTool.from_defaults dari llama_index.core.tools. LlamaIndex membangun nama dan deskripsi tool dari nama fungsi, signature, dan docstring. Memanggil tool mengembalikan ToolOutput yang content-nya adalah teks yang akan dibaca agen.

Fungsinya sama dengan yang untuk LangChain, sehingga tim yang menggunakan kedua framework dapat memakainya bersama.

LlamaIndex: FunctionTool
import os

import requests
from llama_index.core.tools import FunctionTool


def search_web(query: str, read: int = 3) -> str:
    """Search the live web and return numbered sources; the first `read` include their page text."""
    resp = requests.post(
        "https://llmwebsearch.com/api/v1/search",
        headers={"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]},
        json={"q": query, "max_results": 5, "read": max(0, min(read, 10)), "max_chars": 5000},
        timeout=60,
    )
    resp.raise_for_status()
    parts = []
    for i, r in enumerate(resp.json()["results"], start=1):
        text = r["content"] if r["content_status"] == "ok" else "(snippet only) " + r["snippet"]
        parts.append(f"[{i}] {r['title']} - {r['url']}\n{text}")
    return "\n\n".join(parts)


search_tool = FunctionTool.from_defaults(fn=search_web)
print(search_tool.metadata.name)
print(search_tool.call(query="postgres connection pool size").content[:300])

Bagaimana cara menjaga context window tetap terkendali?

Setel max_chars pada panggilan API alih-alih memangkasnya setelahnya: lebih sedikit data yang berpindah dan framework tidak pernah menyimpan versi panjangnya. 5.000 karakter per halaman dan 3 halaman sekitar 4.000 token, nyaman untuk sebagian besar model.

Untuk retrieval chain yang menggabungkan web langsung dengan dokumen Anda sendiri, beri dokumen web bobot lebih rendah atau bagian prompt terpisah. Halaman web berubah dan bisa salah; dokumen Anda sendiri biasanya menjadi acuan.

Bisakah saya menyimpan apa yang dikembalikan retriever ke vector database?

Bisa, sejauh yang kami tahu. Kami tidak melatih model apa pun dengan kueri Anda atau dengan apa yang dikembalikan API, dan kami tidak menambahkan aturan kami sendiri yang melarang penyimpanan hasil; hak situs yang halaman-halamannya Anda baca tetap berlaku. Simpan URL dan published_at bersama setiap chunk, agar agent dapat mengutip halaman itu dan Anda dapat membuang chunk yang menua.

Sebagian besar tim meng-cache hasil web dari pertanyaan yang sering muncul selama sehari atau seminggu. Itu memangkas pencarian berulang, dan setiap pencarian yang dihindari berarti satu kredit yang dihemat.

LangChain dan LlamaIndex: pertanyaan umum

Apakah ada paket langchain-llmwebsearch?

Tidak. Kami tidak menerbitkan paket apa pun. Kode di halaman ini cukup singkat untuk Anda miliki sendiri: salin, ubah nilai default-nya, dan simpan di repositori Anda.

Bisakah saya membuat tool-nya async?

Bisa. Ganti requests dengan httpx.AsyncClient dan definisikan fungsi dengan async def. Dekorator @tool milik LangChain mendekorasi fungsi async secara langsung; di LlamaIndex, berikan versi async-nya ke FunctionTool.from_defaults sebagai async_fn.

Bagaimana cara membaca halaman yang ditemukan agent di tempat lain?

Tambahkan tool kedua yang memposting URL ke https://llmwebsearch.com/api/v1/extract. Membaca halaman yang URL-nya sudah Anda miliki dikenakan 1 kredit untuk setiap grup 3 halaman yang mulai dikembalikan beserta kontennya, hingga 20 URL per panggilan; URL yang ditolak atau gagal tidak dihitung. Referensi extract menunjukkan request-nya.

Mulai dari US$1,20/1K pencarian · tanpa KYC

Dapatkan API key