$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

chat-hatenablogのv0.1.0をリリース & 開発メモ

ChatGPTを使って自分のはてなブログとチャットするツールを作った - $shibayu36->blog;で紹介したchat-hatenablogのv0.1.0をリリースした。リリース内容は本当にちょっとしたものなので、追加で開発メモを公開しておく。

リリース内容

https://github.com/shibayu36/chat-hatenablog/releases/tag/v0.1.0

ユーザー的に変わるところは、呼び出しインターフェースが変わっただけ。breaking changeなのでバージョンを切っておいた。元々はmake_index.pyとask.pyを使っていたが、1コマンドに統一してサブコマンドとして実行するようにした。

./chat-hatenablog make-index --mt-file blog.shibayu36.org.export.txt
./chat-hatenablog ask --query コードレビューで大切なこととは?

後は内部のリファクタリングやテストの追加をした。これは今後「エントリーを編集した後インデックスを作り直してもおかしくならないように」「他人のブログのインデックスを作る」ということをしやすくするため。

開発メモ

ChatGPTやCopilot使いつつ開発していったら勉強になったのでメモだけ残す。Python詳しくないので真偽は怪しい。

PythonのCLIツールでバージョンをどう表示するか

__version__.pyを用意してバージョンを管理して、--versionオプションがついてきた時に表示するのが良さそうだった。

Pythonのパッケージシステム

基本はディレクトリベースのパッケージシステムっぽかった。Python3.2以前は__init__.pyがある場所がパッケージとして認識されてimportできるようになっている。しかし3.3以降はなしでも良いらしい。一方で後方互換性のためや、パッケージから公開するものを明示するために置いてあることも多いようだ。

例えばllama_indexの例を見ると、サブディレクトリの内容を明示的にimportして公開しているものを明示しているように見える。

自分もこれに則って、__init__.pyにモジュールの一覧を書いてみた。

テスト

pytestを使ったら便利ということがわかった。テストの導入は https://github.com/shibayu36/chat-hatenablog/pull/10

またモックについては、最初はChatGPTにDIしろやって教えられた。しかし、このくらいのツールでDIするの面倒だからなんかスタブする方法教えてよって言ったらunittest.mockが使えるって教えてもらえた。便利。

このような感じでさっとAPI利用部分をスタブできて便利。

pytestなど開発用の依存パッケージを書く場所は分けると良い

requirements.txtに依存パッケージを書いているが、pytestなどは実行するために必要ではない。どうやって管理するのが良いのかなと思っていたが、単純にファイルを分ける形式が多いようだ。

例えばrequestsとかは、requirements-dev.txtを作っていた。実際に必要なパッケージはsetup.pyで管理されていそう。

これらを真似して、https://github.com/shibayu36/chat-hatenablog/blob/main/requirements-dev.txt を作っている。

まとめ

今回は簡単にリリース内容紹介 + 開発メモをブログにした。今まで新しい言語を使うときは、まず本を読んで理解した上でざっくり理解してから書くという流れだったのが、何も体系的に学ばずにChatGPT/GitHub Copilotで雑に書きながら学ぶみたいなことが出来るのは面白い。

ChatGPTに参考となるレポジトリをいくつか聞くと便利

全く初めての言語を扱うとき、その言語の一般的なやり方がわからないことが多い。これまでは書籍を読むことに加え、その言語をよく知る人に「どのレポジトリが参考になりますか?」と聞いて回り、参考になるレポジトリから一般的なやり方を理解していた。

ChatGPT(GPT-4)が出たことにより、ネット上の記事や参考レポジトリを調べ回らなくても一般的なやり方をChatGPTに直接聞くことができるようになった。一方で学習内容が2021/9までしかないため、その参考コードが古い情報を含んでいることが多い。

これらの問題を解決するため、ChatGPTに参考コードを出してもらった上で参考となるレポジトリもいくつか一緒に聞いてみると便利だった。今回はその紹介をする。

GitHub Actionsでpytestを動かしたいケース

例えばGitHub Actionsでpytestを動かしたいと考えた時、僕自身はPythonの知識が少ないのでやり方をすぐに思いつかなかった。そこでまず「pytestをgithub actionsで動かしたいです。どうしますか?」と聞いてみる。すると以下のような内容が返ってくる。

この回答だけでイメージが大体掴めるようになる内容になっている。しかしactions/checkoutのバージョンが古かったり、全体的に古い内容になってしまっている。

そこで自分で良い事例を探すために参考になるレポジトリを聞いてみる。すると以下のような結果が返ってくる。

これによると、例えば以下のようなプロジェクトが参考になるらしい。

これらを見ていくと、最近の使い方や参考になるコードを見つけることができる。この辺りからそれっぽいものを参考にして、自分のプロジェクトにも導入した。

https://github.com/shibayu36/chat-hatenablog/blob/5a61df7f72f65594dc554d3dc2c81cb9209044db/.github/workflows/test.yml

このように参考レポジトリを聞くと、今風のやり方も一緒に学ぶことができて非常に便利だった。

その他にも自分の参考にしたい要件に合わせて聞ける

ライブラリのプロジェクト構成の参考になるレポジトリ。

CLIツールのプロジェクト構成の参考になるレポジトリ。

まとめ

今回はChatGPTに参考となるレポジトリをいくつか聞くと便利という話を書いた。参考になるレポジトリを聞くと、初期の学習効率が上がるので非常に役立つ。

この辺りはChatGPT plugins周りが進歩すると最新情報をいい感じに取得できるようになり、そもそも直接聞くだけで問題なくなる未来もすぐ来るかもしれない。そうなったら嬉しいですね。

ChatGPTを使って自分のはてなブログとチャットするツールを作った

【2023/04/18追記】現在、この記事で説明したものから使い方のインターフェースが変わっているので、実際に使うときは https://github.com/shibayu36/chat-hatenablog のREADME.mdを参考にしてください。

以下の記事を見て、もっと気軽に自分のはてなブログとチャットしたいなと思った。

そこで自分のはてなブログとチャットするツールを作ってみた。 https://github.com/shibayu36/chat-hatenablog

やりたかったこと

僕はコードレビューでコメントする時、自分の意見を補足する目的で、参考となる自分のブログや他の人の記事を紹介することが多い。その時には自分のブログから記事を検索して、該当の記事を見つけて、URLを貼り付けてというようなことをしていて、非常に面倒に感じていた。

ChatGPTを使えば、この作業をよりいい感じにできるのではと考えた。具体的には質問を投げかけると自分のブログを使って回答を生成し、さらに追加で参考URLを出してほしい。

できたもの

以上のことを実現するために、chat-hatenablogというツールを作った。 https://github.com/shibayu36/chat-hatenablog

このツールははてなブログのエクスポート機能で出したMTファイルを使ってインデックスを作り、それを元に回答を生成してくれる。たとえばこんな感じ。回答と共に参考URLも出してくれるので非常に便利。中身も自分のブログっぽいことが出てきている。

$ python ask.py --query GitHubでPullRequestを送ってレビュー依頼をする時、事前にすべきことはありますか?

THINKING...

ANSWER:
はい、事前に自分自身でコードレビューを行うことが重要です。具体的には、必要な部分だけをgit addし、git diff --cachedによって差分を確認し、自分自身でセルフコードレビューを行うことが大切です。また、PullRequest作成時には、自分自身でファイルの内容をレビューし、修正が必要な部分は直し、わかりにくい部分にはGitHub上でラインコメントを行い、必要に応じてコード上にコメントを残す ことも重要です。さらに、ユーザーの導線に影響するコードの場合は、自動テストだけでなく、自分自身でユーザーの行動をトレースし、違和感がある部分が存在しないかチェックすることも必要です。これらの作業を行うことで、手戻りの量を減らし、より品質の高いコードを提供することができます。

refs:
- コード変更で抜け漏れやミスを少なくするための習慣: https://blog.shibayu36.org/entry/2022/04/24/160753
- 仕様や実装方針の相談をPullRequestで行う取り組み: https://blog.shibayu36.org/entry/2016/08/05/103000
- はてなで開催されたGitHub勉強会に行きました: https://blog.shibayu36.org/entry/2014/06/05/021210
- コードレビューを段階的に行ってもらう話: https://blog.shibayu36.org/entry/2016/06/30/110000

使い方

https://github.com/shibayu36/chat-hatenablog をgit cloneした後、いくつか必要なセットアップを行う。

pip install -r requirements.txt

.envファイルへ以下を書く。

OPENAI_API_KEY=...
BASE_URL=https://blog.shibayu36.org/entry/

初回はインデックスを作成する。

python make_index.py --mt-file blog.shibayu36.org.export.txt

一度インデックスを作れば、質問をすることができる。

python ask.py --query GitHubでPullRequestを送ってレビュー依頼をする時、事前にすべきことはありますか?

ブログに新しいエントリが増えたら、再度エクスポートしてインデックスを作り直せば良い。一応差分更新に対応している。*1

python make_index.py --mt-file blog.shibayu36.org.export2.txt

Tips

ChatGPTとGitHub Copilot強い

僕はこれまでPythonをまったく書いたことがなかったのだが、ChatGPTとGitHub Copilotを使ったら、とりあえずそれっぽく書けたのはすごかった...しかも爆速で開発できた。もし使ってなかったら、そもそもPythonの学習から始めないといけなかったと思うので、モチベーションが尽きて完成させられなかったかも。

とりあえずこういうのをサクサク教えてくれて便利。

またCopilotを使っていると、基本構文やライブラリの使い方、メソッドコメント、なんならcommit messageの英語なども含めてサクサク補完してくれて良かった。

ChatGPTとはてなブログを繋げる仕組み

ChatGPTを使って自分のブログ風回答を生成する仕組みを学ぶ - $shibayu36->blog; に書いたので参考にどうぞ。

まとめ

今回は自分のはてなブログを気軽にインデックスしてチャットするツールを紹介してみた。もし使ってくれたら感想ください。

*1:現状新しい記事には対応できているが、昔の記事を編集した場合は変になってしまうことに注意