ushibutatorism

がんばって言語化するぞ(カテゴリごちゃ混ぜです)

AWS LambdaからGroq APIを実行する(Node.js版)

AWS Lambda から Groq API を実行して結果を取得したい。

構成図

ローカルでの作業

空のフォルダに groq-sdk をインストールする

mkdir groq-sdk-layer # 名前は何でもいい
cd groq-sdk-layer
npm init
npm install groq-sdk

フォルダ構成を確認、調整する

/groq-sdk-layer
  /package.json
  /node_modules

/groq-sdk-layer
  /nodejs # ←新規作成してファイルを移動させる
    /package.json
    /node_modules

(参考)

重要: Node.js 用にインポートするライブラリは、nodejs/node_modules というフォルダ構造内にある必要があります。

Node.js で、Lambda に関連して発生する「Cannot find module」または「Cannot find Package」エラーを解決する | AWS re:Post

zipする

上記の nodejs フォルダをzip圧縮する。

レイヤーの作成

上記zipをアップロードしてレイヤーを作成し、Lambda関数に追加します。

実行

import Groq from 'groq-sdk';
...
export const handler = async (event) => {
    ...
    var groq = new Groq({
        apiKey: process.env.GROQ_API_KEY,
    });
    ...
    const response = await groq.chat.completions.create(...);
    ...

ハマりポイント

zipする際のフォルダ構成が異なると、モジュール読み込みでエラーが起きます。

/groq-sdk-layer      # これをzipしてもダメ
  /nodejs            # これをzipする必要がある
    /package.json
    /node_modules

LLMの生成結果を安定させる小技

生成プロンプトの小ネタです。

よくある問題

LLMにテキストを生成させようとすると、以下のような生成結果が出力されがちです。

あなたは○○です。入力をもとに□□を生成してください。

了解しました!
いただいたデータをもとに考えると「○○」というのはどうでしょうか。

チャットでやりとりするならこれでもいいのですが、「○○」という結果だけをプログラム上で扱いたい場合にはイマイチです。

よくある解決方法

最も一般的な対策が「出力形式を指定する」です。

あなたは○○です。入力をもとに□□を生成してください。
...
# 回答形式:
以下の形式の文字列のみを回答する。
{
  "answer": "回答",
}

しかしこれでも、以下のような結果が出力されることがあります。

了解しました!
いただいたデータをもとに考えました!
{
  "answer": "..."
}
どうでしょうか!

どうでしょうかじゃないのよ。

ちょっとした小技

以下のように指示します。

...
# 回答形式: 
{
  ...
  "your-comment": "あなたのコメント"
}

つまり、LLMの「説明したい気持ち」の出力先をこちらで用意してあげるのです。

{
  "answer": "...",
  "your-comment": "これこれこういう事を考慮しました!"
}

これでもダメなことはありますが、かなりマシになると思います。