Webブラウジング調査エージェント
検索ツール、取得ツール、LLMを組み合わせてテーマを調査し、出典付きの要約を作成します。
「Webブラウジング調査エージェント」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
このレッスンの一部はまだ翻訳されておらず、英語で表示されています。
プロジェクトの目標
Webを検索し、ページを取得し、出典付きの要約を書くことでトピックを調査するエージェントを構築します。Perplexityの小型版のようなものです。
必要なツール
- search — 検索API(Tavily、Serper、Brave)にクエリを送り、結果を返す
- fetch_url — ページをダウンロードし、クリーニング済みのテキストを返す
- answer — エージェントが引用付きの最終要約を書く
Step 1: Search Tool
import requests
def search(query: str, k: int = 5) -> list[dict]:
r = requests.post(
'https://api.tavily.com/search',
json={'api_key': TAVILY_KEY, 'query': query, 'max_results': k}
)
return r.json()['results'] # list of {url, title, snippet}Step 2: Fetch Tool
from bs4 import BeautifulSoup
def fetch_url(url: str) -> str:
r = requests.get(url, timeout=10)
soup = BeautifulSoup(r.text, 'html.parser')
for tag in soup(['script', 'style', 'nav', 'footer']):
tag.decompose()
return soup.get_text(separator='\n', strip=True)[:5000] # truncateStep 3: Tool Definitions
tools = [
{'type': 'function', 'function': {
'name': 'search',
'description': 'Search the web for a query, return top results with URLs',
'parameters': {'type': 'object', 'properties': {'query': {'type': 'string'}}, 'required': ['query']}
}},
{'type': 'function', 'function': {
'name': 'fetch_url',
'description': 'Download the text of a URL',
'parameters': {'type': 'object', 'properties': {'url': {'type': 'string'}}, 'required': ['url']}
}}
]
import json
print(json.dumps(tools, indent=2))
Step 4: The Agent Loop
def research(question, max_steps=8):
messages = [
{'role': 'system', 'content': 'You are a research agent. Use search and fetch_url to gather facts. Cite each claim with a URL.'},
{'role': 'user', 'content': question}
]
for _ in range(max_steps):
r = oai.chat.completions.create(model='gpt-4o-mini', messages=messages, tools=tools)
msg = r.choices[0].message
messages.append(msg)
if not msg.tool_calls:
return msg.content
for tc in msg.tool_calls:
result = dispatch(tc)
messages.append({'role': 'tool', 'tool_call_id': tc.id, 'content': json.dumps(result)})
return 'Step limit reached'Tool Dispatcher
def dispatch(tc):
args = json.loads(tc.function.arguments)
if tc.function.name == 'search':
return search(**args)
if tc.function.name == 'fetch_url':
return fetch_url(**args)
return {'error': 'unknown tool'}ステップ上限を追加する
上限がないと、エージェントが無限に処理を続ける可能性があります。max_steps=8は妥当なデフォルト値です。
取得したページを切り詰める
ほとんどのページは50KB以上あり、大きすぎます。5000文字(約1300トークン)に切り詰めます。モデルがそれ以上を必要とすることはほとんどありません。
robots.txtを尊重する
本番環境でのブラウジングでは、robots.txtとサイトの利用規約を遵守する必要があります。判断に迷う場合は、管理型の検索・取得サービスを利用します。
結果をキャッシュする
同じクエリやURLが頻繁にリクエストされます。結果をRedisに1時間キャッシュします:
@lru_cache(maxsize=1000)
def cached_fetch(url):
return fetch_url(url)失敗を処理する
ネットワークエラーは日常的に発生します。エージェントが別のソースを試せるよう、エラーをモデルに返します:
try:
return fetch_url(url)
except Exception as e:
return {'error': f'Could not fetch {url}: {e}'}引用を強制する
システムプロンプトの末尾に「最終回答には、[1] https://...のように、すべての主張に対応するURLを含めてください」と記述し、出力スキーマのチェックも検討します。
コストを監視する
調査エージェントは高コストです。1つの質問で5〜15回のツール呼び出しが発生し、それぞれでキロバイト単位のデータを取得します。クエリごとに予算上限を設定します。
ステップ上限
エージェントループにmax_stepsの上限を設定するのはなぜでしょうか?
まとめ
検索 + 取得 + LLM + ステップ上限で、50行の動作する調査エージェントが完成します。3つ目のプロジェクトとして最適です。
よくある質問
「Webブラウジング調査エージェント」レッスンは無料ですか?
はい。「Webブラウジング調査エージェント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「Webブラウジング調査エージェント」で何を学びますか?
検索ツール、取得ツール、LLMを組み合わせてテーマを調査し、出典付きの要約を作成します。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「Webブラウジング調査エージェント」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ドキュメントを対象にしたQ&Aボット
- コード説明エージェント
- Webブラウジング調査エージェント
- DB向けSQLアシスタント