Windows PCでのLangfuseのセルフホスト環境構築


# 概要

- 本記事は、Dockerやサーバ構築の素人がWindowsPCに[Langfuse](https://Langfuse.com/)をセルフホスト（ローカル環境）で導入する方法を調べた忘備録である
- 個人利用を目的に構築したが、商用(社内利用)もできるはずである。詳細は各S/Wのライセンスを確認のこと
- 導入環境は以下
  - OS: Windows 11 Home
  - Langfuseの導入には、Langfuse本体に加えて、WLS2(Ubuntu)、Docker Engineを利用
    -  Dockerは、Docker Desktopではなくdocker engineを使用



# 背景

- LangChainを用いたLLM（大規模言語モデル）アプリケーションの開発において、LLMの動作確認を効率化する方法を調査
- 試用レベルのために、まずは手持ちのWindows PCで、使用回数に制限がなく無料で構築できることを目指した
- LLMの動作確認フレームワークは[LangSmith](https://www.langchain.com/langsmith)が有名であるが、使用条件によっては費用がかかる
  - ただし、趣味の範囲では問題ないレベルかもしれない（未調査）
  - そのため、まずはLangSmithを利用し、問題があればLangfuseの利用を検討した方が望ましい可能性あり
- 使用料を気にせず利用できるため、Langfuseを選定した。Langfuseはセルフホストで（ローカル環境に）構築する
- Langfuseのローカル環境の構築には、Dockerによる方法が簡便と判断した
- Dockerの導入はDocker Desktopのインストールが簡単であるが、WSL2、Dockerの勉強も兼ねて、WSL2のLinuxにDocker Engineをインストールした
  - Docker Desktopは、商用利用では有償となっているために要注意（※企業規模による）


---


# 環境構築

## 概要

- Langfuseをセルフホスト（ローカル環境）で実行するために、Dockerを使用する
  - Dockerはコンテナと呼ばれる単位で仮想環境を作成するプラットフォーム
  - Dockerを使うことでアプリケーションを手軽に仮想化・実行できる
- DockerはLinux環境（Linuxカーネル）を必要とするために、WSL2でLinux（Ubuntu）を導入する
- そのため、以下の順で導入手順を示す
  - WSL2
  - Docker
  - Langfuse




## WSL2

### インストール手順

- WSL2（Windows Subsystem for Linux 2）は、Windows上でLinux環境を動作させるための仮想化技術であり、Windows10 ver2004移行であればインストールできる
- 手順は公式（Microsoft）の手順通りに実行すれば、インストール可能。参考として実行例を以下に示す
  - [手順](https://learn.microsoft.com/ja-jp/windows/wsl/install)
  - デフォルトではUbuntuがインストールされる
  - WSL1を入れる場合やLinuxのディストリビューションを指定する場合は、手動で明示的に指示する必要がある
    - [以前のバージョンの WSL の手動インストール手順](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual)

<details>
<summary>（参考）実行例</summary>


- 管理者権限のPowerShellでインストールコマンド(wsl --install)を実行した際の出力例を示す
- 実行時表示例
  - ダウンロード中: Linux 用 Windows サブシステム 2.4.13
  - インストール中: Linux 用 Windows サブシステム 2.4.13
  - Linux 用 Windows サブシステム 2.4.13 はインストールされました
  - この操作を正しく終了しました
  - ダウンロード中: Ubuntu
  - インストール中: Ubuntu
  - ディストリビューションが正常にインストールされました。'wsl.exe -d Ubuntu' を使用して起動できます

</details>

### WSLのコマンド概要

- wslコマンドの概要を示す。Linuxカーネル(bash)のコマンドについては省略する

  - WSL（Linux）を実行する
    - wsl -d {Distribution Name}
  - インストールされているディストリビューションの確認
    - wsl -l 
  - 既定のディストリビューションを変更する
    - wsl -s {Distribution Name} (または wsl --set-default {Distribution Name})
  - ファイル移行
    - LinuxからWindows の場合
      - cd /mnt/c
    - WindowsからLinux の場合
      - エクスプローラで以下に移動する
      - \\\\wsl.localhost\\  もしくは　Linuxアイコンをクリック
  - LinuxからWindowsファイルやプログラムを起動
    - posershell.exe /c start

  


### 参照サイト

1. [Windows Subsystem for Linux に関するドキュメント](https://learn.microsoft.com/ja-jp/windows/wsl/)
2. [WSL を使用して Windows に Linux をインストールする方法](https://learn.microsoft.com/ja-jp/windows/wsl/install)
3. [WSL の基本的なコマンド](https://learn.microsoft.com/ja-jp/windows/wsl/basic-commands#installI)
4. [とほほのWSL入門](https://www.tohoho-web.com/ex/wsl.html)




## Docker


### インストール手順概要

- Docker Engineをインストールする方法は以下の4つである。今回は2番でインストールする

  1. Docker Desktop for Linuxにバンドルされているものを使う
  2. Dockerのaptリポジトリからインストールする
  3. 手動でインストールする
  4. 公式が提供しているインストールスクリプトを使う。テストや開発環境でのみ推奨される

  

### インストール手順（Using apt）

- Linux環境に入り、Dockerの公式サイトの手順（以下）に従えば問題なくインストール可能
  - [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)
- （任意）デフォルトではdockerの実行にはroot権限（sudo）が必要。ログインユーザに権限を与える手順は以下
  - [Manage Docker as a non-root user](https://docs.docker.com/engine/install/linux-postinstall/)


<details>
<summary>（参考）インストール詳細</summary>

- Dockerのサイトに記載の通りであるが、参考までに補足を追加して示す

- Dockerのダウンロードに向けた準備（証明書、キー）

  ```
  sudo apt-get update
  sudo apt-get install ca-certificates curl
  sudo install -m 0755 -d /etc/apt/keyrings
  sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
  sudo chmod a+r /etc/apt/keyrings/docker.asc
  ```

  - ca-certificates: 信頼できる認証局の証明書を提供し、HTTPSなど安全な通信を可能にする
  - curl: URLを介してデータを取得・送信するツールで、Web APIやファイルダウンロードに使用される
  - gnupg: 暗号化とデジタル署名を行うツールで、データの安全性を保証

- Dockerのリポジトリ(ダウンロード元)を追加

  ```
  echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  sudo apt-get update
  ```

- Dockerのパッケージ類をインストール

  ```
  sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  ```

  - docker-ce:　オープンソース版のDocker CE(Communitiy Edition)
  - docker-ce-cli: Dockerのコマンドラインインタフェース. コンテナ作成・起動・削除等を行う
  - containerd.io: Dockerの動作に必要なコンテナランタイム
  - docker-buildx-plugin: Dockerのビルド機能を拡張するためのプラグイン
  - docker-compose-plugin: Docker Composeを使うためのプラグイン

- インストールできているかの確認

  ```
  sudo docker run hello-world
  ```

</details>

### Dockerコマンド

- Langfuseの実行に必要なコマンドのみを記載する。詳細は長くなる（＋勉強中）のために省略する

- 起動

  - sudo docker compose up -d
    - 同フォルダ内にあるdocker-compose.yml(設定ファイル)に従い、コンテナを作成・起動する
    - "-d" はバックグラウンドで実行するオプション

- 停止

  - sudo docker compose down
    - 起動中のコンテナを停止・削除する

  


### 参照サイト

- [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)
- [WSL2のUbuntuにDockerをインストールする](https://qiita.com/Jazuma/items/9274d90167a3b61791fa)
- [WSL(Ubuntu)にDocker環境を構築する](https://zenn.dev/thyt_lab/articles/fee07c278fcaa8)





## Langfuse

### インストール（実行）手順概要

- Langfuseの公式サイトの手順に従えば、問題なく実行できる。参考までに以下に概要を記載
  - [Langfuse self-host Local/VM](https://Langfuse.com/self-hosting/docker-compose)
- なお、Dockerを用いた方法を記載するが、本番環境では安定性、管理の観点からKubernetesの使用が推奨されている
  - Kubernetesは、コンテナの運用管理と自動化を行うオープンソースソフトウェア
- Langfuseを実行している状況で、ブラウザで "http://localhost:3000" を開くことでLangfuseを操作できる
- localhost（Langfuseの実行PC）以外からアクセスするには、下記に示すネットの追加設定が必要


<details>
<summary>（補足）実行詳細</summary>


- GithubからLangfuseをダウンロードし、ダウンロードしたLangfuseフォルダに移動
  - git clone https://github.com/Langfuse/Langfuse.git
  - cd Langfuse

- Dockerでdocker-compose.ymlを実行して、Langfuseを起動させる
  - docker compose up

- “Ready”と表示されればOK。最初はimageファイルを作成・ダウンロードのために数分かかる
- ブラウザで http://localhost:3000 を開けるかを確認する

</details>




### 実行

- ブラウザで起動中にLangfuse（デフォルト: http://localhost:3000 ）に入り、プロジェクトを作成する
- 作成したプロジェクトのパブリックキー、シークレットキーを取得し、LangChain等のプログラムに設定する
- Langfuseへの出力方法は多数あるが、例えば、LangChainのcallbacksに追加することで出力できる。以下の例を参照のこと

    ```python
    from Langfuse.callback import CallbackHandler
    Langfuse_handler = CallbackHandler(
        public_key="<public key>",
        secret_key="<secret key>",
        host="http://localhost:3000"
    )
    
    # <Your Langchain code here>
     
    # Add handler to run/invoke/call/chat
    chain.invoke({"input": "<user_input>"}, config={"callbacks": [Langfuse_handler]})
    ```

- その他の詳細は以下などを参照する
  - [Get Started with Langfuse Tracing](https://Langfuse.com/docs/get-started)

- キー等は必要に応じて、環境変数として設定してもよい
  - os.environ["Langfuse_PUBLIC_KEY"] = "Public Key"
  - os.environ["Langfuse_SECRET_KEY"] = "Secret Key"
  - os.environ["Langfuse_HOST"] = "Host"  
- トレース結果を区別しやすくするために、traceに名前やtagを設ける場合、上記の例ではCallbackHandlerの引数で設定する
  - CallbackHandler(tags=["tag_name1", "tag_name2",], trace_name="Trace Name")  
- ローカルホスト以外からアクセスする場合は以下のネット設定を参照のこと




### （補足）ネット設定
- localhost以外から実行する場合はネット設定（Firewallとポートの設定）が必要となる
- Firewall
  - 以下などを参照して、送受信の両方について特定のポート(3000)を解放する
  - [特定ポートの解放](https://support.borndigital.co.jp/hc/ja/articles/360002711593-Windows10%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E9%96%8B%E6%94%BE%E3%81%99%E3%82%8B) など  

  
- ポート：外部からWSL2にアクセスする設定（ポートフォワード設定）
  - WindowsとWSL2上のLinuxは、仮想ネットワークで接続された別ホストとして扱われ、Linuxには外部から直接アクセスできない
  - そのため、WindowsへのアクセスをLinuxに転送する設定が必要
  - [wsl2のネット設定について](https://zenn.dev/splusl_at/articles/wsl2-connect-outside)

<details>
<summary>ポート設定のコマンド例</summary>

- 書式
    - netsh interface portproxy add v4tov4 listenaddress=<転送元IPアドレス> listenport=<転送元ポート番号> connectaddress=<転送先IPアドレス> connectport=<転送先ポート番号>
    - 今回の場合、ポート番号は3000のために以下となる
    - netsh interface portproxy add v4tov4 listenaddress=xxx.xxx.x.xx listenport=3000 connectaddress=yyy.yyy.y.yy connectport=3000
      - xxx.xxx.x.xx : wsl2をインストールしているwindowsPCのアドレス。windows側でコマンドを起動してipconfig などで確認する
      - yyy.yyy.y.yy : wsl2のアドレス。wsl2に入り、"hostname -I" などで確認する。windows側で "wsl hostname -I"でも可。Windowsを再起動すると変わる可能性があるために注意する
    - 設定したポートフォワード設定は以下で確認できる
      - netsh interface portproxy show v4tov4
    - 削除は以下
      - netsh interface portproxy delete v4tov4 listenaddress=xxx.xxx.x.xx listenport=3000

- 上記の設定後、別PCからLangfuseの実行PCのアドレスでアクセスできるかを確認する
  - "http://xxx.xxx.x.xx:3000"

- 問題なければ、LangChainのプログラムにおいて、Langfuseのホストを変更すれば他のPCで呼びだしたLLMの出力も反映される
  - host="http://xxx.xxx.x.xx:3000"

</details> 


### 参照サイト

* [Langfuse](https://Langfuse.com/)
* [Langfuse get-started](https://Langfuse.com/docs/get-started)
* [Langfuse self-host](https://Langfuse.com/self-hosting)
* [GAO, Inc. - 生成AIのビジネス活用 - Langfuse](https://www.gao-ai.com/blog/categories/Langfuse)
* [Observability & Tracing for Langchain](https://Langfuse.com/docs/integrations/langchain/tracing)

* [Lnachain - Langfuse](https://python.langchain.com/docs/integrations/providers/Langfuse/)
* [query-traces](https://Langfuse.com/docs/query-traces)
* [wsl2のネット設定について](https://zenn.dev/splusl_at/articles/wsl2-connect-outside)



---


# 免責

- 提供される情報の正確性や完全性を保証しない。
- 本情報の活用によって生じた損害について責任を負わない。