# Pencarian web di LangChain dan LlamaIndex: tool dan retriever

> Pencarian web LangChain dan LlamaIndex: tool search_web, retriever satu Document per halaman, dan FunctionTool LlamaIndex. Tanpa KYC, bayar dengan kripto.

- URL: https://llmwebsearch.com/id/docs/langchain/
- Terakhir diperbarui: 2026-10-22
- Penerbit: LLMWebSearch (https://llmwebsearch.com)

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.

**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

| Atribut | Nilai |
| --- | --- |
| Tool LangChain | Agen memanggil `search_web` saat memutuskan perlu web |
| Retriever LangChain | Rantai mengambil dokumen baru untuk setiap pertanyaan, tanpa bertanya |
| FunctionTool LlamaIndex | Fungsi `search_web` yang sama, untuk agen LlamaIndex |
| Paket | `langchain-core` atau `llama-index-core`, plus `requests` |
| Key | `LLMWEBSEARCH_API_KEY` di environment |
| Penagihan | Satu 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*

```python
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*

```python
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*

```python
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](https://llmwebsearch.com/id/docs/extract/) menunjukkan request-nya.

---

LLMWebSearch: LLMWebSearch adalah API pencarian web untuk agen AI yang mengembalikan hasil berperingkat beserta konten halaman teratas dalam Markdown, dibayar dengan kripto tanpa unggah ID. Kredit prabayar mulai dari US$1,20/1K pencarian tidak pernah kedaluwarsa. Tanpa KYC — tanpa ID, tanpa selfie, tanpa dokumen. Bayar dengan kripto.
