試す
5,000検索
$9.25
$1.85/1K検索
- 1つのエージェントに組み込む
- 最大パックと同じAPI
- クレジットの有効期限なし
ユースケース · 検索拡張生成 · 最新のソース
ベクトルインデックスには先月読み込んだものが入っています。今日のWebが語る内容が必要な質問もあります。ライブWeb RAGは質問時に取得します。検索を1回行い、上位ページをMarkdownで取得し、いくつかのチャンクをプロンプトに入れ、各ページへの引用を返します。
クイック回答
ライブWeb検索結果でRAGを行うにはどうすればよいですか?
質問時にWeb検索を実行し、上位ページを読み取り、チャンクに分割し、最も関連性の高いものを保持して、番号付きの引用付きで回答するようモデルに指示します。LLMWebSearchが最初の2つのステップを1回の呼び出しで処理します。ランク付けされた結果と最初の3ページのMarkdownを、$1.20/1K検索から1クレジットで提供します。KYC不要、暗号資産で支払い。
検索拡張生成の取得ステップが、自分のインデックス内の検索ではなくWeb検索であるものです。質問は検索APIに送られ、APIがページを返し、モデルがそれらのページから回答します。
このパターンは、価格、リリース、ルール、スケジュール、ニュースなど変化する事柄に関する質問に適しています。自分のドキュメントがカバーしていなかったロングテールな質問にも適しています。コストは質問ごとに検索1回、最初の検索で外れた場合は2回です。
安定していて自分のものであるものは保存し、変化するものは取得します。製品マニュアル、社内ポリシー、自分のドキュメントはベクトルインデックスに入れ、スケジュールに従って更新します。競合の価格、規制、ニュースはライブ取得に適しています。
多くのチームは両方を組み合わせています。まず自分のインデックスを検索し、良い一致がない場合や、質問に最近の日付が含まれる場合にのみWebを呼び出します。
取得したページを保持することにした場合、当社の立場を明記します:当社はあなたの検索クエリやAPIが返す内容でモデルを学習させることはなく、結果の保存を禁じる独自のルールも設けていません。ただし、あなたが読むページのサイトの権利は引き続き適用されます。コンテンツの恒久的なコピーを作成する前に、各サイトの利用規約を確認してください。
各ページを見出しで分割し、長いセクションは固定長に切り詰めます。見出しは#で始まる行なので、Markdownなら簡単です。引用が分割後も残るよう、各チャンクに元のURLとタイトルを保持します。
以下の例は、検索し、3ページを読み取り、チャンクに分割し、質問と最も多くの単語を共有する6つのチャンクを選びます。本番環境では単語数の計算を埋め込みモデルに置き換えてください。構造は同じです。
import os
import re
import requests
API = "https://llmwebsearch.com/api/v1/search"
HEADERS = {"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]}
def live_chunks(query, read=3, chunk_len=1200):
"""Search, then cut each page that was read into heading-based chunks tagged with its source."""
body = {"q": query, "max_results": 5, "read": read, "max_chars": 12000}
results = requests.post(API, headers=HEADERS, json=body, timeout=60).json()["results"]
chunks = []
for r in results:
if r.get("content_status") != "ok":
continue
for section in re.split(r"\n(?=#{1,3} )", r["content"]):
section = section.strip()
for start in range(0, len(section), chunk_len):
chunks.append({"url": r["url"], "title": r["title"], "text": section[start:start + chunk_len]})
return chunks
def top_chunks(chunks, question, k=6):
"""A plain keyword score; swap in your embedding model for better ranking."""
words = set(re.findall(r"\w{4,}", question.lower()))
def score(chunk):
return sum(1 for w in re.findall(r"\w{4,}", chunk["text"].lower()) if w in words)
return sorted(chunks, key=score, reverse=True)[:k]
def build_prompt(question):
picked = top_chunks(live_chunks(question), question)
urls = list(dict.fromkeys(c["url"] for c in picked))
blocks = [f"[{urls.index(c['url']) + 1}] {c['title']}\n{c['text']}" for c in picked]
sources = "\n".join(f"[{i}] {u}" for i, u in enumerate(urls, 1))
return (
"Use only the context to answer and cite sources as [n].\n\n"
+ "\n\n".join(blocks)
+ f"\n\nSources:\n{sources}\n\nQuestion: {question}"
)3ページが良い出発点で、検索を1クレジットに抑えられます。事実に関する質問のほとんどは、良いクエリの最初の2〜3ページで回答できます。
チャンカーがテキストの大半を結局は捨てるため、チャットエージェントで使うより長いページを要求しましょう。1ページあたりmax_charsを10,000〜15,000にすると、ランカーが選ぶのに十分な情報が得られます。回答が既知の1つのサイトに依存する場合は、ページを増やすのではなくinclude_domainsでそのサイトを追加します。
プロンプト内の情報源に番号を付け、回答にその番号を含めるよう指示します。短い指示でうまく機能します。コンテキストのみを使い、各主張を[n]として引用し、コンテキストが質問をカバーしていない場合はその旨を述べるよう指示します。
情報源リストはプロンプトの最後に置き、番号ごとに1つのURLを記載します。その後、インターフェースで[n]をリンクとして表示します。ユーザーは確認できる回答を信頼し、誤った引用はレビューで簡単に見つけられます。
そのページをスキップし、他のページを使います。各結果にはcontent_statusが付き、テキストがあるのはokの結果のみです。ページが欠けているのは当社のリーダーはrobots.txtを尊重します。LLMWebSearchとして名乗り、サイトが自身またはすべてのロボット向けに定めたルールに従い、読み取りを許可されていないページのコンテンツは除外しますためです。
検索のすべてのページが空で返ってきた場合は、別のクエリで1回再試行するか、開いていることがわかっているサイトに対してinclude_domainsを追加します。サイトが当社のリーダーを拒否した場合、結果はコンテンツなしで、サイトのステータスとともに返されます。当社がCAPTCHAを解いたり、アカウントにサインインしたり、ブロックやペイウォールを回避したりすることは一切ありません。
ほとんどの場合、質問ごとに検索1回です。月に5,000件の質問に回答するサポートアシスタントで、5件に1件の質問で2回目の検索を行う場合、約6,000回の検索を使用します。$41.25の25,000検索で、その4か月分をまかなえます。
モデルは送信したチャンクも読み取ります。1,200文字のチャンク6つで質問ごとに約2,000トークンが追加され、これはチャンクのサイズと数で制御できます。
ほとんどのパイプラインでは1質問あたり1クレジットです。検索クレジットに有効期限はありません。今月使わなかった分は来年も残ります。
5,000検索
$9.25
$1.85/1K検索
25,000検索
$41.25
$1.65/1K検索
100,000検索
$145
$1.45/1K検索
全プラン共通: 上位3ページをMarkdownとして読み取り · 国、言語、時間、ドメインのフィルター · 失敗した呼び出しは課金なし · クレジットの有効期限なし
はい。LangChainとLlamaIndexのページでは、検索をretrieverとして、またツールとしてラップしています。
はい、extractエンドポイントで可能です。URLをすでに持っているページを読む場合は、コンテンツ付きで返される3ページごとの開始グループにつき1クレジットで、1回の呼び出しにつき最大20 URLです。拒否されたURLや失敗したURLはカウントされません。
いいえ。各呼び出しは1行のログを残します。時刻、アカウント、検索クエリの先頭60文字、返された結果数とページ数、クレジットです。行は30日後に削除されます。読み取ったページのコンテンツは保存されません。アカウント番号、注文、入金、クレジット合計はアカウントが存在する間、その後は会計法が求める期間のみ保持されます。当局への記録提供は法律が当社に義務付ける場合に限られます。
はい。languageとcountryを設定します。例えばドイツからのドイツ語の結果にはlanguage=deとcountry=deを指定します。
$1.20/1K検索から · KYC不要
APIキーを取得