ホームページ >ウェブフロントエンド >jsチュートリアル >再利用可能なコードを使用して AI を活用した電子メール エージェントを構築する

再利用可能なコードを使用して AI を活用した電子メール エージェントを構築する

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-24 08:47:14989ブラウズ

Build an AI-Powered Email Agent with Reusable Code

タスクを自動化する理由

皆さん、こんにちは?!アプリ開発者として、日常のタスクを自動化するシンプルかつ強力なエージェントを作成する方法を共有できることを嬉しく思います。

?皆さんの多くと同じように、私も毎日膨大な数のメールを受け取ります。私の最善の努力にもかかわらず、とらえどころのないInbox Zeroを達成することは依然として課題です。注文確認や発送の最新情報などのメールを整理するのは面倒で時間もかかります。

しかし、良いニュースがあります: 自動化が窮地を救うことができます!

?私は AI を活用して電子メールの分類を自動化する基本的なスクリプトを作成しました。あなたもそれが可能です。

この記事では、ニーズに合わせた独自の自動化エージェントを構築するのに役立つ再利用可能なコード スニペットを共有します。 ?


自動化の美しさ

ノーコード プラットフォームを含め、プロセス全体を処理できるツールは無数にあります。ただし、私はタスクを モジュール化されたコード スニペット に分割することを好みます。なぜ?

  1. 柔軟性: モジュール化されたコードは、変化する要件に簡単に適応できます。
  2. 再利用性: 一度書いたら永久に使用できます。
  3. 保守性: 小さく独立したコードの塊は、デバッグと改善が容易です。

段階的なアプローチを採用することで、手動の手順を徐々に自動化された手順に置き換えることができます。

?‍?スクリプトのプロトタイピングに私がよく使うツールは Znote です。これは、ワークフローの追跡と強化に役立つライブ コーディングと AI を備えたノートブックです。試してみるか、お気に入りの IDE を使用してください。


電子メール自動化エージェントを構築してみよう

目標

新しいメールが届いたら、次のことを行います:

  1. メールを読んで、関連情報を抽出します。
  2. LLM を使用 して、事前定義されたリストからカテゴリを決定します。
  3. Gmail ラベルを作成します (まだ存在しない場合)。
  4. メールのラベルを更新して、割り当てられたカテゴリを反映します。

はじめる

前提条件

ステップ 1: Gmail API を有効にする

  1. Google Cloud Console に移動し、Gmail API を有効にします。
  2. デスクトップ アプリケーションの OAuth 資格情報を設定します。次の手順に従って、google-credentials.json ファイルをダウンロードし、プロジェクト ディレクトリに配置します。

ステップ 2: Ollama をインストールする

Ollama をダウンロードしてローカル LLM を実行します。インストールしたら、モデルをダウンロードします:

ollama pull mistral  

ステップ 3: 依存関係をインストールする

必要な Node.js ライブラリをインストールします:

ollama pull mistral  

コードを書く

1. Google APIで認証する

Gmail への OAuth 接続をセットアップします:

npm install -S @google-cloud/local-auth googleapis openai  

2. Gmail ラベルを作成する

この関数を使用してラベルを作成し、その ID を取得します。

// google-api.js
const fs = require("fs");
const path = require("path");
const { authenticate } = require("@google-cloud/local-auth");
const { google } = require("googleapis");

class GoogleAPI {
  constructor(credentialFilename) {
    this.TOKEN_PATH = path.join(__dirname, `token-${credentialFilename}`);
    this.CREDENTIALS_PATH = path.join(__dirname, credentialFilename);
    this.SCOPES = [
      "https://mail.google.com/",
      "https://www.googleapis.com/auth/gmail.modify",
    ];
  }

  async authorize() {
    const loadSavedCredentials = () => {
      try {
        const content = fs.readFileSync(this.TOKEN_PATH);
        return google.auth.fromJSON(JSON.parse(content));
      } catch {
        return null;
      }
    };

    const saveCredentials = (client) => {
      const keys = JSON.parse(fs.readFileSync(this.CREDENTIALS_PATH));
      fs.writeFileSync(
        this.TOKEN_PATH,
        JSON.stringify({
          type: "authorized_user",
          client_id: keys.installed.client_id,
          client_secret: keys.installed.client_secret,
          refresh_token: client.credentials.refresh_token,
        })
      );
    };

    let client = await loadSavedCredentials();
    if (!client) {
      client = await authenticate({
        scopes: this.SCOPES,
        keyfilePath: this.CREDENTIALS_PATH,
      });
      if (client.credentials) saveCredentials(client);
    }
    return client;
  }
}

module.exports = GoogleAPI;

3. メールを読む

メッセージ API から詳細を抽出します:

async function createAndGetLabels(labelsToCreate) {
  const google = await getGoogleClient();
  const gmail = google.gmail({ version: "v1" });

  const existingLabels = (await gmail.users.labels.list({ userId: "me" })).data.labels || [];

  const labelsMap = new Map();
  for (const label of labelsToCreate) {
    const existing = existingLabels.find((l) => l.name === label);
    if (existing) {
      labelsMap.set(label, existing.id);
    } else {
      const res = await gmail.users.labels.create({
        userId: "me",
        requestBody: { name: label },
      });
      labelsMap.set(label, res.data.id);
    }
  }
  return labelsMap;
}

4. 関連情報を復号化する

メールから意味のある詳細を抽出します:

async function readEmails(gmail, maxResults = 10) {
  const res = await gmail.users.messages.list({ userId: "me", labelIds: ["INBOX"], maxResults });
  return Promise.all(
    res.data.messages.map(async ({ id }) => {
      const email = await gmail.users.messages.get({ userId: "me", id });
      return email.data;
    })
  );
}

5. 分類に LLM を使用する

Ollama または OpenAI を統合してメールを分類します:

function extractMailInfos(mail) {
  // Define the headers to extract
  const relevantHeaders = ["Date", "Subject"];

  // Extract and structure the relevant headers
  const headers = mail.payload.headers
    .filter(header => relevantHeaders.includes(header.name))
    .reduce((accumulator, header) => {
      accumulator[header.name] = header.value;
      return accumulator;
    }, {});

  // Add the unique mail ID directly to the headers object
  headers.id = mail.id;

  return headers;
}

すべてをまとめる

すべてが連携してどのように機能するかは次のとおりです:

async function classifyEmail(prompt) {
  const { OpenAI } = require("openai");
  const openai = new OpenAI({ baseURL: "http://127.0.0.1:11434/v1", apiKey: "not-needed" });

  const response = await openai.chat.completions.create({
    model: "mistral",
    temperature: 0.3,
    messages: [{ role: "user", content: prompt }],
  });

  return response.choices[0].message.content.trim();
}

?それでおしまい!受信トレイはよりスマートに整理されています。

さらに進んでください

しかし、なぜここで止まるのでしょうか?電子メールの内容を読み取り、下書きを送信し、完全に自動化された応答に必要なものをすべて構築するための、より高度な例を確認してください。
自動化のアイデアや再利用可能なスクリプトについては、Znote をご覧ください。

日々のタスクを楽しく効率的なものに変えましょう。 ?

以上が再利用可能なコードを使用して AI を活用した電子メール エージェントを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。