试用
5,000 次搜索
US$9.25
US$1.85/千次搜索
- 接入一个智能体
- 与最大积分包相同的 API
- 积分永不过期
用例 · 检索增强生成 · 新鲜来源
向量索引里存的还是你上个月加载的内容。有些问题需要知道网络今天怎么说。实时网络 RAG 在提问时检索:一次搜索,把排名靠前的页面读成 Markdown,取几块放入 prompt,并给出指向每页的引用。
快速回答
如何用实时网络搜索结果做 RAG?
提问时运行一次网络搜索,读取排名靠前的页面,把它们切分成块,保留最相关的若干块,再让模型带编号引用作答。LLMWebSearch 一次调用就完成前两步:返回排序后的结果,并把前 3 页读成 Markdown,消耗 1 个积分,US$1.20/千次搜索 起。无需 KYC;用加密货币支付。
它是一种检索增强生成,其中检索步骤是一次网络搜索,而不是在自有索引里查找。问题发给搜索 API,API 返回页面,模型基于这些页面作答。
这种模式适合问会变化的事情:价格、发布、规则、日程和新闻。它也适合你自己的文档从未覆盖过的长尾问题。成本是每个问题一次搜索,第一次没找到时则两次。
稳定且属于你自己的内容就存储;会变化的内容就抓取。产品手册、内部政策和自有文档适合放进向量索引,按计划刷新。竞品价格、法规和新闻适合实时检索。
很多团队两者结合:先搜自己的索引,只有在索引里没有好的匹配,或问题提到近期日期时,才调用网络。
如果你决定保留检索到的页面,请注意我们的立场:我们不会用你的查询或 API 返回的内容训练任何模型,也不会自行添加任何禁止存储结果的规则;你读取的页面所属网站的权利仍然适用。在为其内容建立永久副本之前,请先查看每个网站的条款。
按标题拆分每个页面,再把过长的段落切到固定长度。Markdown 让这件事很容易,因为标题就是以 # 开头的行。在每个块上保留来源 URL 和标题,这样切分后引用仍然有效。
下面的示例搜索、读取三个页面、对它们分块,并选出与问题共享最多词的六个块。生产环境里请把词数统计换成你的嵌入模型;结构保持不变。
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}"
)三页是个不错的起点,而且能让搜索保持在 1 个积分。大多数事实性问题都能在好查询的前两三个页面得到答案。
请求的页面可以比在聊天 agent 里更长,因为分块器反正会丢弃大部分文本。每页 max_chars 设为 10,000 到 15,000,能让排序器有足够内容可选。如果答案依赖某个已知站点,用 include_domains 把它加进来,而不是多读几页。
在 prompt 里给来源编号,并在答案中要求给出编号。简短的指令就很有效:只使用上下文,每条论断引用为 [n],上下文未覆盖问题时说明。
把来源列表放在 prompt 末尾,每个编号对应一个 URL。然后在界面里把 [n] 渲染成链接。用户信任可以核对的答案,错误的引用在审阅时也很容易发现。
跳过它,使用其他页面。每个结果都带有 content_status;只有 ok 的结果才有文本。某页缺失可能是因为 我们的读取器遵守 robots.txt:它会以 LLMWebSearch 表明身份,遵守网站为它或为所有机器人写下的规则,并排除任何它无权读取的页面内容。
当一次搜索的所有页面都返回空时,用一个不同的查询重试一次,或为你知道是开放的站点添加 include_domains。当网站拒绝我们的读取器时,结果会不带内容返回,并附上该网站的状态:我们绝不破解 CAPTCHA、不登录账户,也不绕过封锁或付费墙。
大多数情况下每个问题一次搜索。一个每月回答 5,000 个问题的客服助手,五分之一的问题需要第二次搜索,大约用 6,000 次搜索。25,000 次查询 起 US$41.25,可覆盖四个月这样的用量。
你的模型还要读取你发送的块。六个 1,200 字符的块,每个问题大约增加 2,000 个 token,这可通过块大小和数量来控制。
对大多数流水线来说,每个问题消耗一个积分。查询积分永不过期:这个月没用完的,明年还在。
5,000 次搜索
US$9.25
US$1.85/千次搜索
25,000 次查询
US$41.25
US$1.65/千次搜索
100,000 次查询
US$145
US$1.45/千次搜索
所有套餐均包含: 前 3 个页面读取为 Markdown · 国家、语言、时间和域名筛选 · 调用失败不计费 · 积分永不过期
可以。LangChain 和 LlamaIndex 页面 将搜索封装为 retriever 和工具。
可以,使用 extract endpoint。读取你已持有 URL 的页面:每开始一组 3 个返回内容的页面计 1 积分,每次调用最多 20 个 URL;被拒绝或失败的 URL 不计入。
不会。每次调用留下一条日志:时间、账号、查询的前 60 个字符、返回的结果数和页面数,以及积分。日志 30 天后删除。我们读取的页面内容不保留。账号编号、订单、充值和积分总额在账户存在期间保留,之后仅在会计法律要求的时间内保留。只有在法律强制要求时,我们才会向当局提供记录。
可以。设置 language 和 country,例如 language=de 和 country=de 可获取来自德国的德语结果。
低至 US$1.20/千次搜索 · 无需 KYC
获取 API 密钥