> 웹 프론트엔드 > JS 튜토리얼 > 재사용 가능한 코드로 AI 기반 이메일 에이전트 구축

재사용 가능한 코드로 AI 기반 이메일 에이전트 구축

Mary-Kate Olsen
풀어 주다: 2024-12-24 08:47:14
원래의
979명이 탐색했습니다.

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. 구글 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿