4. Tích hợp Tìm kiếm Web (Tavily)

Nam

Nam Hoang / Feb 04, 2026

6 min read

Điểm tập trung của bài này là giúp Agent của bạn vượt qua giới hạn kiến thức cũ bằng cách biết tự đi tra cứu thông tin trên Google/Internet thông qua Tavily API.

I. Tại sao lại là Tavily?

Mặc dù có nhiều công cụ tìm kiếm, nhưng Tavily được thiết kế riêng cho AI. Thay vì trả về mã HTML rắc rối, Tavily trả về các đoạn văn bản sạch, tóm tắt và nội dung đã được tối ưu để LLM đọc hiểu nhanh nhất, giúp tiết kiệm bộ nhớ (context window) cho Agent.

II. Chuẩn bị

  1. Lấy API Key: Truy cập tavily.com, đăng ký tài khoản miễn phí và lấy Key.
  2. Cấu hình biến môi trường: Cập nhật file .env (file này sẽ được nạp thông qua script env.ts đã thiết lập ở Bài 1):
    TAVILY_API_KEY=tvly-xxxxxxxxxxxxxxxxxxxxxxxx
  3. Cài đặt thư viện:
    npm install @langchain/tavily

III. Mã nguồn: 04-integrating-web-search.ts

Chúng ta sẽ tạo một "Research Agent" chuyên tra cứu tin tức thời gian thực. Chúng ta sử dụng createGeminiModel từ gói tiện ích nội bộ để khởi tạo Gemini 2.5 Flash.

// apps/langchain/scripts/04-integrating-web-search.ts
// pnpm --filter=ai-notes-langchain run tsx scripts/04-integrating-web-search.ts

import './env'; // Important: Load API keys before initializing anything
import { createGeminiModel, generateImage } from '@workspace/util-langchain';
import { TavilySearch } from '@langchain/tavily';
import { createAgent, tool } from 'langchain';
import { z } from 'zod';

/**
 * 1. Define the Internet Search Tool.
 * We wrap TavilySearch inside tool() to provide a clear description for the AI.
 */
const webSearchTool = tool(
  async ({ query }) => {
    const search = new TavilySearch({
      apiKey: process.env.TAVILY_API_KEY,
      maxResults: 3,
    });
    return await search.invoke(query);
  },
  {
    name: 'internet_search',
    description:
      'Use this tool when you need real-time info, news, or events occurring after your knowledge cutoff.',
    schema: z.object({
      query: z.string().describe('The search query'),
    }),
  },
);

async function main() {
  const model = createGeminiModel();

  // 2. Initialize Agent with the search tool
  const agent = createAgent({
    model: model,
    tools: [webSearchTool],
    systemPrompt:
      'You are a research assistant. Always cite your sources if you find information from the internet.',
  });

  // 3. Generate visual diagram
  await generateImage(agent.graph, 'graph-ignore/scripts-04-web-search.jpg');

  console.log('--- Searching for latest information... ---');

  // 4. Ask a question that requires internet access
  const response = await agent.invoke({
    messages: [
      {
        role: 'user',
        content:
          'What is the current price of Bitcoin and what are the latest news about it?',
      },
    ],
  });

  const lastMessage = response.messages[response.messages.length - 1];
  console.log('\nResearch Result:');
  console.log(lastMessage.content);
}

main().catch(console.error);

IV. Phân tích kỹ thuật

  • maxResults: 3: Chúng ta giới hạn kết quả trả về để AI không bị "ngộp" dữ liệu và tiết kiệm Token.
  • System Prompt: Việc nhắc AI "Always cite your sources" rất quan trọng. Vì Tavily trả về cả URL, Agent sẽ tự động biết cách đưa link vào câu trả lời để tăng độ tin cậy.
  • Sơ đồ hoạt động: Bạn có thể quan sát luồng điều hướng của Agent (vòng lặp ReAct) thông qua hình ảnh được tạo ra:

Sơ đồ Web Search Agent

V. Cách chạy code

Sử dụng lệnh sau trong terminal để thực thi Agent:

pnpm --filter=ai-notes-langchain run tsx scripts/04-integrating-web-search.ts

Điểm mấu chốt cần nhớ

  • Tavily là công cụ tối ưu nhất để kết nối Agent với Internet nhờ dữ liệu đã được lọc sạch.
  • Hàm createGeminiModel từ tiện ích nội bộ giúp thống nhất cấu hình model Gemini 2.5 Flash cho toàn dự án.
  • Luôn cung cấp hướng dẫn rõ ràng trong description của tool để AI biết khi nào cần "ra ngoài" tìm kiếm thay vì tự trả lời dựa trên kiến thức cũ.

Trong bài học tiếp theo, chúng ta sẽ học cách điều khiển Agent trả về dữ liệu máy tính có thể đọc được (JSON) thay vì chỉ nói chuyện bằng văn bản thông qua kỹ thuật Structured Output!

👉 Bài tiếp theo: 5. Đầu ra có cấu trúc (Structured Output)