Joy to the world

とある中小企業のしがない技術者でクリスチャンな人が書く日記。実はメビウス症候群当事者だったり、統合失調症のパートナーがいたりする。

ローカルでRAGをやる

最近はAI熱下がり気味だけど、ふと思い立ってローカルLLMをやってみた。

というのも、Jan-v1なるLLMが軽いけど高性能という話を聞き、LM Studioからモデルをインストールし、Anything LLMでRAGとWebスクレイピングをやってみた。

システム構成

あとから実現するためのメモを残しておく。

LLM:Jan-v1-4b 埋め込みモデル:mixedbread-ai/mxbai-embed-large-v1

構築手順

  1. LM Studioをインストールする
  2. 上記のモデルをダウンロードする
  3. APIを有効にする
  4. コンテキストウィンドウをGPUメモリの上限まで上げとく
  5. Anything LLMをインストールする
  6. Anything LLMでLM Studioを使うように設定する
  7. エージェントの設定でAPI関連の設定をしておく

使用感

今までの軽量モデルは正直使いどころが無いレベルだったけど、Jan-v1-4bはまあ使えなくはないかなと思えるレベル。Perplexity Proと同等レベルの性能を謳っているが、全くの嘘っぱちというわけではなさそうだ。

今まで、内蔵GPUだったりエントリーレベルのグラボで使えるLLMというのは、日本語が変だったりツール使うのが下手くそだったりで正直使いどころがなかったが、これならちょっとした調べ物くらいには使えるかなといった印象だ。

流石に快適とは言い難いが、11世代のノートPCのiGPUでこれだけ動くのだから、倍くらいの性能があれば結構実用的に動くのではないかと思う。

そういうわけで、ちょうど家のデスクトップPCのグラボ(GT710という化石)の性能に嫌気が差していたので、GeForce GTX 1050 Tiを中古で買ってみた。どうせ古いPCなので、最新のグラボを買ってもボトルネックになるだけなので、あえて古い中古GPUを購入してみた。7000円位でお買い得だったので。

3DMark Time Spyのスコアでは、会社で使ってるCore 5 Ultra 245の内蔵GPUと同じくらいのスコアなので、このGPUでそれなりに動いたら、会社でローカルLLMを使うときの指標になるかなとは思う。

まあVRAMが4GBなので、どのみち4Bくらいのモデルを使わざるを得ないのは分かりきっているので、前述した組み合わせのRAGやWeb検索してまとめる作業が速くなればいいかなくらいの期待度ではあるが。

RAGってあまりモデル性能と結果の質が比例しない気がしていて、クラウドのモデルを使っても結果が微妙だったりするので、RAGやWeb検索についてはローカルLLMでいいんじゃないかなとは思っている。

それにしても、リーズニングモデルである程度まともに動くLLMが、こんな型落ちノートPCだったり中古の化石グラボだったり、最新CPUの内蔵グラフィックでそれなりに動くというのは、時代の変化を感じて久しぶりにワクワクした。

追記メモ

しばらく使っていて思ったが、Perplexity的な使い方をする場合はLM Studioから使ったほうがいい。Anything LLMだと進捗がわかりにくい。

MCPは下記の通り。

{
  "mcpServers": {
    "github.com/marcopesani/mcp-server-serper": {
      "command": "npx",
      "args": [
        "-y",
        "serper-search-scrape-mcp-server"
      ],
      "env": {
        "SERPER_API_KEY": "Your_API_Key"
      }
    }
  }
}

逆に、RAGをやるならAnything LLMにしたほうがいい。

と思ったが、どのみち量子化モデルで性能が微妙なので、LM Studioの簡易的なRAGで十分な気もしてきた。

コードインタプリタ便利かもしれない

ChatGPTのコードインタプリタ、結構いろいろなライブラリが使えて、それなりに使える。うまいことやれば、ちょっとしたデータ解析は全部コードインタプリタでできそう。参考に、ChatGPTのコードインタプリタで使えるライブラリを貼っておこう。


ChatGPTのコードインタプリタでは、多様なPythonライブラリが利用可能です。これらは主に以下のカテゴリに分類されます。

データ分析と可視化

  • pandas: データ操作と分析[1][2]
  • numpy: 数値計算[1][4]
  • scipy: 科学計算[1][4]
  • xarray: 多次元データの処理[1]
  • matplotlib: グラフ作成[1][2]
  • seaborn: 統計データの可視化[1]
  • plotly: インタラクティブな可視化[1]
  • bokeh: インタラクティブな可視化[1]
  • Vaex: 大規模データの解析[4]
  • Polars: 高速データフレーム操作[4]

機械学習自然言語処理

画像・音声処理

  • pillow (PIL): 画像操作[1][2][4]
  • imageio: 画像入出力[1]
  • opencv-python: コンピュータビジョン[1][4]
  • scikit-image: 画像処理[1][4]
  • librosa: 音声分析[1][2]
  • pyaudio: オーディオ処理[1][2]
  • soundfile: 音声ファイル処理[1]
  • MoviePy: 動画編集[2][4]

ファイル形式処理とWeb開発

  • openpyxl: Excel操作[1]
  • xlrd: Excel読み込み[1]
  • PyPDF2: PDF処理[1][2]
  • python-docx: Word文書処理[1]
  • flask: Webアプリケーション開発[1][2]
  • django: Webフレームワーク[1]
  • tornado: 非同期Webサーバー[1]
  • quart: 非同期Webフレームワーク[1]

統計と科学計算

  • statsmodels: 統計モデル[4]
  • SymPy: シンボリック数学[4]
  • PyMC3: ベイズ推定[4]
  • Astropy: 天文学向けライブラリ[4]
  • Prophet: 時系列予測[4]
  • Darts: 時系列分析[4]

これらのライブラリは、データ分析、機械学習、画像処理、テキスト処理など、幅広いタスクに対応しています。なお、コードインタプリタはインターネットアクセスがなく、外部パッケージのインストールができないという制限があります[5]。

Citations: [1] https://community.openai.com/t/code-interpreter-python-packages-list-of-packages-available-in-the-environment/198477 [2] https://qiita.com/yuuki-111/items/8cc1339b0b0168663c80 [3] https://beehivelearning.org/libraries-available-in-chatgpt-code-interpreter/ [4] https://qiita.com/kabumira/items/c07b28226e5af78afca1 [5] https://github.com/SkalskiP/awesome-chatgpt-code-interpreter-experiments [6] https://qiita.com/tomohiku/items/b9c379692ed64c7e4945 [7] https://www.seraku.co.jp/tectec-note/industry/chatgptcode_interpreter/ [8] https://github.com/0xeb/TheBigPromptLibrary/blob/main/Articles/chatgpt-sandbox/chatgpt-code-pkglist-08232024.md [9] https://qiita.com/ot12/items/39ff4264e0f13209ba62 [10] https://birdmanikioishota.blog.fc2.com/blog-entry-20.html [11] https://zenn.dev/currypurin/scraps/01241f00caf9dd [12] https://community.openai.com/t/referenced-relevant-libraries-in-code-interpreter-etc/232130 [13] https://stackoverflow.com/questions/76667874/how-can-i-install-python-library-in-chatgpt-code-interpreter [14] https://www.linkedin.com/posts/uldisbojars_libraries-available-in-chatgpts-code-interpreter-activity-7222238384503595008-hYM2 [15] https://qiita.com/HikoMSP/items/4231f7218f92ce1b14b3 [16] https://www.insource.co.jp/python-gakuin/chatgpt_code_interpreter_python.html [17] https://github.com/eon01/awesome-chatgpt [18] https://www.reddit.com/r/ChatGPT/comments/14vu01h/is_there_a_list_of_libraries_that_are_built_into/


Perplexity の Eliot より: pplx.ai/share

治具・回路設計時に使えるサンプル集メモ

個人的な見解ではあるが、プログラミングについてはずっと専門でやってきたし、やりたいことを実現するための道筋も見えるのであまり苦労していないのだが、治具や回路設計のノウハウが少ないのがネックに感じている。

人間、何でもかんでも得意なワケがないので、自分がそれほど得意ではない分野は他人のマネをするのが手っ取り早い。

そういうわけで、自分が普段から参考にしている・データをもらっているサイトをリストアップすることにした。

まあ、昔から自分は物を使いこなすとか、他のを真似てちょっと変えるってのが好きなので、こういう方向性で仕事や趣味をするのもいいのかなと。

inCAD Library(インキャドライブラリー) - ミスミ

jp.misumi-ec.com

ミスミの宣伝感がある設計例だが、割と色々と参考になるので良い。アッセンブリ済みのファイルが手に入るのも嬉しい。

Thingiverse

www.thingiverse.com

ほとんど3Dプリンタ専門のモデルだが、時々治具関連のモデルも有る。どちらかというと3Dプリンタで完結するモデルが多いので、あったら便利だなぁって物を作る際に参考になるかもしれない。

Autodesk Instructables

www.instructables.com

このサイトはどちらかというとDIY寄りのサイトで、人にもよるが結構懇切丁寧に作る手順が書かれている。

TraceParts

www.traceparts.com

とにかくあらゆる分野のCADデータが有る。この部品のCADデータ無いかなぁと思ったらここを見てみるのが良い。

JST

www.jst-mfg.com

我々の業界ならみんなが知っているJST。その有名さ故に、Amazonで互換品が大量に出回っていることでも有名。DIYとかちょっとした内製治具なら、全部JST互換のコネクタを使ってもさほど問題ないと思う。
CADデータのダウンロードは面倒くさいが、これが有るのと無いのとでは設計時の楽さがぜんぜん違うので、断然あった方が良い。

Ultra Librarian

www.ultralibrarian.com

これは完全にIC関係のフットプリント・3Dモデル専用サイト。3Dモデルは一見不要そうに見えるが、筐体内に基板を組み込みたい場合の干渉確認など、やはり3Dモデルは有るに越したことはない。

3D ContentCentral

www.3dcontentcentral.com

こちらも、どちらかというと部品のCADっぽい。

WPFの自動化クソめんどい問題

仕事柄、GUIなアプリケーションの自動化を結構な頻度でやるのだが、WPFアプリを自動化する場合結構面倒くさい問題が発生してしまう。

Windowsアプリケーションの自動化って結構色々と方法があって、最近だとAutoItを好んで使用しているのだが、これの自動化がいわゆるWinFormsを前提としていて、WPFみたいにXAMLで構築されたUIではコントロールの操作ができない。

これの対策として、今のところはC#のUI Automationを使用しているのだが、これもなかなか癖のあるもので、要素を特定するためのAutomation IDが結構変わることがあるのだ。IDとは一体。

Automation IDが変わるということは、直接指定するためには他に一意となる何かを使用するわけだが、これも変動しないID的なものが何かイマイチ分からず、仕方がないので要素総なめして検索するしかなさそうだ。

ちなみに、WPFアプリケーションの構造を解析する場合、みんな大好きspy++ではできなくて、Inspect.exeなるツールを使う必要があり、こちらもなぜかクソ重い謎仕様だったりする。やはりWindowsの自動化の道程は険しい。

こういうの見てると、シェルコマンドで大抵のことができてしまうLinuxってのは、コンピュータをコンピュータとして使用するうえで非常に便利なのだなと再認識できる。

CNC3018の剛性をなんとかしたかった話

ここ最近、CNC3018の剛性をなんとかしようと、ステージ周りの強化パーツを設計して色々と思案していたのだが、そもそも本当にステージの剛性が低いのかと確認してみた。

確認したところ、どうもステージの剛性は大して悪くないようで、悪いのはシャフトの剛性らしい。

まあこれは随所で議論されている内容だが、他のどこを剛性強化しても、やはりXY軸のリニアシャフトが弱い。というか、他のものを強化すれば強化するほどリニアシャフトが弱点になる。

これがCNC3018の限界のような気がする。特に自分の場合、Y軸を拡張してるのでなおさらシャフトの剛性がネックになる。色々と検討してみたが、大して改善しそうにもないので、やはり切削条件の調整を行う方向で検討したいと思う。

まあ、おそらくいちばんよく使うであろう基板切削に特に問題はないので、金属ガリガリ削るでもなければ、このままでも特に困らなかったりもするのだが・・・。

WPFアプリ自動化手法

仕事柄、アプリケーションの自動化をやることが多々あるのだが、今まではWin32API叩いたり、AutoITを使ったりしてきた。

Win32APIネイティブのアプリだったり、.NET Frameworkで作ったWinFormsアプリだったりならSpy++とかAutoIt Infoで要素が取得できるのだが、WPFで作られたアプリはこれができない。

実は長らくこの問題に悩まされており、今まではマウス座標を指定するとか、なんかそういった方法でごまかしてきた。しかしながら、最近は流石にWPFとかUWP(こっちはもう死に体かもしれない)が増えてきて、そろそろモダンなアプリでも、要素を指定してクリックしたいなぁと思っていた。

こんな要望が無いのか、はたまた当たり前なのかはわからないが、ググってみてもこれと言った情報がない。一時期RPAツールがもてはやされたが、そういったツールが出来ている時点で、WPFを自動化する方法もあるはずなのだが。

Inspector

兎にも角にも、まずはSpy++のWPF版みたいなのを探さねばならない。これは

C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\inspect.exe

を使えば良い(10.0.19041.0はビルド番号)。時々挙動が怪しいが、まあとりあえず使える。

C#での自動化

色々と調べたところ、どうもUI Automationを使えば良さそうだ。これならレガシーなOSでもそれなりに動きそうなので安心。

結論

Inspectorで調べて、UI Automationでよろしくやれば色々と捗りそうだ。多分これからも自動化プログラムを作る機会は増えると思うので、今度ためしてみる。

TesseractとOpenCVで無双できるのでは

最近ふと思ったことなのだが、フォーマットが決まっているデータを大量にOCRしたい的な作業がある場合、OpenCVで前処理してTesseractにぶん投げれば、ある程度快適なOCR環境ができるのではないかと思った。

通常、スキャンした画像をOCRしたい場合、Adobe Acrobatなどの商用ソフトウェアを使用するのが一般的だとは思うが、そこそこ精度は良いものの、フォーマットが決まっている書類を確実にOCRするとか、特定の箇所のOCR結果をCSV保存するとかはできない。

これをやろうと思うと、多分別のソフトが必要なのだが、Adobe Acrobatにアドビ税を払っているのに、これ以上金をつぎ込むのはどうも気に入らない。

そういうわけでちょっと考えたのが、傾き補正とかはAdobe Acrobatにやらせるとして、その後の特定の箇所から特定の文字のみを抜き出す的な作業を、OpenCVとTesseractにやらせればよいのではと思うようになってきた。

つまり、特定のフォーマットの特定の文字とか、適当な図など、とにかくどの書類にも入っているテンプレート的な箇所をOpenCVでテンプレートマッチングして、そこからの相対座標でROIを指示し、その中身だけをTesseractに突っ込む。

Tesseractは前処理された画像に対しては結構精度が高いので、まあそれなりの結果は得られるのではと思う。

まあ、これは大量に処理する場合の話であって、実際のところは手動ROI指定(必要なところのみをスクショ)して、その画像をTesseractに突っ込んだほうが速い気がする。