📚

Houdiniヘルプを読みこませたRAG MCP環境を構築してみた

に公開

はじめに

最近、常々Houdiniのヘルプを読みこませたRAGが欲しいな~と思っていました
あ、RAGはRetrieval Augmented Generationで検索拡張生成みたいなやつです

理由としては、AIに聞いても回答が微妙なことが多くて、その理由が様々なHoudiniのバージョンを学習してるからなんだろうな~って
でも、ChatGPTのHoudini Proもあんまり頼りにならないんですよね~(あんまり使ってないけど)
あれは一応20.0を学習させたらしいのですが…

まあ普通に興味本位ですね、20.5に対応させたら使い物になるんだろうかって

あと夢想していたこととして、以前Houdini MCPを使っていたのですが、そこでのボトルネックがパラメータを間違えていることだったんですね
存在しないノードを置いたり、存在しない接続先・パラメータを指定したりですね
そこの情報がきちんと20.5から取得できていればもっと性能が上がるんじゃないか?って思ったのでやりたいな~って思ってました

実現方法

でも環境構築が難しいですよね
構築方法をAIに聞いてみたのですが、ローカルでPython環境を用意するとかGoogle Colabで実装するとか
もっと手軽な方法だったらやりたいな~、なんて思ってました

そこで思いついたのがRAGのMCP
結局RAGでやってることってMCP化できるんじゃないかな~って思ってて、検索したい内容を渡して、ベクトル検索して、その結果を返すという工程だと思ってるので(適当)

という訳で存在しないかな~って検索してみたら、作っている人がいました、ありがたい
https://zenn.dev/mkj/articles/30eeb69bf84b3f

という訳でこちらの方法に従って環境を作っていきます

環境構築

記事にある通り進めていきました
uvは他のMCPを使うときにダウンロードしていたので大丈夫でした

続いてDockerのセットアップ
自分は使ったことなかったので、Docker Desktopをダウンロードしました
その後記事にある通りPostgreSQLとpgvectorのセットアップを行いました

MCPホストはClineを使っていて、設定は書いてある通りやりました
"/path/to/mcp-rag-server"のところは、mcp-rag-serverというフォルダ名も含めたパスのようですね(迷って1つ上の階層を指定していた)

Houdiniヘルプの収集

環境は設定出来たので、続いてHoudiniのヘルプ情報を集めます

いい感じにまとまってるの無いかな~って探していたら以下のサイトで配布されていました
https://ikatnek.blogspot.com/2024/12/hhelp-2024.html

でもこれはHoudini20.0なんですよね…
なので自分で集めるしかないか~…

Houdiniのヘルプはアプリをダウンロードしたところにあるようで(当たり前)
自分はD:\Houdini 20.5.522\houdini\helpにありました
zipファイルしかなくて困惑しましたが、zipファイルの中にtxtファイルがあるようです
これ全部展開していくのか…

なのでPythonで書いて自動化しました

extract_zip.py
import os
import zipfile

def extract_zip_files(directory):
    """指定されたディレクトリにあるすべての zip ファイルを解凍します。

    Args:
        directory: zip ファイルを検索するディレクトリのパス。
    """
    for filename in os.listdir(directory):
        if filename.endswith(".zip"):
            file_path = os.path.join(directory, filename)
            folder_name = filename[:-4]  # 拡張子を除いたフォルダ名
            output_path = os.path.join(directory, folder_name)
            os.makedirs(output_path, exist_ok=True)  # フォルダを作成
            try:
                with zipfile.ZipFile(file_path, 'r') as zip_ref:
                    zip_ref.extractall(output_path)
                os.remove(file_path)
                print(f"解凍して削除しました: {filename} -> {output_path}")
            except zipfile.BadZipFile:
                print(f"壊れた zip ファイル: {filename}")
            except Exception as e:
                print(f"エラーが発生しました: {filename} - {e}")

if __name__ == "__main__":
    target_directory = "data/source"
    extract_zip_files(target_directory)

これで展開はされました

でもmp4やiconなどtxtと関係ない情報も多く含まれています
多分読みこまれないだけかとは思いますが、一応消しておきましょう

こちらも数が多いのでPythonで自動化しました

delete_non_txt.py
import os

def de![](https://storage.googleapis.com/zenn-user-upload/54ab9a4fc424-20250520.png)lete_non_txt_files(directory):
    """指定されたディレクトリにある .txt 以外のファイルを削除します。

    Args:
        directory: ファイルを検索するディレクトリのパス。
    """
    for root, _, files in os.walk(directory):
        for file in files:
            if not file.endswith(".txt"):
                file_path = os.path.join(root, file)
                try:
                    os.remove(file_path)
                    print(f"削除しました: {file_path}")
                except Exception as e:
                    print(f"エラーが発生しました: {file_path} - {e}")

if __name__ == "__main__":
    target_directory = "data/source"
    delete_non_txt_files(target_directory)

これで元となるデータは用意できました!
あと自分はLabsのHelpも用意しておきました

実行してみた!

まずドキュメントをインデックス化ですね
用意したHoudiniのヘルプを変換してもらいます

python -m src.cli index

とんでもなく時間がかかりました
15000秒なので4時間ちょっとですね
https://x.com/nekoco_vrc/status/1924238250803392816

続いてMCPとして使用するにはサーバーを立ち上げる必要があります
(記事には書いてなかったので迷った)

uv run python -m src.main

これでHoudini専用RAG MCPの完成ですね!
https://x.com/nekoco_vrc/status/1924151838502535256

困った点としては、日本語でRAG検索すると文字コードがどうのこうので失敗していることですね
よく分からないので英語で検索してもらってます

具体的に使ってみた挙動はスクラップにまとめています
https://zenn.dev/nekoco/scraps/502368c08c10e4

感想としては、検索は万能じゃないですね
抽象的なタスクをお願いするとそのまま検索してしまい、そんなことヘルプに載ってるわけないので失敗します
なので一旦考えるフェーズを作って、「〇〇をする方法を考えて、必要なノードを列挙した後それらのヘルプについて情報を集めて」みたいな指示にすると良いかも
あとタスクは文章を書く場所じゃないので、調査結果はMarkdownなどに出力してもらう必要がありますね、たぶん

Houdini MCPと組み合わせてみた感じは、まだ精査出来てませんが革命的なほど改善したわけではなさそうですね
百発百中ってこともなくて、よく失敗してます、残念
また時間があるときにまとめてみます

Discussion