【#も読】JetBrainsのAI活用 / Church Encoding / DuckDBのSDK(@shunsock)のトップ画像

【#も読】JetBrainsのAI活用 / Church Encoding / DuckDBのSDK(@shunsock)

投稿日時:2025/05/01 03:00
しゅんそくのアイコン

ファインディ株式会社 / データエンジニア

しゅんそく

Xアカウントリンク

「あの人も読んでる」略して「も読」。さまざまな寄稿者が最近気になった情報や話題をシェアする企画です。他のテックな人たちがどんな情報を追っているのか、ちょっと覗いてみませんか?


最近はZennのトレンド芸人になりつつあるしゅんそくです。GWにむけてもりもりコード書いています。

JetBrains IDEとClaude Codeを連携させて擬似Clineにする

私は業務で編集量が多いプロジェクトは基本JetBrainsで書いています。そんな私にとってこの記事は蜘蛛の糸のような存在でした。

https://zenn.dev/laiso/articles/def184d432438b

次の写真はPyCharmの画面です。Claude Codeのコマンド /init で、CLAUDE.md を生成した様子です。

1.png

無事生成されました。Taskfileの対応している部分をちゃんと汲み取ってくれています。

2.png

紹介した画像は下記URLのサンプル用プロジェクトですが、実務でも導入しています。

https://github.com/shunsock/fizzbuzz

Claude Codeの場合、次のように書いておけば実装とテスト、docstringの記述まで完璧にしてくれます。

class Person:
    def __init__(self, name: str):
        pass

    def greet(self) -> None:
        """挨拶を表示"""
        pass

また、型で会話すれば、先にファイルを作らずとも上手くいく印象です。

src dir直下にclass Personを作成して。Personは挨拶を表示するmethod greet() -> Noneを持ちます」といった感じです。

Claude Code + JetBrainsはかなり高額な装備ではありますが、生産性と品質があがるのでかなりオススメです。

IntelliJ IDEAを使っている人は全員Junieを導入しよう!

https://zenn.dev/smartround_dev/articles/b90904e75666a3

僕はメインのPythonの他にもPHP, Go, Rust, .Netなどを書くことがあるため、JetBrainsはAll Products Packを年間契約しています。実のところ、初期の頃のJetBrains AIを月$10位で契約していたのですが、微妙だったので解約した過去があります。(GPT-3.5だったからしょうがないと思う)

このような背景があったので、記事を読んでAI機能がAll Products Packに追加されたことは衝撃でした。

3.png

使った感想ですが、Planを実行前と実行中に表示するUIが良いなと思いました。

4.png

JetBrains Webサイトより

Junieはまだ使いこなせていないので、余暇で知見を深めていきたいです。

Church Encoding: numberやbooleanを関数だけで表現しよう!

https://zenn.dev/socialplus/articles/3498a491bf977b

データ構造を関数だけで表現するという内容に惹かれて読みました。せっかくなので引き算を別言語で実装してみました。

module Main where

newtype Church = Church { runChurch :: forall a. (a -> a) -> a -> a }

zero :: Church
zero = Church $ \_ x -> x

succChurch :: Church -> Church
succChurch (Church n) = Church $ \f x -> f (n f x)

one :: Church
one = succChurch zero

two :: Church
two = succChurch one

three :: Church
three = succChurch two

add :: Church -> Church -> Church
add (Church m) (Church n) = Church $ \f x -> m f (n f x)

predChurch :: Church -> Church
predChurch (Church n) = Church $ \f x ->
  let (p, _) = n (\(p, q) -> (q, f q)) (x, x)
  in p

subChurch :: Church -> Church -> Church
subChurch m (Church n) = n predChurch m

churchToInt :: Church -> Integer
churchToInt (Church n) = n (+1) 0

main :: IO ()
main = do
  putStrLn $ "three converted to int: " ++ show (churchToInt three)
  putStrLn $ "2 + 3 = " ++ show (churchToInt (add two three))
  putStrLn $ "3 - 2 = " ++ show (churchToInt (subChurch three two))
  putStrLn $ "2 - 3 = " ++ show (churchToInt (subChurch two three))

※ gistにも置いています。 https://gist.github.com/shunsock/09b6bff47bd00208ebdcfc96f4004511#file-main-hs-L22

オレオレ RAG をさくっと作る

https://voluntas.ghost.io/slug-quick-custom-rag/

DuckDBとTransformersを組みあわせて、Local RAGを作るという内容でした。読んでほしくなったので夜なべして作りました。

5.png 作ったもの(Private Repositoryなのでスクショ)

今回はPythonで実装しました。Goで当初やろうとしたのですが、補足に書いた理由で断念したのと、FastMCPのアプリケーションをPyInstallerでバイナリ化できると分かったからです。

ちょっと前にFastMCPをバイナリにしようとして失敗したことがあったので心配していたのですが、MCPオブジェクトを次のように起動する方式にすればうまくいくようです。

main.py

import multiprocessing
from app import mcp

if __name__ == "__main__":
    multiprocessing.freeze_support()
    mcp.run() 

app.py

from fastmcp import FastMCP
import duckdb

mcp = FastMCP("ShunsockRag")

@mcp.tool()
def add(query: str):

あとは元記事と大体一緒です。こんな感じで動きます。ちなみにバイナリの大きさは0.14GBぐらいでした。

re6.png

補足

当初はGoで実装しようとしていました。実際、多くの言語でSDKが提供されています。 https://duckdb.org/docs/stable/clients/overview.html

しかし、文書をベクトル化したときにHugging Face API Tokenの発行が必要とのことで断念しました。(API Tokenの発行とそれに依存したテストを書きたくないからです)

https://pkg.go.dev/github.com/hupe1980/go-huggingface#section-readme

もし、DuckDBのSDKが配布されていて、HuggingFaceのAPIが不要でかつ単一の実行形式化が可能な言語があれば教えてください。(本当にほしい)

しゅんそくさんの「も読」過去記事

30
30