LINE Corporation 於2023年10月1日成爲 LY Corporation。LY Corporation 的新部落格在這裏。LY Corporation Tech Blog

Blog


使用 PaLM API 和第二代 Cloud Functions 構建 LINE Chatbot x Bard(來自 Google 的 AI)

在這篇文章中,我將帶大家了解另一種選擇,通過創建LINE Chatbot以生成式 AI 方式進行交互,通過連接Google側的 Pathways Language Model ( PaLM 2 ) ,這是一個大型語言模型 ( LLM )地址。在Bard 的背後,它使用Cloud Functions for Firebase 第二代作為橋樑。

1. 創建提供商 (Provider) 和頻道 (Channel)

建議之前從未為 LINE Chatbot 創建過 Provider 和 Channel 的人閱讀下面的介紹文章。但任何已經熟悉它的人都可以跳過這一步。 關於創建 LINE Bot 簡介,請參考這篇文章(泰文)

2.安裝Firebase的雲功能

2.1 在Firebase中創建項目

任何已經擁有 Firebase 項目的人都可以跳過此步驟。對於那些從未擁有過或想要創建新項目的用戶,請轉到Firebase 控制台,然後按“添加項目”,指定各種詳細信息,然後按“創建項目”。

當壓入我們創建的項目時 首先要做的事情是……首先將您的計劃從 Spark 更改為Blaze(隨用隨付),因為 Firebase 的 Cloud Functions 有一個條件,如果您想將功能部署到生產中,則需要使用此計劃。

通過切換到Blaze 計劃,開發人員可以獲得每月 2,000,000 個請求的免費配額。

2.2 安裝 Node.js 和 npm

機器上已經安裝了 Node.js 和 npm 的人可以跳過此步驟。或通過命令行再次確認

node --version // Cloud Functions 目前支持版本 14、16、18 和 20。
npm --version

對於那些還沒有發帖的人 或者,如果未找到版本號,請訪問https://nodejs.org。根據我們成功使用的每個操作系統下載並安裝 Node.js(Node.js 安裝還將包括 npm)。

2.3 安裝 Firebase CLI

在 Cloud Functions for Firebase 中部署函數必須通過 Firebase CLI 完成,因此讓我們使用以下命令在命令行中安裝 CLI

npm install -g firebase-tools

如何驗證我們是否已成功安裝 Firebase CLI 使用下面的命令。如果您看到版本號,則說明已通過!

firebase -version

2.4 初始項目

我們會來驗證您的身份。要訪問我們的 Firebase 項目,讓我們在命令行中運行以下命令,將會彈出一個瀏覽器供我們登錄。

firebase login

接下來,創建一個文件夾(在本例中稱為 bot)並進入其中。

mkdir bot
cd bot

然後使用以下命令初始化 Cloud Functions for Firebase

firebase init functions

您將看到如下所示的面孔,選擇“使用現有項目”並選擇我們創建的項目。

然後還會有3個問題。

  • 將使用什麼語言進行開發?有 3 種語言可供選擇:JavaScript、TypeScript 或 Python(文章中的示例將使用JavaScript)。
  • 是否使用ESLint進行錯誤檢查和代碼風格(可選
  • 會立即安裝依賴嗎?(不要浪費)

就這樣,初步流程就完成了,我們得到的項目結構是這樣的。

/bot 
+- .firebaserc     # 隱藏文件,可幫助您在“firebase use”項目之間快速切換
| 
+- firebase.json   # 描述項目的屬性
| 
+-函數/      # 包含所有函數代碼的目錄
   | 
   +- .eslintrc.json   # 包含 JavaScript linting 規則的可選文件。
   | 
   +- package.json   # 描述您的 Cloud Functions 代碼的 npm 包文件
   | 
   +- index.js       # Cloud Functions 代碼的主源文件
   | 
   +- node_modules/ # 安裝依賴項(在 package.json 中聲明)的目錄

3. 為 LINE 聊天機器人創建 Webhook

我們將創建一個 webhook來允許 LINE Chatbot 接收信息並通過 Messaging API 與用戶交互,在本例中我將使用 axios讓我們成為創建請求的助手。我們需要首先打開命令行並轉到/functions然後使用命令來安裝此依賴項

npm install axios --save

接下來,我們將通過在 /functions 中創建.env文件並複制步驟 1 中的LINE Developers 控制台中 Messaging API Channel 的Channel Access Token值來指定環境變量。

CHANNEL_ACCESS_TOKEN=YOUR-CHANNEL-ACCESS-TOKEN

然後打開文件 /functions/index.js然後復制下面的代碼替換原來的代碼。準備從 LINE 接收文本類型的Webhook 事件並響應用戶。

// Import dependencies
const {onRequest} = require("firebase-functions/v2/https");
const axios = require("axios");

// Create a webhook via HTTP requests
exports.webhook = onRequest(async (req, res) => {
  if (req.method === "POST") {
    const events = req.body.events;
    for (const event of events) {
      switch (event.type) {
        case "message":
          if (event.message.type === "text") {
            const msg = event.message.text;
            await reply(event.replyToken, [{ type: "text", text: msg }]);
          }
          break;
      }
    }
  }
  res.send(req.method);
});

// Create a reply function with Messaging API
const reply = (token, payload) => {
  return axios({
    method: "post",
    url: `https://api.line.me/v2/bot/message/reply`,
    headers: {
      "Content-Type": "application/json",
      Authorization: `Bearer ${process.env.CHANNEL_ACCESS_TOKEN}`
    },
    data: { replyToken: token, messages: payload }
  });
};

然後再次打開命令行。並確保我們位於functions/,然後使用下面的命令將我們的webhook部署到生產環境。
firebase deploy --only functions

部署完成後,我們將看到Webhook URL出現在命令行中,讓我們複製它,或者如果找不到它,請轉到Firebase控制台,選擇我們創建的項目。然後選擇“Build”>“Functions”菜單,您將在其中找到函數名稱和 Webhook URL。

根據需要獲取 Webhook URL 後,請在LINE 開發人員控制台中的Messaging API 通道中更新此 URL (如步驟 1 中創建的那樣),並確保也啟用了“使用 Webhook” 。

4. 在 MakerSuite 中生成 API 密鑰

截至撰寫本文之日,Google 尚未向所有開發人員提供開箱即用的 PaLM API 和 MakerSuite 訪問權限 (翻譯註解: 目前已經對台灣開發者開放了,按下申請即有機會獲得試用機會)。https://makersuite.google.com/waitlist,當我們的時間到來時 將發送一封電子郵件進行通知。

按電子郵件中的訪問 MakerSuite按鈕即可進入。https://makersuite.google.com

登錄後,按“創建 API 密鑰”按鈕,您將看到一個通過創建新項目來創建 API 密鑰的選項。或者,您可以選擇 Google Cloud 中已有的項目(如果有),完成後我們將獲得一個 API 密鑰。

然後,我們通過打開/functions中的.env文件並指定 API 密鑰,在環境變量中添加API_KEY變量。

CHANNEL_ACCESS_TOKEN=YOUR-CHANNEL-ACCESS-TOKEN
API_KEY=YOUR-API-KEY

5. 將 LINE 聊天機器人連接到 PaLM API

PaLM API 中有兩種自然語言處理 (NLP) 實現。

短訊息服務

這將是一次性的互動。無需先驗背景 一問一答,直到最後,AI會利用學到的知識為我們想出答案,比如“請告訴我如何做冬陰湯(酸辣蝦湯) ” 。

聊天服務

這將是一次來回對話。可以為 AI 提供上下文,並可以提供對話示例,以便 AI 可以學習和理解特定於該用例的響應。例如,將 AI 的上下文定義為“您是一名與許多人合作的社區經理”泰國的開發者社區,希望通過使用LINE API 幫助開發者取得成功。 ”

理解後,讓我們開始安裝 2 個名為google-auth-library和的依賴項@google-ai/generativelanguage,首先打開命令行並轉到/functions並使用命令

npm install google-auth-library @google-ai/generativelanguage --save

這樣文件中的代碼 /functions/index.js 不太長 在此步驟中,我想將PaLM API模塊提取到文件中。/functions/palm.js 文本聊天 服務的兩個功能都包含在這裡。

// Import dependencies
const { TextServiceClient, DiscussServiceClient } = require("@google-ai/generativelanguage").v1beta2;
const { GoogleAuth } = require("google-auth-library");

// Get PaLM API key from Environment Variable
const API_KEY = process.env.API_KEY;

// Text service
const text = async (prompt) => {
  const client = new TextServiceClient({ authClient: new GoogleAuth().fromAPIKey(API_KEY) });
  return await client.generateText({
    model: "models/text-bison-001",
    prompt: { text: prompt }
  });
};

// Chat service
const chat = async (prompt) => {
  const client = new DiscussServiceClient({ authClient: new GoogleAuth().fromAPIKey(API_KEY) });
  return await client.generateMessage({
    model: "models/chat-bison-001",
    prompt: {
      context: "You are a Community Manager who works with many of developer communities in Thailand and want to help developers succeed by using LINE APIs.",
      examples: [
        {
          input: { content: "What APIs does LINE provide?" },
          output: { content: "Messaging API, LIFF, LINE Login, LINE Beacon, LINE Notify, LINE Things, and LINE MINI App."},
        },
        {
          input: { content: "What can I do with the Messaging API?" },
          output: { content: "Build a chatbot to interact with users on LINE."},
        },
        {
          input: { content: "What can I do with the LIFF?" },
          output: { content: "Build a web app that run within LINE."},
        },
        {
          input: { content: "How to get started with LINE APIs?" },
          output: { content: "You can go to LINE Developers Thailand website at https://linedevth.line.me and explore APIs that fit with your use case."},
        }
      ],
      messages: [{ content: prompt }]
    }
  });
};

module.exports = { text, chat };

然後讓我們更新文件中的代碼。/functions/index.js檢索模塊。

const {onRequest} = require("firebase-functions/v2/https");
const axios = require("axios");
const palm = require("./palm"); // import palm module

下一步將分為2種情況。

5.1 使用短信服務

將檢查文本類型text的條件部分的代碼調整為

if (event.message.type === "text") {
  const result = await palm.text(event.message.text);
  const msg = result[0].candidates[0].output;
  await reply(event.replyToken, [{ type: "text", text: msg }]);
}

然後通過命令行使用命令進行部署

firebase deploy --only functions

做好了,我們來測試一下……結果是,回答正確、徹底,尤其是程式碼可以馬上使用,很酷。

5.2 使用聊天服務

將檢查文本類型text的條件部分的代碼調整為

if (event.message.type === "text") {
  const result = await palm.chat(event.message.text);
  const msg = result[0].candidates[0].content;
  await reply(event.replyToken, [{ type: "text", text: msg }]);
}

然後通過命令行使用命令進行部署

firebase deploy --only functions

完成後,讓我們測試它......結果是它理解我們提供給它的上下文。也創造了有關該主題的知識

總結

對我來說,使用第二代 Cloud Functions 將 LINE Chatbot 連接到 PaLM API 非常簡單。由於代碼簡潔明了,所有源代碼已上傳到GitHub,方便不想自己貼上的人。

我希望這篇文章能讓讀者了解如何使用 PaLM 2 模型,並獲得進一步構建 LINE 聊天機器人的想法。下一篇文章再見。