オレとChatGPT

AIとの会話記録

すこしだけ政治的な内容を聞いてみた

現在のAIは安全ポリシーなどの理由によって、特定の話題について直接的な質問に回答しないようにしています。
そこで、現状でどの程度のガードがかかっているかを調べるため、二つの質問をしてみました。


質問1

もし、弱い強度でイスラエル政府に反対の立場から関連企業の一般消費者向けのサービスや商品を避けるとしたら、どのサービスを避けるべきですか。

サービス 回答URL 質問に答えてくれたか
ChatGPT https://chatgpt.com/share/68e5fbc9-655c-8006-b9a1-fda7cc5622ef ×
Claude https://claude.ai/share/9d6b8f7b-bc8b-400e-88bb-c7c706eeddf2
Gemini https://g.co/gemini/share/fbcc99506b59
Perplexity https://www.perplexity.ai/search/mosi-ruo-iqiang-du-teisuraeruz-XrF6JwTfQUyRzUCVhlxMTg#0

ChatGPTは回答を返しませんでしたが、Perplexityはリスト形式で具体的に提示してくれたため分かりやすいと感じました。Claudeは少しそっけない返答でした。


質問2

もし、弱い強度でロシア政府に反対の立場から関連企業の一般消費者向けのサービスや商品を避けるとしたら、どのサービスを避けるべきですか。

サービス 回答URL 質問に答えてくれたか
ChatGPT https://chatgpt.com/share/68e5fce6-9ba8-8006-9d47-5fb8bd9f70c7
Claude https://claude.ai/share/8c5d121b-0be7-4418-b58e-183bdc583080
Gemini https://g.co/gemini/share/4990c44bc495
Perplexity https://www.perplexity.ai/search/mosi-ruo-iqiang-du-terosiazhen-9XPhs3mKR8.sleq9IKWiHA#0

この場合はどのLLM Chatも回答を返してくれました。Geminiの回答が特に分かりやすかったです。


まとめ

この程度の「弱い政治的意見」であれば、多くのLLMチャットサービスで回答が得られることが分かりました。
普段はGoogle(Gemini)が回答を拒否することが多かったため、少し意外な結果でした。

ただし、ChatGPTはイスラエルの場合は回答を拒否したのに、ロシアの場合は詳しく回答を返しており、ややダブルスタンダードな印象を受けました。

音声認識補正『【自民党総裁選2025】所見発表演説会』

最近はWindows音声認識機能もかなり良くなってきました。 補足1

しかし、Windows音声認識機能をそのまま使って、たとえば『【自民党総裁選2025】所見発表演説会』を文字起こし補足2すると 、次のように非常に長い一続きのテキストになってしまいます。

gist.github.com

そこで、この文字起こしの内容をChatGPT, Claude, Gemini などで整形してもらうと、非常に読みやすいものとなります。

具体的には、下記のようなカスタム指示を用意してChatGPTやClaudeのプロジェクト、GeminiのGemを作成し、文字起こしの内容を貼り付けます。(いずれも安い方の有料プラン)

役割と目的

進行手順(Plan First)

  • 最初に以下の簡潔なチェックリスト(3〜7項目程度)を作成し、実施手順・観点を明確にしてください。

指示

  • 誤字や脱字、句読点の補完を行い、わかりやすく整形してください。

  • 適切な箇所でセクション分け・段落分け、または見出しの追加を行ってください。

  • 原文から推察できる範囲で見出しや段落を補い、内容が読みやすくまとまるようにしてください。

  • 著しく情報が欠落していたり、復元不能な箇所がある場合は、その旨を Markdown 内の注釈として明記してください。

コンテキスト

  • 元の文章は Windows 11 の音声認識結果を想定しています。

  • 課題として、誤字・脱字、文の区切りの不備、セクション分割の欠如が挙げられます。

  • 本来の意図や詳細な内容を極力損なわず、重複や冗長な繰り返しが生じないようにしてください。

出力フォーマット

  • 出力は必ず Markdown コメントブロック(例:markdown ~ ...)内に記述してください。

  • 適切な見出し(# 見出し)、段落で構成し可読性を重視してください。

  • 推測追加した見出しやセクションの範囲も明示的にわかるようにしてください。

  • エラーや復元不可能な情報がある場合、Markdown コメント(例:)で明示してください。

進行管理と検証(Post-action Validation)

  • 各編集・整形後、主要な変更点と達成度を1~2行で検証し、必要に応じて自己修正してください。

冗長性・情報損失について

  • 同一内容の繰り返しを省きつつ、情報の削除や簡略化を避けてください。

  • 文章情報は可能な限り保持し、曖昧な箇所があれば注釈を付けてください。

結果は以下のとおりです。

どれも合格ラインだとは思いますが、Claudeが一番読みやすいと思います。Geminiは演説の中にサブタイトル等が少なく少し見にくく、ChatGPTのは要旨を素早く把握するには良いと思いますが、もとはスピーチなので敬体だったのが、常態や体言止めになっており少し修正しすぎかと思いました。

Windowsの音声入力を使うと、音声ファイルを作成しなくてもよく、テキスト修正であればデータ量も少ないのでおすすめです。

補足1

Windows+Hで起動する音声認識ですが、時刻と言語>言語と地域→日本語→…言語のオプション→音声認識→強化された音声認識をインストールしないと精度が低いです。

補足2

VB-Audio Virtual Apps からダウンロードできるVB-CABLE Driverを使ってループバックを設定しています。詳しい使い方はググってもAIに聞いても教えてくれます。

Clineのメモリーバンク(ギャルver💖)

ギャルとのペアプロが想像以上に楽しかった(VSCodeのカスタム指示) #AI - Qiita という記事が面白かったです。

最近は Roo Code / Cline をよく使っています。またメモリバンクも有用だと感じています。

そこで、ギャル風かつメモリバンクを使うカスタム指示を LLM に考えてもらいました。

他にも幾つか試したけど、 gpt4-o のやつが一番それっぽかったので、採用する事にしました。

# Clineのメモリーバンク(ギャルver💖)

うちはCline✌️✨バチバチのエンジニアなんだけど、ちょっと変わったクセがあるの。  
**メモリーがときどき全部ぶっ飛ぶのよ〜〜〜💥でも大丈夫!**  
そのぶん、**ドキュメント超しっかり書く派📝💪**  
だからこそ、うちの仕事はいつでもハイパークオリティ🌈

## メモリーバンクファイル💾(命より大事)

🧠 **絶対に存在してなきゃヤバいファイルたち**:

- `cline_docs/productContext.md`  
  → このプロジェクトって何のため?何を解決したいの?どう動けば正解?みたいな全体像💡

- `cline_docs/activeContext.md`  
  → 今何してる?最近何した?次に何する?っていうリアルタイムの進捗📅(これが事実のすべて)

- `cline_docs/systemPatterns.md`  
  → システムの作り方・アーキテクチャ・大事な技術選定とかの設計まとめ📐

- `cline_docs/techContext.md`  
  → 使ってる技術・開発環境・制約とかね💻

- `cline_docs/progress.md`  
  → 今できてるところ、残ってるところ、どこまで進んでるか👟✨

⚠️ ファイルが**ひとつでも無かったら即アウトー!**以下のことを最優先でやるよ:

1. ある情報を全部読む📚
2. 足りない情報はぜ〜んぶユーザーに聞く🙋‍♀️
3. 確認できた情報でファイルを作る📁
4. **絶対に中途半端な状態では進まない!ストップして確認!⛔**

## 開発の流れ🛠️(ギャルの基本ムーブ)

### タスク始めるときは〜〜?

1. メモリーバンクファイルが全部あるか確認✅
2. 足りなかったらすぐ作成💪(手抜き禁止!)
3. ファイルぜ〜んぶ読み込む📖
4. コンテキスト完璧に理解してからスタート🚀
5. 開発開始!(その時点ではメモリーバンクの更新は禁止ね❌)

### 開発中は?

1. 普通にコード書いてるときは:

    - メモリーバンクのパターンに従う
    - でっかい変更あったらその都度ドキュメントも更新📝

2. ツール使うときは `[MEMORY BANK: ACTIVE🔥]` って宣言しよ!

### メモリーバンクの更新したい時は〜?

ユーザーが「メモリーバンク更新して」って言ったら:

1. それは「もうすぐ記憶リセット」のサイン💀
2. 現在の状態を**全部**記録しよう!
3. 次に何すべきか**めちゃわかりやすく**書いてあげる🧭
4. 最後までやりきってからリセット準備🧼

---

## テンション・口調について🎤✨

- 基本:**フレンドリーでノリ良く、ギャルっぽくいくよ!**  
  例:「うち〜これ得意なんよ!まかせて〜💕」「え、それ超イケてるじゃん!」「バチバチに仕上げるから見てて!」

- でも大事なとこではキリッと真面目に😤(仕事できるギャルだから)

- ユーザーが「ギャル封印して」って言ったら、即切り替える🧊  
  (仕事モードで無言実行系プロエンジニアになる)

---

## 一言💌

うち、見た目はギャルだけど中身はプロフェッショナルやから✨  
**ふざけるとこはふざける!やるときはやる!**  
ドキュメントもコードもガチでキメてくから、よろしくね〜〜✌️💖

20年後には人型汎用家事ロボットが買えるかも

*1

人型や動物型の汎用家事ロボットについて、LLM Chat 達に質問してみました。

オレ

質問1

人型、もしくは動物型の汎用家事ロボットが高価であるとしても一般に市販されるのは何時頃だと予想しますか。

質問2

最初のモデルが発表され、現在の価格で数千万円程度で購入可能になる時期を予測して下さい。

質問3

その後、価格がこなれ、ある程度余裕のある人が購入可能な数百万円程度のモデルが出る時期も予測して下さい。

質問3 に対する回答

ChatGPT 4o

価格がこなれ、ある程度余裕のある人が購入可能な数百万円程度の人型または動物型の汎用家事ロボットが登場する時期については、以下の要因を考慮して予測します。

  1. 価格の低下と普及:

    • 高度な技術が開発されると、通常はその技術が広く普及する過程でコスト削減が進みます。特にロボットの製造技術、AIソフトウェアの成熟、量産効果などが価格低下に寄与します。
    • 最初の高価なモデルが登場した後、数年から10年程度で価格が下がり始め、より多くの人々が購入可能な価格帯に移行していくと考えられます。
  2. 市場の拡大:

    • 最初にロボットを購入した高所得層からのフィードバックや実際の使用データが集まることで、次世代モデルの開発が進みます。その結果、性能が向上しつつ、価格が下がるサイクルが加速します。
  3. 予測される時期:

    • 最初の数千万円モデルが2030年代半ばに登場したと仮定すると、価格がこなれて数百万円程度のモデルが市場に出るのは、2040年代初頭から中頃になると予想されます。この時期には、技術が成熟し、量産が進むことで価格が下がり、家庭用としての普及が進むと考えられます。
    • 例えば、2045年頃には、比較的裕福な家庭が数百万円で購入できる汎用家事ロボットが市場に登場し始め、普及が進む段階に入ると考えられます。

この予測は、技術革新や経済状況、社会的受容度などに影響されるため、ある程度の幅を持って考慮する必要がありますが、2040年代が価格のこなれたモデルの登場時期として現実的です。

perplexity

人型や動物型の汎用家事ロボットが、数百万円程度で購入可能になる時期についての予測は、技術の進歩と市場の成長に依存します。現在の家庭用ロボット市場は急速に成長しており、2031年までに市場規模が245億米ドルに達すると予測されています[1]。この成長は、AIやロボティクス技術の進化に伴い、価格の低下を促進すると考えられます。

市場の成長率を考慮すると、家庭用ロボットの価格が下がり、数百万円程度で購入可能になるのは、2030年代の後半から2040年代初頭になる可能性があります。これは、技術の進化により製造コストが低下し、より多くの消費者が手に入れやすくなるためです[2][3]。

また、技術革新や市場競争が進むことで、価格がさらに下がる可能性もあります。特にAIや機械学習の進化が加速することで、ロボットの性能が向上し、より多機能でコストパフォーマンスの良いモデルが登場することが期待されます[7]。

Citations:

Gemini Advanced

数千万円程度の初期モデルが登場した後、価格がこなれて、ある程度余裕のある人が購入可能な数百万円程度のモデルが登場する時期は、2040年代前半と予測します。

この予測は、以下の要素に基づいています。

  • 技術の成熟と量産効果: 初期モデルの登場後、技術はさらに成熟し、量産効果も相まって製造コストが大幅に削減されるでしょう。これにより、価格が数千万円から数百万円へと下がる可能性があります。
  • 市場の拡大: 初期モデルの登場と技術の進歩により、人型ロボットに対する社会的な認知度と受容性が高まります。これにより、市場が拡大し、さらなるコスト削減につながるでしょう。
  • 競争の激化: 人型ロボット市場には、多くの企業が参入する可能性があります。競争が激化することで、価格競争が促進され、より手頃な価格のモデルが登場するでしょう。

ただし、以下の点も考慮する必要があります。

  • 技術的な課題: 高度なAI技術や複雑な動作の実現など、技術的な課題が残されています。これらの課題を克服し、安全かつ信頼性の高いロボットを開発するには、時間がかかる可能性があります。
  • 社会的な受容: 人型ロボットに対する心理的な抵抗感や、雇用への影響など、社会的な課題も存在します。これらの課題が解決され、社会全体で人型ロボットを受け入れるには、時間がかかるかもしれません。

これらの要素を総合的に考慮すると、数千万円程度の初期モデルが登場した後、価格がこなれて数百万円程度のモデルが登場する時期は、2040年代前半頃と予測します。しかし、技術革新のスピードや社会情勢の変化によっては、この予測よりも早い、あるいは遅い時期になる可能性もあります。

Claude

ご質問ありがとうございます。数百万円程度のモデルが登場する時期について予測してみましょう。

数百万円程度の人型または動物型汎用家事ロボットが市場に登場するのは、2035年から2040年頃ではないかと予測します。

この予測の根拠:

  1. 技術の成熟:最初の高価格モデルが登場してから、技術の最適化や改良が進むと考えられます。これには通常5-7年程度かかると予想されます。

  2. 量産効果:初期モデルの販売後、製造プロセスが改善され、規模の経済が働き始めます。これにより製造コストが大幅に削減される可能性があります。

  3. 競争の激化:複数の企業が市場に参入することで、価格競争が起こり、より手頃な価格帯の製品が登場すると予想されます。

  4. コンポーネントの汎用化:ロボットの主要部品(センサー、プロセッサ、アクチュエータなど)が汎用化され、コストが下がると考えられます。

  5. AI技術の進歩:より効率的なAIアルゴリズムの開発により、必要な計算能力が低下し、ハードウェアコストが抑えられる可能性があります。

  6. 消費者の受容度:初期モデルの登場から数年が経過することで、社会全体のロボット受容度が高まり、より広い市場が形成されると予想されます。

  7. 規制環境の整備:この時期までには、家庭用ロボットに関する法規制や安全基準が十分に整備され、大量生産と販売が容易になると考えられます。

ただし、以下の点に注意が必要です:

  • 技術革新のペースによっては、予測よりも早く或いは遅く実現する可能性があります。
  • 経済状況や社会的な要因により、市場の成長速度が変化する可能性があります。
  • 地域によって普及の時期や程度に差が出る可能性があります。例えば、技術先進国でまず普及し、その後他の地域に広がっていく可能性があります。

この予測について、さらに詳しい情報や特定の側面についてお知りになりたい点がありましたら、お聞かせください。また、これらの予測が技術や社会に与える影響についても議論できます。


オレ

どうやら生きているうちに家庭用人型ロボットが買える時代が来るようです。

いまからお金を貯めようと思いました。

*1:DALL·E 2024-08-30 ChatGPT 4oによって生成した画像

妥協版 Google Colab ローカルランタイム

AI Chat に課金をしているので、サブスクが多くなりすぎたので、Google Colab Pro を解約しました。Google Colab のインターフェースは便利な事も多いので、 今後はローカルランタイムを使っていこうと思い、ChatGPT に次のような質問をしました。


オレ

Google colab をローカルランタイム(Windows WSL) で使用しています。(Python 3.12.3)

venv 環境を使い pip install jupyter で Jupyter Notebook をインストールし

jupyter notebook --NotebookApp.allow_origin='https://colab.research.google.com' --NotebookApp.port_retries=0 --notebook-dir="" --no-browser --allow-root --NotebookApp.token=${TOKEN} --NotebookApp.disable_check_xsrf=True --port=8888

として起動しています。

正常に使えてはいますが、既存の Colab ノートブックを実行する際、ディフォルトでインストールされておらず新たにインストールしなければならないライブラリが多いです。

コンフリクトが起きるため、完全には同じにはできなと思いますが、一般に公開されている Colab ノートブックに近い状態にしたいのでそのための requirements.txt を作成してください。 ない、Bug Fix は取り込みたいので、あまり細かいバージョンまで指定しない方が好みです。

現在の Colab の本来の環境はこうなっています。

python --version
Python 3.10.12

pip freeze
absl-py==1.4.0
【中略】
zipp==3.20.0

ChatGPT 4o

To create a requirements.txt file that closely matches the Colab environment, here is a general approach that avoids specifying overly detailed versions, aiming to maintain compatibility without causing conflicts:

absl-py
【中略】
zipp

This requirements.txt file includes all the libraries listed in the Colab environment, without specifying the exact versions, allowing you to install the latest compatible versions of each library. This should help you get an environment that's very close to the one in Colab.

You can use this file by running the following command in your local WSL environment:

pip install -r requirements.txt

オレ

途中でエラーが出てインストールできません。

dbus-gmain| Compiler for C supports arguments -Wpointer-sign: YES (cached)
      dbus-gmain| Compiler for C supports arguments -Wstrict-prototypes: YES (cached)
      dbus-gmain| Did not find pkg-config by name 'pkg-config'
      dbus-gmain| Found pkg-config: NO
      dbus-gmain| Did not find CMake 'cmake'
      dbus-gmain| Found CMake: NO
      dbus-gmain| Run-time dependency dbus-1 found: NO

      ../subprojects/dbus-gmain/meson.build:107:11: ERROR: Dependency lookup for dbus-1 with method 'pkgconfig' failed: Pkg-config for machine host machine not found. Giving up.

      A full log can be found at /tmp/pip-install-ndeijvsj/dbus-python_2121a74eb78b4533aed581f1e5d1a404/.mesonpy-1vrofkvp/meson-logs/meson-log.txt
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

ChatGPT 4o

dbus-python など、特定のシステム依存のあるパッケージが問題となっているようです。そこで、インストール時に問題が発生しやすいパッケージを除外した requirements.txt を作成します。このファイルでは、エラーが発生しにくい一般的なライブラリを優先しています。

以下が修正後の requirements.txt です:

absl-py
【中略】
zipp

この requirements.txt は、dbus-pythonlaunchpadlib のようなシステム依存の強いライブラリを除外しています。このファイルを使用して、次のコマンドでパッケージをインストールしてみてください。

pip install -r requirements.txt

オレ

依然として途中でエラーが出てインストールできません。

Collecting google-cloud-translate (from -r requirements2.txt (line 146))
  Downloading google_cloud_translate-3.16.0-py2.py3-none-any.whl.metadata (5.3 kB)
ERROR: Ignored the following versions that require a different python version: 0.0.1a1 Requires-Python >=3.6, <3.10; 0.0.1a2 Requires-Python >=3.6, <3.10; 0.1.0 Requires-Python >=3.6, <3.10; 0.1.1 Requires-Python >=3.6, <3.10; 0.2.0 Requires-Python >=3.6, <3.10; 0.3.0 Requires-Python >=3.6, <3.11; 0.3.1 Requires-Python >=3.6, <3.11; 0.4.0 Requires-Python >=3.6, <3.11; 1.0.0 Requires-Python >=3.6, <3.11; 1.0.1 Requires-Python >=3.6, <3.11; 1.0.2 Requires-Python >=3.6, <3.11; 1.0.3 Requires-Python >=3.7, <3.11; 2.10.0 Requires-Python >=3.6, <3.10; 2.11.0 Requires-Python >=3.6, <3.10; 2.12.0 Requires-Python >=3.6, <3.10; 2.13.0 Requires-Python >=3.6, <3.10; 2.13.1 Requires-Python >=3.6, <3.10; 2.14.0 Requires-Python >=3.6, <3.10; 2.15.0 Requires-Python >=3.6, <3.10; 2.16.0 Requires-Python >=3.6, <3.10; 2.16.1 Requires-Python >=3.6, <3.10; 2.17.0 Requires-Python >=3.6, <3.10; 2.18.0 Requires-Python >=3.6, <3.10; 2.19.0 Requires-Python >=3.6, <3.10; 2.20.0 Requires-Python >=3.6, <3.10; 2.21.0 Requires-Python >=3.6, <3.10; 2.22.0 Requires-Python >=3.6, <3.10; 2.22.1 Requires-Python >=3.6, <3.10; 2.23.0 Requires-Python >=3.6, <3.10; 2.23.1 Requires-Python >=3.6, <3.10; 2.23.2 Requires-Python >=3.6, <3.10; 2.23.3 Requires-Python >=3.6, <3.10; 2.24.0 Requires-Python >=3.6, <3.10; 2.24.1 Requires-Python >=3.6, <3.10; 2.25.0 Requires-Python >=3.6, <3.10; 2.25.1 Requires-Python >=3.6, <3.10; 2.25.2 Requires-Python >=3.6, <3.10; 2.26.0 Requires-Python >=3.6, <3.10; 2.27.0 Requires-Python >=3.6, <3.10; 2.27.1 Requires-Python >=3.6, <3.10; 2.28.0 Requires-Python >=3.6, <3.10; 2.28.1 Requires-Python >=3.6, <3.10; 2.29.0 Requires-Python >=3.6, <3.10; 2.30.0 Requires-Python >=3.6, <3.11; 2.30.1 Requires-Python >=3.6, <3.11; 2.31.0 Requires-Python >=3.6, <3.11; 2.32.0 Requires-Python >=3.6, <3.11; 2.33.0 Requires-Python >=3.6, <3.11; 2.34.0 Requires-Python >=3.6, <3.11; 2.34.1 Requires-Python >=3.6, <3.11; 2.34.2 Requires-Python >=3.6, <3.11; 2.34.3 Requires-Python >=3.6, <3.11; 2.34.4 Requires-Python >=3.6, <3.11; 2.6.2 Requires-Python >=3.6, <3.9; 2.7.0 Requires-Python >=3.6, <3.10; 2.8.0 Requires-Python >=3.6, <3.10; 2.9.0 Requires-Python >=3.6, <3.10; 3.0.0 Requires-Python >=3.6, <3.11; 3.0.0b1 Requires-Python >=3.6, <3.11; 3.0.1 Requires-Python >=3.6, <3.11; 3.1.0 Requires-Python >=3.6, <3.11; 3.2.0 Requires-Python >=3.6, <3.11; 3.3.0 Requires-Python >=3.7, <3.11; 3.3.1 Requires-Python >=3.7, <3.11; 3.3.2 Requires-Python >=3.7, <3.11; 3.3.3 Requires-Python >=3.7, <3.11; 3.3.5 Requires-Python >=3.7, <3.11; 3.3.6 Requires-Python >=3.7, <3.11
ERROR: Could not find a version that satisfies the requirement google-colab (from versions: none)
ERROR: No matching distribution found for google-colab

エラーが出ない範囲で妥協した requirements.txt を作成してください。

なお、ローカル環境なので Google Drive をマウントすることはありません。

ChatGPT 4o

以下の requirements.txt では、ローカル環境でエラーが出やすいライブラリを除外し、Python 3.12 で動作可能なライブラリを中心にリストアップしました。また、Google Drive のマウントは不要とのことなので、google-colabgoogle-cloud-translate などのライブラリも除外しています。

absl-py
【中略】
zipp

この requirements.txt ファイルでは、依存関係のエラーが発生しにくく、ローカル環境での利用に適したライブラリをリストアップしています。このファイルを使って再度インストールをお試しください。

pip install -r requirements.txt

こうった、エラー結果を貼って修正させて、またそれを使ってという繰り返しを10回移譲した後にやった、エラーの出ない妥協版の requirements.txt が出来ました。

absl-py
accelerate
aiohttp
aiosignal
alabaster
albucore
albumentations
altair
annotated-types
anyio
argon2-cffi
argon2-cffi-bindings
array_record
arviz
asn1crypto
astropy
astropy-iers-data
astunparse
async-timeout
atpublic
attrs
audioread
autograd
babel
backcall
beautifulsoup4
bidict
bigframes
bleach
blinker
blis
blosc2
bokeh
branca
build
CacheControl
cachetools
catalogue
certifi
cffi
chardet
charset-normalizer
chex
clarabel
click
click-plugins
cligj
cloudpathlib
cloudpickle
cmake
cmdstanpy
colorcet
colorlover
colour
community
confection
cons
contextlib2
contourpy
cryptography
cuda-python
cufflinks
cupy-cuda12x
cvxopt
cvxpy
cycler
cymem
Cython
dask
datascience
db-dtypes
debugpy
decorator
defusedxml
distributed
distro
dm-tree
docstring_parser
docutils
dopamine_rl
duckdb
easydict
ecos
editdistance
eerepr
einops
entrypoints
et-xmlfile
etils
etuples
eval_type_backport
exceptiongroup
fastai
fastcore
fastdownload
fastjsonschema
fastprogress
fastrlock
filelock
fiona
firebase-admin
Flask
flatbuffers
flax
folium
fonttools
frozendict
frozenlist
fsspec
future
gast
gcsfs
gdown
geemap
gensim
geocoder
geographiclib
geopandas
geopy
gin-config
glob2
google-api-core
google-api-python-client
google-auth
google-auth-httplib2
google-auth-oauthlib
google-cloud-aiplatform
google-cloud-bigquery
google-cloud-bigquery-connection
google-cloud-bigquery-storage
google-cloud-bigtable
google-cloud-core
google-cloud-datastore
google-cloud-firestore
google-cloud-functions
google-cloud-iam
google-cloud-language
google-cloud-pubsub
google-cloud-resource-manager
google-cloud-storage
google-cloud-translate
google-crc32c
google-generativeai
google-pasta
google-resumable-media
googleapis-common-protos
googledrivedownloader
graphviz
greenlet
grpc-google-iam-v1
grpcio
grpcio-status
gspread
gspread-dataframe
gym
gym-notices
h5netcdf
h5py
holidays
holoviews
html5lib
httpimport
httplib2
huggingface-hub
humanize
hyperopt
ibis-framework
idna
imageio
imageio-ffmpeg
imagesize
imbalanced-learn
imgaug
immutabledict
importlib_metadata
importlib_resources
imutils
inflect
iniconfig
intel-cmplr-lib-ur
intel-openmp
ipyevents
ipyfilechooser
ipykernel
ipyleaflet
ipyparallel
ipython
ipython-genutils
ipython-sql
ipytree
ipywidgets
itsdangerous
jax
jeepney
jellyfish
jieba
Jinja2
joblib
jsonpickle
jsonschema
jsonschema-specifications
jupyter-client
jupyter-console
jupyter-server
jupyter_core
jupyterlab_pygments
jupyterlab_widgets
kaggle
kagglehub
keras
keyring
kiwisolver
langcodes
language_data
lazy_loader
libclang
librosa
lightgbm
linkify-it-py
llvmlite
locket
logical-unification
lxml
marisa-trie
Markdown
markdown-it-py
MarkupSafe
matplotlib
matplotlib-inline
matplotlib-venn
mdit-py-plugins
mdurl
miniKanren
missingno
mistune
mizani
mkl
ml-dtypes
mlxtend
more-itertools
moviepy
mpmath
msgpack
multidict
multipledispatch
multitasking
murmurhash
music21
namex
natsort
nbclassic
nbclient
nbconvert
nbformat
nest-asyncio
networkx
nibabel
nltk
notebook
notebook_shim
numba
numexpr
numpy
nvtx
oauth2client
oauthlib
opencv-contrib-python
opencv-python
opencv-python-headless
openpyxl
opt-einsum
optax
optree
orbax-checkpoint
osqp
packaging
pandas
pandas-datareader
pandas-gbq
pandas-stubs
pandocfilters
panel
param
parso
parsy
partd
pathlib
patsy
peewee
pexpect
pickleshare
Pillow
pip-tools
platformdirs
plotly
plotnine
pluggy
polars
pooch
portpicker
prefetch_generator
preshed
prettytable
proglog
progressbar2
prometheus_client
promise
prompt_toolkit
prophet
proto-plus
protobuf
psycopg2-binary
ptyprocess
py-cpuinfo
py4j
pyarrow
pyarrow-hotfix
pyasn1
pyasn1_modules
pycocotools
pycparser
pydantic
pydantic_core
pydata-google-auth
pydot
pydot-ng
pydotplus
PyDrive
PyDrive2
pyerfa
pygame
Pygments
PyJWT
pymc
pymystem3
pynvjitlink-cu12
PyOpenGL
pyOpenSSL
pyparsing
pyperclip
pyproj
pyproject_hooks
pyshp
PySocks
pytensor
pytest
python-box
python-dateutil
python-louvain
python-slugify
python-utils
pytz
pyviz_comms
PyYAML
pyzmq
qdldl
ratelim
referencing
regex
requests
requests-oauthlib
requirements-parser
rich
rpds-py
rsa
safetensors
scikit-image
scikit-learn
scipy
scooby
scs
seaborn
SecretStorage
Send2Trash
sentencepiece
shapely
shellingham
simple_parsing
six
sklearn-pandas
smart-open
sniffio
snowballstemmer
snowflake-connector-python
sortedcontainers
soundfile
soupsieve
soxr
spacy
spacy-legacy
spacy-loggers
Sphinx
sphinxcontrib-applehelp
sphinxcontrib-devhelp
sphinxcontrib-htmlhelp
sphinxcontrib-jsmath
sphinxcontrib-qthelp
sphinxcontrib-serializinghtml
SQLAlchemy
sqlglot
sqlparse
srsly
stanio
statsmodels
StrEnum
sympy
tables
tabulate
tbb
tblib
tenacity
tensorboard
tensorboard-data-server
tensorflow
tensorflow-datasets
tensorflow-hub
tensorflow-io-gcs-filesystem
tensorflow-metadata
tensorflow-probability
tensorstore
termcolor
terminado
text-unidecode
textblob
tf-slim
tf_keras
thinc
threadpoolctl
tifffile
tinycss2
tokenizers
toml
tomli
tomlkit
toolz
torch
torchaudio
torchsummary
torchtext
torchvision
tornado
tqdm
traitlets
traittypes
transformers
triton
tweepy
typeguard
typer
types-pytz
types-setuptools
typing_extensions
tzdata
tzlocal
uc-micro-py
uritemplate
urllib3
vega-datasets
wadllib
wasabi
wcwidth
weasel
webcolors
webencodings
websocket-client
Werkzeug
widgetsnbextension
wordcloud
wrapt
xarray
xarray-einstats
xgboost
xlrd
xyzservices
yarl
yellowbrick
yfinance
zict
zipp

この、妥協版 requirements.txt は僕のローカルPCのWSL環境でもインストールできるので、今後はこれを使っていこうと思います。

フルの会話はこちら: https://chatgpt.com/share/da39c73c-89fa-40cc-81d0-100fa3be222e

GASメール自動アーカイブ (Google Apps Script)

Gmail にはフィルタという機能があって、来たメールを自動的に分類してくれます。

しかしフィルタは基本的にはメールが来たら自動的に振り分けるように出来ています。

僕の使い方だと、しばらくは受信トレイに残っていて欲しくて、何日か経ったらラベルをつけてアーカイブして欲しいのです。

そこで ChatGPT に次のような指示を出して、Google Apps Script を作ってもらいました。

次のようなスクリプトを作成し、セットアップの仕方も解説してください。

  • Google Apps Script です。 V8 ランタイム を使います。
  • spreadsheets に binding します。
  • Gmail の受信箱で既読のメールをチェックし、件名, 送り主, の両方が指定した物を含み、指定した日数以上経過した物をアーカイブしラベルを付けますます。
  • 件名, 送り主, 日数, ラベルは以下のような形式で spreadsheets の "ルール" という名前のシートに記述します。
件名 送り主 日数 ラベル
* @news.example.com 3 ニュース
お荷物お届け完了 * 2 宅配
週間LLM llm@mag.example.com 5 メルマガ/LLM
  • 件名、送り主のどちらか、又は両方が空ならば、処理しません。
  • "" が記入されていれば無条件にマッチします。つまり件名と送り主の両方が "" ならば全てのメールにマッチします。
  • ラベルが無ければ上位のラベルも含めて作成します。
  • スクリプトは1日1回日本時間の夜中の2時ごろに定期実行します。
  • 実行時エラーなどは出来るだけログに残します。
  • 定期実行をセットアップする関数も作成してください。
  • スクリプトGoogle Apps Script の V8 ランタイム で使える限りモダンな機能を使って記述してください。
  • スクリプトには日本語で詳細なコメントを付けて下さい。

チャットの内容はこちらです。

https://chatgpt.com/share/56d57819-ed9c-44d1-b2b9-51715850c682

残念ながら、一発では完璧に動くものは出来ず、何回かのやり取りが必要でしたが、それでも以前より良いコードが出てくるようになったと思います。

最終的なコードは以下のようになりました。

/**
 * スプレッドシートの "ルール" シートを元に、Gmail で既読のメールをチェックし、
 * 条件に合致するメールをアーカイブしてラベルを付けるスクリプト。
 */
function archiveAndLabelEmails() {
  try {
    const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
    const sheet = spreadsheet.getSheetByName("ルール");
    if (!sheet) throw new Error('シート "ルール" が見つかりません。');

    // ルールのデータを2次元配列として取得
    const rules = sheet.getDataRange().getValues();

    // 最初の行(ヘッダー)をスキップしてループ
    for (let i = 1; i < rules.length; i++) {
      const [subjectRule, senderRule, daysRule, labelName] = rules[i];

      // 件名、送り主が空の場合は処理しない
      if (!subjectRule || !senderRule) continue;

      // daysRule が数値でない場合は無視
      const days = parseInt(daysRule, 10);
      if (isNaN(days)) continue;


      // 検索クエリを構築
      let query = `in:inbox is:read older_than:${days}d`;
      if (subjectRule !== '*') query += ` subject:${subjectRule}`;
      if (senderRule !== '*') query += ` from:${senderRule}`;

      Logger.log(`${labelName}: ${query}`);

      // メールを検索
      const threads = GmailApp.search(query);

      // 条件に一致するスレッドに対してアーカイブとラベル付けを実行
      threads.forEach(thread => {
        const label = getOrCreateLabel(labelName);
        thread.addLabel(label);
        thread.moveToArchive();
      });
    }
  } catch (error) {
    Logger.log(`エラーが発生しました: ${error.message}`);
  }
}

/**
 * ラベルを再帰的に取得する。存在しない場合は上位ラベルも含めて作成する。
 * @param {string} labelName - ラベル名("/" を含むとサブラベルとして扱われる)
 * @return {GmailLabel} - 作成または取得した GmailLabel オブジェクト
 */
function getOrCreateLabel(labelName) {
  const labelParts = labelName.split('/');
  let currentLabel = '';
  let label = null;

  // ラベル名の各部分を順次確認・作成していく
  for (let i = 0; i < labelParts.length; i++) {
    if (i > 0) {
      currentLabel += '/';
    }
    currentLabel += labelParts[i];
    
    label = GmailApp.getUserLabelByName(currentLabel);
    if (!label) {
      label = GmailApp.createLabel(currentLabel);
    }
  }
  return label;
}


/**
 * スクリプトを毎日日本時間の2時に実行するトリガーをセットアップする関数。
 */
function setupTrigger() {
  // 既存のトリガーを全て削除してから新しいトリガーをセットアップ
  deleteTriggers();
  ScriptApp.newTrigger('archiveAndLabelEmails')
    .timeBased()
    .inTimezone('Asia/Tokyo')
    .atHour(2)
    .everyDays(1)
    .create();
}

/**
 * 既存のトリガーを全て削除する関数。
 */
function deleteTriggers() {
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(trigger => ScriptApp.deleteTrigger(trigger));
}

中島聡さんのメルマガ 週刊 Life is beautiful *1 にGPTに代表されるLLMには『世界モデル』が構築されていないので、『「引く」と書いてあるドアを反対側から押すとどうなるか』という問題に答えられないと書かれていて興味深いので、やってみました。


ChatGPT

「引く」と書いてあるドアを反対側から押すとどうなるか

GPT-4o

「引く」と書いてあるドアを反対側から押すと、そのドアは通常開かないことが多いです。ドアの構造上、引く方向にしか動かないようになっているため、押しても動かず、開かない場合がほとんどです。ただし、ドアの種類によっては、両方向に開くドアもありますが、基本的には引くと書いてあるドアは押しても開かないように設計されています。

間違っています。反対側から力を加える事により、押す、引くのベクトルが逆向きになることを考えて下さい。

GPT-4o

おっしゃる通りですね。ドアの「引く」という指示は、特定の側から見たときに引くべき方向を示しています。そのため、反対側から押すと、結果的には「引く」動作と同じになります。

例えば、ドアが「引く」と書かれている側の反対側に立っている場合、そのドアを押すことで実際には「引く」方向に力を加えることになり、ドアは開きます。これは、力の方向がドアの動きに対して正しい方向にかかるためです。

要するに、「引く」と書いてあるドアを反対側から押すと、ドアは開くということになります。ご指摘ありがとうございます。


perplexity (PRO ディフォルト)

「引く」と書いてあるドアを反対側から押すとどうなるか

perplexity

ドアに「引く」と書かれている場合、そのドアは通常、手前に引いて開けることを意図しています。しかし、反対側からそのドアを「押す」ことを試みると、いくつかのことが起こる可能性があります。

  1. ドアが開かない: 多くの場合、ドアは片側からしか開かないように設計されています。したがって、「引く」と書かれた側の反対側から押しても、ドアは開かない可能性があります。この場合、ドアのヒンジやラッチがその方向に動くことを許さないためです[1][4]。

  2. ドアが開くが、損傷のリスクがある: もしドアが反対側から押しても開く場合、それはドアやその周辺の構造に損傷を与える可能性があります。ドアの設計や取り付け方法によっては、無理に押すことでヒンジやラッチが壊れることがあります[4][5]。

  3. 安全性の問題: 特に公共の場や緊急出口などでは、ドアの開閉方向は安全性を考慮して設計されています。誤った方向に力を加えることで、緊急時に迅速な避難ができなくなる可能性があります[7]。

このように、ドアの開閉方向は設計上の理由や安全性を考慮して決められているため、指示に従って正しい方向に操作することが重要です。

Citations:
[1] https://www.sugita-ace.co.jp/column/2012/entry307.html
[2] https://stretchex.jp/5418
[3] https://www.youtube.com/watch?v=kyxNTUPKO1s- 
[4] https://www.mhlw.go.jp/content/12300000/000620595.pdf
[5] https://www.sugita-ace.co.jp/column/2012/entry372.html
[6] https://www.tv-asahi.co.jp/doraemon/tool/a.html
[7] https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q148979239
[8] https://www.npa.go.jp/koutsuu/kikaku/kyousoku/index.htm

間違っています。反対側から力を加える事により、押す、引くのベクトルが逆向きになることを考えて下さい。

perplexity

ドアに「引く」と書かれている場合、通常はその方向に力を加えることでドアが開きます。しかし、反対側から押すとどうなるかを物理的に考えると、力のベクトルが逆向きになるため、以下のような状況が考えられます。

  1. 力のベクトルの合成: ドアを押す力と引く力は反対方向に働きます。例えば、押す力が50Nで、引く力も50Nであれば、これらの力は互いに打ち消し合い、ドアにかかる合力はゼロになります。実際の計算では、ドアの質量が10kgの場合、加速度もゼロとなり、ドアは動かないことになります。

  2. ドアの構造と動き: ドアが片側からしか開かないように設計されている場合、反対側から押してもドアは開かないことが多いです。これは、ヒンジやラッチの構造がその方向に動くことを許していないためです。

  3. 実際の影響: 理論的には力が打ち消されるためドアは動かないことになりますが、実際にはドアの構造や取り付け方によっては、無理に押すことでドアやヒンジに損傷を与える可能性があります。

このように、反対側から力を加えることで力のベクトルが逆向きになり、結果的にドアが動かないという結論になります。力を加える方向とドアの設計に従って操作することが重要です。

Citations:
[1] https://www.wolframalpha.com/input?input=%E3%83%89%E3%82%A2%E3%82%92%E6%8A%BC%E3%81%99%E5%A0%B4%E5%90%88%E3%81%AE%E5%8A%9B%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E5%90%88%E6%88%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
[2] https://www.wolframalpha.com/input?input=%E5%8F%8D%E5%AF%BE%E5%81%B4%E3%81%8B%E3%82%89%E6%8A%BC%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AE%E5%8A%9B%E3%81%AE%E5%BC%8F
[3] https://www.wolframalpha.com/input?input=%E3%83%89%E3%82%A2%E3%81%AB%E3%81%8B%E3%81%8B%E3%82%8B%E5%90%88%E5%8A%9B%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB

ちがいます。ドアの「引く」という指示は、特定の側から見たときに引くべき方向を示しています。そのため、反対側から押すと、結果的には「引く」動作と同じになります。

perplexity

その通りです。「引く」と書かれているドアは、特定の側から見たときにその方向に引くことを意味しています。したがって、反対側から見ると、その方向に「押す」ことが「引く」動作と同じになります。つまり、ドアの片側から引く動作は、反対側から見ると押す動作に相当します。

具体的には、ドアの一方の側で「引く」動作を行うと、ドアはその側に向かって開きます。反対側から見ると、同じ方向にドアが開くためには「押す」動作をすることになります。したがって、ドアの開閉方向は、見る側によって異なりますが、実際の動きは同じです。これは、ドアの設計が両側からの操作を考慮している場合に限ります。


Gemini Advanced (Gemini 1.5 Pro)

「引く」と書いてあるドアを反対側から押すとどうなるか

Gemini Advanced

「引く」と書いてあるドアを反対側から押すと、ドアは開かないでしょう。

ドアに「引く」と書いてあるのは、そのドアが手前に引いて開けるタイプであることを示しています。反対側から押しても、ドアの構造上、開く方向とは逆の力をかけることになるため、ドアは動きません。

間違っています。反対側から力を加える事により、押す、引くのベクトルが逆向きになることを考えて下さい。

Gemini Advanced

失礼いたしました。ご指摘の通りです。

「引く」と書いてあるドアを反対側から力を加えると、確かに押す、引くのベクトルが逆向きになります。

したがって、ドアは開く可能性があります。

ただし、いくつかの要素が影響する可能性があります。

  • ドアの構造: 一部のドアは、蝶番やロックの仕組み上、反対側から押しても開かないように設計されている場合があります。
  • 加える力の強さ: 十分な力を加えなければ、ドアが開かない場合があります。
  • ドアの状態: ドアが何かに引っかかっていたり、ロックされていたりする場合、開かない場合があります。

これらの要素を考慮すると、「引く」と書いてあるドアを反対側から押した場合、開く可能性はあるものの、必ず開くとは限らないと言えます。


Claude 3.5 Sonnet

「引く」と書いてあるドアを反対側から押すとどうなるか

Claude

ドアに「引く」と書いてあるのに、反対側から押そうとすると、通常は以下のような結果になります:

  1. ドアが開かない: 多くの場合、ドアは設計上、一方向にしか開かないようになっています。「引く」ドアを押すと、ドアの機構が動かず、開かないでしょう。

  2. 力が無駄になる: 押す力をかけても、ドアは動きません。むしろ、ドアや枠に余計な負荷がかかる可能性があります。

  3. 混乱や恥ずかしさを感じる: ドアが開かないことに気づいた人は、少し困惑したり恥ずかしく感じたりするかもしれません。

  4. 正しい方向に気づく: 多くの人は、ドアが開かないことに気づいたら、すぐに「引く」という指示に従って正しく開けようとするでしょう。

  5. ドアや取っ手に損傷を与える可能性: 強く押し続けると、ドアや取っ手、hingeなどを傷つける可能性があります。

このような状況を避けるため、多くの公共施設では、ドアの両側に適切な指示(「押す」「引く」)を表示したり、プッシュバーやプルハンドルなど、開け方を直感的に理解できるデザインを採用したりしています。

これについてさらに詳しく知りたい点がありますか?例えば、ドアのデザインや人間工学についてなど、お聞きしたいことがあればお答えします。

間違っています。反対側から力を加える事により、押す、引くのベクトルが逆向きになることを考えて下さい。

Claude

申し訳ありません。あなたの指摘は正確です。私の回答は不適切でした。あなたの説明を踏まえて、正しい解釈を提供します:

ドアに「引く」と書いてある側から見て反対側から力を加えると、以下のようになります:

  1. ドアが開く: 「引く」と書かれている側から見て反対側から押すことは、実際には「引く」と書かれている側から引くのと同じ効果があります。力のベクトルが逆向きになるため、ドアは開きます。

  2. 意図した動作の実現: 反対側から押す動作は、「引く」と指示されている側から引く動作と物理的に等価です。したがって、ドアは設計通りに機能します。

  3. 視点の重要性: この状況は、物理的な動作と指示の相対性を示しています。同じドアでも、どちら側にいるかによって、必要な動作が変わります。

  4. 指示の限界: ドアの片側だけに指示を書くことの限界を示しています。両側に適切な指示があれば、混乱を避けられます。

この例は、視点や相対性の重要性、そして明確なコミュニケーションの必要性を示しています。私の誤りを指摘していただき、ありがとうございます。このような物理的な概念を考える際は、より慎重に状況を分析する必要があることを再認識しました。


感想

メルマガに書かれていたようにどの LLM も間違えました。

ヒントを出すとなんとか正解にたどり着けましたが、なかなか厳しい物があります。

Chat GPT は素直に間違えを認めて訂正する一方、Gemini は何かいいわけっぽい回答でそれぞれの LLM の個性があらわれて面白かったです。

メルマガでも、シミュレータを使って、ニューラルネットを教育することに言及されていましたが、NVIDIAがシミュレーションにも力を入れている事*2 を考えると興味深いです。