はじめに
ChatGPTはもちろんのことOpenAI APIもたくさん活用されていますね。LINE Bot + OpenAIというネタもまったく目新しさがない昨今ですが、JS版のLangChainを使ってみたことがなかったので試用がてらLINE Bot Serverに組み込んでみました。せっかくなのでその手順を記載しておきます。
どんなBot?
できたものはこちらです。
PromptTemplateを利用して料理名を送信すると必要な材料を返してくれます。ご飯の材料を買い物に行くときに便利かもしれません。
仕組み
[LINE Bot 開発入門] LINE Bot Serverを作ってみる その1 で作ったBot Serverをベースにしています。
ベースは送信したメッセージをそのまま返信するオウム返しサーバでしたが、今回はメッセージをOpenAI APIにリクエストした結果を返します。lib/event.ts
38行目のgetMessageFromAI
を実装します。
case 'text':
textEventMessage = {
type: 'text',
id: event.message.id,
text: await getMessageFromAI(event.message.text),
};
getMessageFromAIのコードはlib/langchain.ts
にあります。
import { LLMChain } from 'langchain/chains';
import { OpenAI } from 'langchain/llms/openai';
import { PromptTemplate } from 'langchain/prompts';
const template = `
あなたは優秀な家庭料理の研究家です。忙しい主婦のために簡単においしくできる料理を研究し、情報配信しています。
「今日作りたい料理」に対して、購入すべき材料のリストをすべて示してください。
---
今日作りたい料理: {cooking}
`;
export const getMessageFromAI = async (message: string): Promise<string> => {
process.env.OPENAI_API_KEY = '[YOUR OPENAI API KEY]';
console.log("getMessageFromAI", message);
const llm = new OpenAI({ temperature: 0.9 });
const prompt = new PromptTemplate({
template,
inputVariables: ["cooking"],
});
const chain = new LLMChain({llm: llm, prompt, verbose: true});
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const result = await chain.call({ cooking: message });
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
const res: string = result["text"].toString();
return res;
};
process.env.OPENAI_API_KEY = '[YOUR OPENAI API KEY]';
を[YOUR OPENAI API KEY]
にOpenAIのAPI KEYに変更してください。
PromptTemplateを利用してGPTに入力するプロンプトを生成しています。LINEクライアントから送信されたText Massageがカレーライス
だった場合、
あなたは優秀な家庭料理の研究家です。忙しい主婦のために簡単においしくできる料理を研究し、情報配信しています。
「今日作りたい料理」に対して、購入すべき材料のリストをすべて示してください。
---
今日作りたい料理: カレーライス
というプロンプトに変換されてGPTに送信されます。
おわりに
LangChainはLLMをエージェント化するための様々な機能を提供しています。現在非常に活発に開発されていてどんどん新しい機能が追加されていってます。
このようなAI Application Frameworkと言えるようなツールは今後も様々リリースされてくると思います。多くのユーザーに対話型UXを提供しているLINEアプリとAIを繋ぐインターフェースとしてLINE Bot + LangChainのようなシステム構成は有益かもしれないなと思います。