将LINE Messaging API和OpenAI API进行整合

做过的事情 de

image.png

LINE Messaging API和OpenAI的准备工作

LINE消息API

按照公式指南,在LINE开发者控制台上创建消息API。

image.png
image.png

在構築Lambda之後,也需要設置Webhook。

开放人工智能

image.png
image.png
image.png

Lambda – 莱姆达 mǔ dá)

创建函数

image.png
image.png
image.png

在LINE开发者控制台中设置Webhook URL。

image.png
image.png

添加层

这次使用openai和@line/bot-sdk作为node_modules,将它们附加到Lambda Layer中。
在本地计算机上创建一个名为”nodejs”的目录,并按照以下方式安装node_modules。

PS C:\Users\flets\OneDrive\node\nodejs> npm i @line/bot-sdk openai
PS C:\Users\flets\OneDrive\node\nodejs> npm ls
node@ C:\Users\flets\OneDrive\node
+-- @line/bot-sdk@7.5.2
`-- openai@3.1.0

PS C:\Users\flets\OneDrive\node\nodejs>
image.png
image.png
image.png
image.png
image.png

程式的描述

我将按照以下方式进行描述。

调用模块、设置令牌和密钥

首先,在handler函数之前,导入LINE和OpenAI的模块,并设置LINE的频道访问令牌和OpenAI的API密钥。(很抱歉直接写了)

import line from "@line/bot-sdk";
import { Configuration, OpenAIApi } from "openai";

//事前に確認したものを記述
const LINE_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const GPT_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
与LINE Messaging API的互动

首先,编写处理程序函数的内容。首先,编写与LINE Messaging API进行交互的框架。

export const handler = async(event) => {
  //LINEのMessaging APIに接続
  const client = new line.Client({
    channelAccessToken: LINE_TOKEN,
  });

  //LINEからWebhookでアクセスしてきたときのBodyをJSONに格納
  const reqBody = JSON.parse(event.body);
  console.log(reqBody)

  let message = {};

  //このあと、ここでOpenAIのAPIを呼び出してmessageの中身を埋めます

  //LINE Messaging APIでメッセージをPushする宛先
  const toToken = reqBody.events[0].source.userId;

  //メッセージをPush
  await client.pushMessage(toToken, message).catch((err) => {
    // error handling
    console.error(err);
  });

  //Webhookに対するResponse(200応答が必要らしい)
  const response = {
      statusCode: 200,
      body: JSON.stringify(message),
  };
  return response;
};
调用OpenAI的API,并将其存储在消息中。

使用OpenAI的API访问,并将响应数据存储在消息中。
由于LINE的Webhook必须是文本消息,所以我也会加入if条件语句以便分支处理。


//WebhookがテキストだったらOpenAIになげる
if (reqBody.events[0].message.type == "text") {
    //OpenAIアクセス設定
    const configuration = new Configuration({
      apiKey: GPT_KEY,
    });
    //オブジェクト作成
    const openai = new OpenAIApi(configuration);
    //APIアクセス、レスポンス格納
    //max_tokensを変えればレスポンスの最大文字数が変化
    //ただし、max_tokensの値が純粋な最大文字数ではないので注意
    //ただしLINE、OpenAIそれぞれで上限値ありなので要確認
    const response = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: reqBody.events[0].message.text,
      max_tokens: 1000,
      temperature: 0,
    });

    message = {
      type: "text",
      text: response.data.choices[0].text.trim()
    };
  } else {
  //LINEからのWebhookがテキストメッセージじゃなかった場合
    message = {
      type: "text",
      text: "テキストを入力してください。"
    };
  }
整个文本的内容

以下是全文内容。

import line from "@line/bot-sdk";
import { Configuration, OpenAIApi } from "openai";

const LINE_TOKEN = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
const GPT_KEY = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

export const handler = async(event) => {
    const client = new line.Client({
    channelAccessToken: LINE_TOKEN,
  });

  const reqBody = JSON.parse(event.body);
  console.log(reqBody)

  let message = {};

  if (reqBody.events[0].message.type == "text") {
    const configuration = new Configuration({
      apiKey: GPT_KEY,
    });
    const openai = new OpenAIApi(configuration);
    const response = await openai.createCompletion({
      model: "text-davinci-003",
      prompt: reqBody.events[0].message.text,
      max_tokens: 1000,
      temperature: 0,
    });

    message = {
      type: "text",
      text: response.data.choices[0].text.trim()
    };
  } else {
    message = {
      type: "text",
      text: "テキストを入力してください。"
    };
  }

  const toToken = reqBody.events[0].source.userId;

  await client.pushMessage(toToken, message).catch((err) => {
    // error handling
    console.error(err);
  });
    const response = {
        statusCode: 200,
        body: JSON.stringify(message),
    };
    return response;
};

只要在控制台上进行部署即可。
如果屏幕顶部显示“函数myGptFunction已成功更新”,那就没问题!

校验行动

image.png

我先试着做了一下,但觉得挺有趣的,所以打算暂时用这个来玩ChatGPT一段时间。

请参考

几乎以下是两个复制粘贴:
OpenAI的API参考手册
LINE Messaging API的API参考手册

广告
将在 10 秒后关闭
bannerAds