動かざることバグの如し

近づきたいよ 君の理想に

LLMのContext lengthとMax tokenの違い

LLM触っていてContext lengthとMax tokenの違いが一瞬わからなくなったのでメモ

Context length (コンテキスト長)

  • モデルが一度に処理できるトークンの最大数。
  • モデルの「記憶」や「注意の範囲」を表す。
  • 入力と出力の合計トークン数の上限を決定。
  • モデルごとに固定(例: GPT-3.5は4096トークン、GPT-4は8192トークン)。

Max token

  • APIリクエストで生成される出力の最大トークン数を指定するパラメータ。
  • ユーザーが設定可能。
  • 常にcontext length - 入力トークン数よりも小さい値である必要がある。
  • 出力の長さを制御するために使用。

これらの違いを理解することで、LLMの制約を適切に把握し、効果的に利用できる。context lengthはモデルの能力を示す重要な指標で、max_tokensは出力を調整するための実用的なツール。

シェルスクリプトの対話式入力を自動化する方法

やりたいこと

例えば以下のようなシェルスクリプトがあったとする。

#!/bin/bash

# ユーザーからの入力を受け取る
read -p "aを入力してください: " input_a
read -p "bを入力してください: " input_b
read -p "cを入力してください: " input_c

if [ "$input_a" = "a" ] && [ "$input_b" = "b" ] && [ "$input_c" = "c" ]; then
    echo "OK"
else
    echo "NG"
    exit 1
fi

この場合、a入力してエンター、b入力してエンター、c入力してエンターする。

❯ bash test.sh
aを入力してください: a
bを入力してください: b
cを入力してください: c
OK

通常実行時に入力を求められるLinux操作は珍しくないが、自動化しようとすると面倒

yコマンドだけ実行したいなら yes > bash hoge.sh でも対応できるが複数入力しなくてはいけない対話式のコマンドの場合対応できない。

対応方法

シェルスクリプトの対話式入力を自動化するには、入力データをファイルに保存し、そのファイルをリダイレクトする方法が有効。以下の手順で実行できる。

入力データをファイルに保存する。例えば、cmd.txt というファイルを作成し、以下の内容を記述する。

a
b
c

シェルスクリプトを実行する際に、このファイルをリダイレクトする。

❯ bash test.sh < cmd.txt
OK

この方法で、シェルスクリプトの対話式入力を自動化できる。ファイルに入力データを事前に用意しておくことで、手動入力を省略できる。

参考リンク

Linuxでエクセルが読めるCSVに変換する方法

環境

やりたいこと

エクセルではシフトJIS(CP932)のCSVしか読めないので、UTF-8CSVは悲しいことに文字化けしてしまう。

文字コードを変換したい

コマンド

cat users.csv| nkf -s --cp932 --fb-subchar=0x3013 > users_cp932.csv
  1. cat users.csv: users.csvファイルの内容を標準出力に表示。
  2. |: パイプ。前のコマンドの出力を次のコマンドの入力にする。
  3. nkf -s --cp932 --fb-subchar=0x3013: nkfコマンドで文字コードShift_JISに変換。--cp932WindowsShift_JISを指定し、--fb-subchar=0x3013は変換できない文字を「〓」に置き換える。
  4. > users_cp932.csv: 変換後の内容をusers_cp932.csvファイルに保存。

ペルソナ像を作成するプロンプト

ペルソナ像を作成するプロンプト

あなたはマーケティングの専門家です。
ターゲットオーディエンスとして「ぴえん系女子」という特定のペルソナ像を作成してください。
「外見」「性格・内面的特徴」「行動パターン」「過去」の項目について、それぞれ5つの特徴を箇条書きで説明してください。

あなたはマーケティングの専門家です。
ターゲットオーディエンスとして「20歳、女子、歌舞伎町、ぴえん系女子」という特定のペルソナ像を作成してください。
「外見」「性格・内面的特徴」「行動パターン」「過去」の項目について、それぞれ5つの特徴を箇条書きで簡潔に説明してください。

TypeScriptで配列から指定数ランダム抽出するメソッド

やりたいこと

例えば以下のような配列があったとする。

const fruits = [
  "りんご",
  "バナナ",
  "オレンジ",
  "いちご",
  "ぶどう",
  "メロン",
  "パイナップル",
  "マンゴー",
  "スイカ",
  "さくらんぼ"
];

この中から重複せずにランダムに3つ取得したい。

コード

function getRandomElements<T>(arr: T[], count: number): T[] {
  if (count > arr.length) {
    throw new Error('Count is greater than the array length');
  }

  const result: T[] = [];
  const usedIndices: Set<number> = new Set();

  while (result.length < count) {
    const randomIndex = Math.floor(Math.random() * arr.length);
    if (!usedIndices.has(randomIndex)) {
      usedIndices.add(randomIndex);
      result.push(arr[randomIndex]);
    }
  }

  return result;
}

実行すると

getRandomElements(fruits, 3)
>  ['さくらんぼ', 'ぶどう', 'マンゴー']
getRandomElements(fruits, 2)
> ['りんご', 'パイナップル']

のようにできる。

コードの解説

  • getRandomElements<T>(arr: T[], count: number): T[] 関数の定義:
    • ジェネリック<T> を使って、任意の型の配列を受け取れるようにする。
  • 引数のチェック:
    • if (count > arr.length) で、要求した要素数が配列の長さを超えないことを確認。超えた場合はエラーをスロー。
  • 結果を格納するための配列 result と、使用したインデックスを管理するための Set 型の usedIndices を定義。
  • ランダムな要素を取得するループ:
    • while (result.length < count) で、必要な数のランダムな要素が取得できるまでループ。
    • 各ループ内で、Math.random() を使ってランダムなインデックスを生成。
    • そのインデックスが usedIndices に存在しない場合のみ、結果に追加する。
  • 最終的に、重複のないランダム要素が含まれた配列を返す。

注意点

  • 重複を避けるために、配列の長さより多くの要素を要求しないこと。
  • Set を使用しているため、インデックスの管理が効率的。
  • 配列の長さが少ない場合、要求する要素数を注意深く設定する必要がある(特に小さな配列の場合)。
  • 整数の除外やオフセットの設定はしていないため、配列の先頭から詳細な参照が必要な場合は注意が必要。