Carpe Diem

備忘録

LLMのプロンプト

概要

LLMにおけるプロンプトの構成要素を理解して扱うことで

  • 期待通りの回答を得られる(精度が高くなる)
  • なぜTemplateはこの書き方をするのかが分かる
  • なぜagent_scratchpadのような変数がいるのかが分かる

といったようになります。

プロンプト

構成要素

プロンプトの構成要素は主に以下の4つです。

  • 命令(instruction)
  • 入力(input)
  • 文脈(context)
  • 出力形式の指定(output)

単純に「命令」だけだと幅広い解釈をしてしまい、期待しない回答が返ってくるので上記を考慮してプロンプトを作成するのが良いです。

続きを読む

LlamaIndexでPDFに対してベクトル検索を行う

概要

LlamaIndexを使うと非常に簡単にRAG(Retrieval-Augmented Generation)を使った検索システムを作ることができます。

今回はLLMにない情報(PDF)をベクトル化して検索できる方法を紹介します。

環境

  • python 3.11.8
  • streamlit 1.31.1
  • llama-index 0.10.14

実装

開発環境

Python自体もそうですが、LangchainやLlamaIndexはバージョン更新のたびに破壊的な変更が多くバージョンを固定しないと期待通りに動かないことが多いです。

先日の記事のように最初に開発環境を整えることを推奨します。少なくともvenvやvirtualenvのような仮想環境は必ず使いましょう。

christina04.hatenablog.com

続きを読む

VS CodeのPython環境をDev Containersで構築する

概要

PythonはGoと違ってライブラリのdeprecatedや破壊的変更が多いため、環境やライブラリバージョンの固定が非常に重要です。

  • Dev Containers
  • poetry
  • 仮想環境(venvなど、今回はpoetryのvirtualenv)

を使うことで、それらを固定してチーム内で安定した開発環境を構築できます。

環境

  • macOS 13.6
  • Dev Containers 0.346.0
  • python 3.11.8
  • poetry 1.7.1

役割

Dev Containersのアーキテクチャはこのようになっています。

ref: https://code.visualstudio.com/docs/devcontainers/containers

続きを読む

GKE Ingressのヘルスチェック生成ルール

概要

GKE Ingressを使うとGCE LBのヘルスチェックが自動的に作成されますが、一定のルールがあります。

これらを理解していないと期待しないヘルスチェックが作成され、疎通ができなかったりするのでまとめておきます。

生成ルール

GKE Ingressは次の流れでヘルスチェックを作成します。

  1. BackendConfigがあればそれを使う
  2. PodにreadinessProbeが設定されている、かつ条件を満たす場合それを使う
  3. 1, 2を満たさない場合、デフォルト値を使う

それぞれについて詳細な設定方法を説明します。

続きを読む

Function callingのJSON Schemaをpydanticで生成する

背景

Function callingJSONを定義する際はJSON Schemaを用いますが、JSON Schemaは覚えることが多く不慣れだと非常に扱いにくいです。

pydnaticを使うとクラス定義から簡単にJSON Schemaを生成できるので、PythonJSON Schemaを利用する際はおすすめです。

環境

  • python v3.11.8
  • pydantic v2.6.1
  • openai v1.12.0

要件

例えば次のようなJSONがFunction callingで返ってほしいとします。

{
    "ingredients": [
        {
            "ingredient": "人参",
            "amount": "1本"
        },
        {
            "ingredient": "豚ひき肉",
            "amount": "100g"
        }
    ],
    "cookwares": ["フライパン", "ボウル"],
    "instructions": ["材料を切ります。", "材料を炒めます。"]
}
続きを読む

pyenvからインストールする際にSSLがないというエラー

背景

pyenvでpython 3.10.13をインストールしようとしたところ、次のようなエラーを受けました。

$ pyenv install 3.10.13
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.10.13.tar.xz...
-> https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tar.xz
Installing Python-3.10.13...
python-build: use readline from homebrew
python-build: use ncurses from homebrew
python-build: use zlib from homebrew
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/Users/jun06t/.pyenv/versions/3.10.13/lib/python3.10/ssl.py", line 99, in <module>
    import _ssl             # if we can't import it, let the error propagate
ModuleNotFoundError: No module named '_ssl'
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 13.6 using python-build 20180424)

その解消方法です。

環境

  • macOS 13.6
  • pyenv 2.3.35
続きを読む

tmuxでコピーモードを使った時にDeepLに渡されてしまう

背景

tmuxでコピーモードで範囲選択によるコピー機能をよく使っていますが、そこでコピーしたものがそのままDeepLの翻訳の方へ渡されてしまう問題に悩まされてました。

今は有料版なのでコピーしたものが学習データに使われることはありませんが、偶にDeepLのアプデで?ログアウトされてしまっていることがあります。
そうなると無料版状態となり学習データに使われてしまい、情報漏洩に繋がるので解決したかったのがきっかけです。

環境

  • tmux v3.3a
  • Alacritty 0.13.1
  • macOS 13.6

一般的にコピーモードの値がクリップボードに渡されるように次の設定を.tmux.confに入れています。

# コピーモード完了時にクリップボードにコピー
set-window-option -g mode-keys vi
bind-key -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "pbcopy"
続きを読む