# LangChain ve LlamaIndex'te web arama: bir araç ve bir retriever

> LlamaIndex ve LangChain için web arama: her sayfa için Document döndüren search_web aracı ve bir FunctionTool. KYC yok, kripto ile ödeme.

- URL: https://llmwebsearch.com/tr/docs/langchain/
- Son güncelleme: 2026-10-22
- Yayıncı: LLMWebSearch (https://llmwebsearch.com)

Çoğu framework'ü iki yapı kapsar. Bir araç, bir agent'ın ne zaman arama yapacağına karar vermesini sağlar. Bir retriever, canlı web'i bir retrieval chain'e bağlar; burada okunan her sayfa, metadata'sında URL'siyle birlikte bir document olur.

**Kısa yanıt — LangChain veya LlamaIndex'e canlı web aramayı nasıl eklerim?**

**LLMWebSearch**'in `/search` çağrısını bir LangChain `@tool`, bir LangChain retriever veya bir LlamaIndex `FunctionTool` içine sarın. Her biri, en iyi 3 sayfa Markdown olarak ve URL'leriyle birlikte, alıntılamaya hazır sıralı kaynaklar döndürür. Kuracak paketimiz yok: aşağıdaki kod entegrasyonun kendisidir. Bir arama 1 kredi tutar, Ekim 2026 itibarıyla $1,20/1K arama başlangıçlı. KYC yok; kripto ile ödeme yapın.

## Her sarmalayıcı ne işe yarar

| Özellik | Değer |
| --- | --- |
| LangChain aracı | Bir agent, web'e ihtiyaç duyduğuna karar verdiğinde `search_web` çağrısını yapar |
| LangChain retriever | Bir chain, sormadan her soru için güncel document'lar getirir |
| LlamaIndex FunctionTool | LlamaIndex agent'ları için aynı `search_web` fonksiyonu |
| Paketler | `langchain-core` veya `llama-index-core`, artı `requests` |
| Anahtar | Ortam değişkeninde `LLMWEBSEARCH_API_KEY` |
| Faturalama | Bir kredi bir aramayı karşılar: en fazla 20 sıralı sonuç, ilk 3'ün sayfaları okunur ve Markdown olarak döndürülür. 4 ile 10 arası sayfa okumak 2 kredi eder. Hata ile biten bir çağrı hiçbir ücrete tabi değildir |

## Bir LangChain agent'ı için arama aracını nasıl oluştururum?

Bir fonksiyonu `langchain_core.tools` içinden `@tool` ile dekore edin. LangChain, aracı modele tanımlamak için adı, tiplenmiş argümanları ve docstring'i okur; bu yüzden docstring'i kısa ve kesin tutun. Fonksiyon, numaralı kaynaklar içeren tek bir string döndürür; bu her sohbet modeline uyar ve URL'leri metnin yanında tutar.

Test etmek için doğrudan `.invoke()` ile çağırın, ardından agent'ınızın tools listesine geçirin.

*LangChain aracı: 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])

```

## Canlı web'i retriever olarak nasıl kullanırım?

`BaseRetriever` alt sınıfını oluşturun ve okunan her sayfa için bir `Document` döndürün. Sayfa metni `page_content` içine gider; URL, başlık, sıra ve tarih `metadata` içine gider; kaynaklarını alıntılayan chain'ler bunları orada arar. İçeriksiz sonuçlar atlanır, çünkü bir retriever modelin alıntılayabileceği metni teslim etmelidir.

Bir retriever her soruda çalışır. Bu, güncel konular hakkında soru-cevap chain'i için doğrudur ve çoğu turun arama gerektirmediği bir sohbet için savurgandır; bu durumda aracı kullanın.

*LangChain retriever: 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))

```

## Aynı aramayı bir LlamaIndex agent'ına nasıl veririm?

Sade bir fonksiyon yazın ve `llama_index.core.tools` içinden `FunctionTool.from_defaults` ile sarmalayın. LlamaIndex, aracın adını ve açıklamasını fonksiyonun adı, imzası ve docstring'inden oluşturur. Aracı çağırmak, `content` alanı agent'ın okuyacağı metin olan bir `ToolOutput` döndürür.

Fonksiyon LangChain'dekiyle aynıdır; böylece her iki framework'ü kullanan bir ekip onu paylaşabilir.

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

```

## Bağlam penceresini nasıl kontrol altında tutarım?

Sonradan kırpmak yerine API çağrısında `max_chars` ayarlayın: daha az veri taşınır ve framework uzun sürümü hiç tutmaz. Sayfa başına 5.000 karakter ve 3 sayfa yaklaşık 4.000 token eder; çoğu model için rahat bir değerdir.

Canlı web'i kendi belgelerinizle birleştiren retrieval zincirlerinde web belgelerine daha düşük ağırlık verin ya da ayrı bir prompt bölümü ayırın. Web sayfaları değişir ve yanlış olabilir; kendi belgeleriniz genellikle referanstır.

## Retriever'ın döndürdüklerini bir vektör veritabanında saklayabilir miyim?

Evet, bize göre saklayabilirsiniz. Sorgularınız veya API'nin döndürdükleri üzerinde hiçbir model eğitmeyiz ve sonuçları saklamaya karşı kendi kurallarımızı eklemeyiz; sayfalarını okuduğunuz sitelerin hakları hâlâ geçerlidir. Her chunk ile birlikte URL'yi ve `published_at` saklayın; böylece agent sayfayı kaynak gösterebilir ve siz de eskien chunk'ları atabilirsiniz.

Çoğu ekip sık sorulan soruların web sonuçlarını bir gün veya bir hafta önbelleğe alır. Bu, tekrarlanan aramaları azaltır ve kaçınılan her arama bir kredi tasarrufudur.

## LangChain ve LlamaIndex: sık sorulan sorular

### langchain-llmwebsearch paketi var mı?

Hayır. Hiçbir paket yayınlamıyoruz. Bu sayfadaki kod sahiplenebileceğiniz kadar kısa: kopyalayın, varsayılanları değiştirin ve deponuzda tutun.

### Aracı async yapabilir miyim?

Evet. `requests` yerine `httpx.AsyncClient` kullanın ve fonksiyonu `async def` ile tanımlayın. LangChain'in `@tool` dekoratörü async fonksiyonları doğrudan sarar; LlamaIndex'te async sürümü `FunctionTool.from_defaults` içine `async_fn` olarak geçirin.

### Agent'ın başka bir yerde bulduğu sayfayı nasıl okurum?

URL'leri `https://llmwebsearch.com/api/v1/extract` endpoint'ine gönderen ikinci bir araç ekleyin. URL'sini zaten bildiğiniz sayfaları okumak, içerikle birlikte döndürülen her başlamış 3 sayfalık grup için 1 kredi eder, çağrı başına en fazla 20 URL; reddedilen veya başarısız olan URL'ler sayılmaz. [extract referansı](https://llmwebsearch.com/tr/docs/extract/) isteği gösterir.

---

LLMWebSearch: LLMWebSearch, AI ajanları için bir web arama API'sidir; sıralanmış sonuçları en iyi sayfaların Markdown içeriğiyle birlikte döndürür ve kripto ile ödenir, kimlik yüklemesi gerekmez. $1,20/1K arama kredilik ön ödemeli krediler hiç süresi dolmaz. KYC yok — kimlik yok, selfie yok, belge yok. Kripto ile ödeme.
