LangChainを使用したAIエージェントの構築

こんにちは。NewITソリューション部です。
今回は、LangChainを使用したAIエージェント構築の、ごく基本的な部分についてご紹介します。

LangChainは、大規模言語モデル(LLM)を活用したアプリケーション開発を簡素化するためのフレームワークです。単純なチャット機能から、複雑な推論を行うエージェントシステムまで、幅広いAIアプリケーションを構築できます。

https://www.langchain.com

今回はLangChainを使って、LLMと外部の処理を連携させる基本的なAIエージェントシステムを構築する方法を解説します。

Model(モデル)の実装

LangChainでは、様々なLLMプロバイダーを統一されたインターフェースで扱うことができます。今回はAzure OpenAIを使用します。

import { ChatOpenAI } from '@langchain/openai';

const model = new ChatOpenAI({
  model: process.env.AZURE_OPENAI_DEPLOYMENT_NAME || 'gpt-4o-mini',
  temperature: 0.1,
  openAIApiKey: process.env.AZURE_OPENAI_API_KEY,
  configuration: {
    baseURL: `${process.env.AZURE_OPENAI_API_ENDPOINT}openai/deployments/${process.env.AZURE_OPENAI_DEPLOYMENT_NAME}`,
    defaultQuery: { 'api-version': process.env.OPENAI_API_VERSION },
    defaultHeaders: {
      'api-key': process.env.AZURE_OPENAI_API_KEY,
    },
  },
});

このコードでは、Azure OpenAIのエンドポイントに接続するための設定を行っています。`ChatOpenAI`クラスを使用することで、OpenAI API互換のインターフェースを通じてモデルと対話できます。

Tool(ツール)の実装

Toolを定義することで、エージェントが外部の情報源やサービスと連携できるようになります。
今回は、Web検索とメモをDBに保存する2つのツールを実装します。
(以下のコード例では具体的な処理は省略し、Toolの定義方法に注目しています)

tool関数では、以下を指定します

  • ツールの処理内容
  • name: ツールの識別子(エージェントがツールを選択する際に使用)
  • description: ツールの機能説明(AIがいつ使うべきかを判断するための情報)
  • schema: 入力パラメータの型定義(zodスキーマを使用)

Web検索ツール

Google Custom Search APIを使用します。

import { tool } from 'langchain';
import { z } from 'zod';

export const googleSearchTool = tool(
  async ({ query }: { query: string }) => {
    
    try {
      const results = await performGoogleSearch(query);
      const formattedResults = results.map((result, index) => 
        `${index + 1}. **${result.title}**\n   URL: ${result.link}\n   概要: ${result.snippet}\n`
      ).join('\n');
      return formattedResults;
      
    } catch (error) {
      return `検索中にエラーが発生しました: ${error instanceof Error ? error.message : 'Unknown error'}`;
    }
  },
  {
    name: 'google_search',
    description: 'Google検索を実行してWeb上の情報を取得します。最新の情報や特定のトピックについて調べるときに使用してください。',
    schema: z.object({
      query: z.string().describe('検索クエリ - 調べたい内容を具体的に入力してください')
    })
  }
);

メモツール

直接内容には関係ありませんが、今回はDBとしてSQLiteを使用しています。

export const saveMemoTool = tool(
  async ({ title, content, tags }: { title: string; content: string; tags?: string }) => {
    try {
      const memoService = getMemoService();
      const savedMemo = memoService.saveMemo({
        title: title.trim(),
        content: content.trim(),
        tags: tags?.trim() || ''
      });
      
      return;
      
    } catch (error) {
      return `メモの保存中にエラーが発生しました: ${error instanceof Error ? error.message : 'Unknown error'}`;
    }
  },
  {
    name: 'save_memo',
    description: 'メモをデータベースに保存します。重要な情報や後で参照したい内容を記録するときに使用してください。',
    schema: z.object({
      title: z.string().describe('メモのタイトル - 内容を要約した短いタイトル'),
      content: z.string().describe('メモの内容 - 保存したい詳細な情報'),
      tags: z.string().optional().describe('タグ(カンマ区切り) - 分類やキーワード(例: "仕事,アイデア,重要")')
    })
  }
);

Agent(エージェント)の実装

エージェントは、モデルとツールを組み合わせて自律的に動作するシステムです。
LangChainのcreateAgentを使用して実装します。
引数として、ここまでに定義したmodelとtoolを渡します。

import { createAgent } from "langchain";
import { AzureChatOpenAI } from "@langchain/openai";

export const WebSearchAgentFeature = async (input: string) => {
  try {
    // エージェント作成
    const agent = createAgent({
      model: model,
      tools: [googleSearchTool, saveMemoTool],
    });

    // エージェント実行
    const result = await agent.invoke({
      messages: [{ role: "user", content: input }]
    });

    return result;
  } catch (error) {
    return {
      success: false,
      error: error instanceof Error ? error.message : 'Unknown error'
    };
  }
};

動作確認

実際に動作確認をしてみます。
各画面はReact+Next.jsで簡易的に実装しています。

「cloudsteadyの2025年12月のblogの内容を調べてメモして」と依頼すると、以下のように動作します。

web上の最新情報を検索し、その内容をメモとして保存できています。
精度には改善の余地がありますが、基本的なエージェントの動作を確認することができました。

まとめ

LangChainを使用することで、LLM単体では実現が難しい、単純な質問応答を超えた、実際に有用な作業を自動化するシステムを構築できます。
外部ツールとの連携や、複数のステップを踏む推論など、様々な応用が可能です。
今回紹介した基本的なModel、Tool、Agentの実装を基に、さらに高度な機能や独自のツールを追加していくことで、より複雑で実用的なAIアプリケーションを開発できます。

NewIT部ではAIを活用した業務システムの開発をお受けしております。ご興味があればお気軽にお問合せください。

 

 

いいね (←参考になった場合はハートマークを押して評価お願いします)
読み込み中...

注意事項・免責事項

※技術情報につきましては投稿日時点の情報となります。投稿日以降に仕様等が変更されていることがありますのでご了承ください。

※公式な技術情報の紹介の他、当社による検証結果および経験に基づく独自の見解が含まれている場合がございます。

※これらの技術情報によって被ったいかなる損害についても、当社は一切責任を負わないものといたします。十分な確認・検証の上、ご活用お願いたします。

※当サイトはマイクロソフト社によるサポートページではございません。パーソルクロステクノロジー株式会社が運営しているサイトのため、マイクロソフト社によるサポートを希望される方は適切な問い合わせ先にご確認ください。
 【重要】マイクロソフト社のサポートをお求めの方は、問い合わせ窓口をご確認ください