[C#] AI Agent 如何搜尋網路?Exa Search API 免費額度與實作教學

  • 15
  • 0

如果你有在寫 AI Agent,你就知道搜尋(Web Search)是一件麻煩的事情

如果要用 Google,你別傻了,它們是最麻煩的,光是 API 申請、設定跟計費就夠煩了,當然你可以用 Playwright 直接開瀏覽器搜尋
但是就很消耗資源,你知道的...

我之前也試過用 C# HttpClient 直接抓 DuckDuckGo,原本以為只要解析搜尋結果的 HTML 就搞定了
結果連續三次 HTTP 403,連搜尋都還沒開始就被擋下來了 XD


其實 AI Agent 根本不需要一個完整的瀏覽器,它要的就是搜尋結果,最好直接給 JSON,包含標題、網址跟網頁內容,這樣才方便拿去餵給 LLM

最近找到一個不錯的服務 Exa,專門提供 AI Agent 使用的 Web Search API,不需要開瀏覽器,也不用自己解析 HTML,直接丟關鍵字就能取得搜尋結果

更吸引我的是 每個月免費提供 10 美元額度,而且不需要信用卡 ,所以簡單的說就是還是得花錢

Exa 是什麼?跟 Google Search 有什麼不同

Exa 本身就是一個針對 AI 應用設計的搜尋引擎,提供 Search API、Contents API,還有可以進行多步驟研究的 Agent API

傳統搜尋引擎主要是給人看的,我們輸入關鍵字,找到網站,再自己點進去閱讀

但 AI Agent 的需求不太一樣,它需要直接取得結構化資料,交給 LLM 分析,最好連相關網頁內容都幫忙整理好

Exa 就是走這個方向,使用 HTTP API 就可以取得 JSON,而且可以指定只回傳跟問題相關的 Highlights,不用把整篇網頁全部塞進 Context,這點我覺得蠻實用的

Exa 每個月免費可以搜尋幾次

目前 Exa 的 Starter Free Plan 每個月提供 10 美元 Credits,新註冊還會額外送一次性的 10 美元,而且不需要綁信用卡

搜尋分成幾種模式

  • Instant - 每千次 $4,10 美元約可搜尋 2500 次
  • Fast / Auto - 每千次 $7,約 1428 次
  • Deep - 每千次 $12,約 833 次
  • Deep-Reasoning - 每千次 $15,約 666 次

以上是每次最多回傳 10 筆結果的基本搜尋費用,如果要求額外內容、AI Summary 或更多搜尋結果,可能會增加費用

Instant 比較偏向快速搜尋,Fast / Auto 適合一般 AI Agent,Deep 跟 Deep-Reasoning 則適合需要多步驟搜尋、交叉比較資料的情境

如果只是要讓 AI Agent 查詢最新的 .NET 文件、GitHub Repo 或是一些技術問題,我覺得 Auto 就很夠用了,沒必要什麼都用 Deep

官方價格可以參考 https://exa.ai/pricing 

記得先去註冊拿到 API KEY

 

C# 實作 Exa Web Search API

先到 Exa Dashboard 註冊帳號,取得自己的 API Key

這次直接用 .NET Console 測試,不裝 SDK,也不需要額外 NuGet,單純使用 HttpClient 就可以

直接分享原始碼

using System.Net.Http.Json;
using System.Text.Json;

// Exa API Key,請替換成自己的 Token
var apiKey = "{YOUR_EXA_TOKEN}";

using var client = new HttpClient();

// Exa 使用 x-api-key 進行身分驗證
client.DefaultRequestHeaders.Add("x-api-key", apiKey);

// 設定搜尋條件
var request = new
{
    // 搜尋關鍵字
    query = "某某某店家的連絡資訊",

    // 搜尋模式:auto、fast、instant、deep、deep-reasoning
    type = "auto",

    // 最多回傳 5 筆搜尋結果
    numResults = 5,

    // 是否一併取得網頁相關內容
    contents = new
    {
        // true 會回傳相關網頁內容片段,適合提供給 LLM
        highlights = true
    }
};

// 呼叫 Exa Search API,使用 HTTP POST 傳送 JSON
using var response = await client.PostAsJsonAsync(
    "https://api.exa.ai/search", request);

// HTTP 不是 2xx 時直接拋出例外
response.EnsureSuccessStatusCode();

// 將 API 回傳的 JSON 解析成 JsonDocument
using var json = JsonDocument.Parse(
    await response.Content.ReadAsStringAsync());

// 逐筆讀取搜尋結果
foreach (var item in json.RootElement
    .GetProperty("results").EnumerateArray())
{
    // 網頁標題
    Console.WriteLine(item.GetProperty("title").GetString());

    // 網頁網址
    Console.WriteLine(item.GetProperty("url").GetString());

    // 顯示網頁相關內容片段
    // 如果不需要這些文字,可以移除下面這段
    if (item.TryGetProperty("highlights", out var highlights)
        && highlights.ValueKind == JsonValueKind.Array)
    {
        foreach (var text in highlights.EnumerateArray())
            Console.WriteLine(text.GetString());
    }

    // 分隔不同搜尋結果
    Console.WriteLine("-------------------------");
}

把 {YOUR_EXA_TOKEN} 換成自己的 API Key 就可以了,正式專案當然不要直接把 Token 寫死在程式裡,這邊只是為了測試方便

整個範例最主要的就是這個 API

https://api.exa.ai/search

透過 HTTP POST 傳入 query,Exa 就會回傳搜尋結果,包含 Title、URL,以及我們要求的 Highlights

其中 type = "auto" 是讓 Exa 自行選擇搜尋策略,numResults = 5 則是只取前五筆結果

contents.highlights = true 是我覺得比較有意思的地方,它不只是回傳搜尋結果,還會把網頁裡與問題相關的內容一起帶回來

所以你會看到一大段文字,如果只是要 Title 跟 URL,直接拿掉 Highlights 就好了,但如果要餵給 AI Agent,我反而建議保留,省得再另外抓一次網頁內容

Exa 可以完全取代 Playwright 嗎

不行,這兩個其實是不同的東西,雖然 Playwright 比較消耗資源,但是他畢竟就是真的可以偽裝成真的用戶瀏覽

如果你要登入網站、點擊按鈕、填寫表單,甚至進行整個網站的自動化測試,Playwright 還是很適合

但如果只是要搜尋網路、取得一些最新資訊,我就不太想為了搜尋幾個關鍵字,特地啟動一個 Chromium

而且真的要把這個功能放在高併發的 AI Agent 系統裡面,同時啟動一堆瀏覽器,記憶體跟 CPU 的成本也不是開玩笑的

使用 Web Search API 至少能把瀏覽器自動化的負擔拿掉,至於搜尋品質、API 延遲跟費用,就是另外需要衡量的事情了

最後小結一下

我覺得 Exa 最吸引我的地方不是它有什麼特別厲害的 AI 技術,而是每個月固定提供 10 美元免費額度,而且不用信用卡

用 Instant 模式來算,每個月基本搜尋理論上可以做到 2500 次,對一般個人開發或測試 AI Agent 來說,應該很夠用了

C# 也只需要 HttpClient 就可以直接串接,不必安裝瀏覽器,更不用處理一堆反爬蟲問題

先筆記一下,後面再來測看看其他家的,分享給一些想要寫 ai agent  的同好們..

官方網站 https://exa.ai/

API 文件 https://exa.ai/docs/reference/search

價格 https://exa.ai/pricing

 

 

---

Before you read this, the article was in a superposition of human and AI. Upon observation, the wave function collapsed into a sleep-deprived developer.