Embeddingに変換する
これも
Embeddingしベクトルに変換する
Embeddingに変換する
これも
Embeddingしベクトルに変換する
バッチ処理でEmbeddingに変換する
バッチ処理でEmbeddingし、ベクトルに変換する
体系的に整理しました
列挙はされているけど、体系的とは思わなかったです。
。
これをやるためには、あらかじめ正解データを要する必要があるってことですよね?
あとは性能指標をはかるコード例へのリンクとかあるとうれしいかなと思いました。
Recall@k
等幅フォントなのが気になった。説明資料へのリンクがあるとよさそう
メタデータフィルタリングとの組み合わせ
これは話として唐突だなと思いました。そもそもメタデータがなに、という話がされていない
まずは
まずは、が連続している。なくてもよさそう
近似最近傍探索(ANN)の仕組みとベクトルの軽量化
ここで語りたいことを最初に説明してほしい。
このままでもいろいろできるけど大量データを処理するには大変。ANNを使って検索を効率化するのと、◯◯のためにベクトルを軽量化するっていう考え方があるよ。
みたいなこと?
2つの話がどう関連するのかが明確に語られていないと思うので、どう四dならいいかがわかりにくい
先月号
リンク先はgihyo.jpのURLとなるはず
図3のように
図を見たけどあんまりイメージがわかないです。他の人はイメージわくかな?
t
不要なスペース
def encode_query_image(image_path: Path) -> np.ndarray:
ここの処理は全画像を処理するときとほぼ同じなので、関数化して共通化できるといいなーと思いました。
"鳥", "講演", "夜景"]
queryとして単語だけじゃなくて文章になっているものも試してほしいかな
処理済み: 8/12 枚
ここは処理中表示だから不要そう
④ インデックスの構築
関数化して main() から呼んで欲しい派
4と2を分ける理由があまりわからない。 1画像分の処理をする関数があるならわかるけど、全部の画像をまとめて処理しているので2つの処理に分けている理由があまりないと思う
device = (
これ読みにくいから、関数にして普通のif文にしてほしいなー
def get_hoge_device() -> str:
もしくは device = "cuda" if torch.cuda.is_available(): device = "mps" elif torch.backends.mps.is_available()" device = "cpu"
⑥ 検索の実行
ここは main() を作ってその中にいれてほしい派
。
同じ実験ができるように、この画像群を共有してほしい。zipにしててダウンロード可能にするとか
Embeddingを生成して
これもEmbeddingを生成する、であってますか?生成されるものがEmbedding?
します。
として◯◯のプログラムを作成します。
自然です
一般的です
かなぁ
Top-k 結果"
新しい用語が出てきた。これはなにか説明してほしい
画像Embedding
作り直されるものは「画像Embedding」であってますか? 私的には、画像Embeddingは「画像をEmbedding処理する」という「動詞」のイメージで、作り直されるのは「画像ベクトル群」なのかなと思っています
下のフローチャートにも「画像Embedding」という用語がない
flowchart LR text["テキスト<br/>「赤いスポーツカー」"] --> text_enc["テキストエンコーダ"] image["画像"] --> image_enc["画像エンコーダ"] text_enc --> space["同一ベクトル空間<br/>(近いものを類似と判定)"] image_enc --> space
下の画像の画素が荒い。たとえば以下でレンダリングしてpngやsvgでダウンロードすればもうちょいきれいな画像になる(左下からダウンロードできる
https://mermaid.live/edit#pako:eNp1UctKw0AU_ZVy121tHqYmiBt1pxvdaUTGZPqAJinTCT5KoU1EKlR8IigoCC4qoi5E8BHwY8bSduUvOJkaQcFZnXvuPefcy9TB8mwMBhQq3rpVQoSm5hZMN8UfxRt02QQW7rDgjgUvLGxPrpGxKdbsDJ6uWWtbcBcsjFjI8W0MmnsmrKQymSmhXsWu9ceBBV0WPrLgUciafHoUVnZQEfPZ_slbL9xPTAT77TLq_KdP4oSsVkVWbNY76Hw8N1l4xoKHODu87d-8Dk-PxRmfUXvwfijOCFjrngVHw6vLjyhirW6vfd27P_-Mdn-v99vfdCENRVK2waDEx2lwMHFQXEI9FplAS9jBJhgc2riA_Ao1wXQbXFZF7pLnOYmSeH6xBEYBVWq88qs2onimjIoE_Ywgn3qLm66V1NguU4_Mj_5OfGEinBWdH2vs2phMe75LwZDHJZENRh02wJDyelbXZTWfVyWNAzkNm5zVclldyasTKqdlKaerjTRsiW1zWU1XlAlFz0mqIimaJje-AN-d7Qg
持たないため、
持ちません。そのため、
のように文が長いので区切ってほしい
構成です。
システム構成?ライブラリ構成?
。
これ、従来の手法だと画像を説明するテキストを生成して、そのテキストをエンコーディングしていたけど、そうじゃなくて画像そのものを処理するっていうのがポイントなんですよね、多分?
横断的
なにを横断している?
複数のデータ形式を横断的に、とか
同一空間に
◯◯が同一空間に
マルチモーダル
こういうものをなんで「マルチモーダル」と言うのか説明してくれるとうれしい
モーダルってのはmodality(様式)のことを言うらしい? https://www.aist.go.jp/aist_j/magazine/20231129.html
これまでのEmbeddingは
これまで、がどこを指しているか不明確。(一瞬歴史的な話かな?と思った
「先月の記事では」とか具体で示してほしい
画像とテキストを統合するマルチモーダル検索の構成
見出しがあったらその下には「ここでは~~について説明します」みたいな文章があるといいと思う派
概念的に仕組みを整理します。
ちょっとこの文章の意図が読み取れないです。
概念的に、なにの仕組みを、どのように整理するのか。なんのために?
るのが
いること
DuckDBを使ったベクトル保存・検索 (duckdb_vss_search.py)
やっていることは最初の方と同じなので、差分があるコードだけをここでは示すでもいいかなと思いました。(記事も全体的に長いし)
そのまま実行できるコードはここだよ、としてここでは新しい要素だけのコードがほしい
モデルカードで
モデルカードってなんですか?
実用情報を一覧できます。
Web画面のスクショがほしい
hunk_size=120, overlap=30)
デフォルト値指定しているけどあえて変更している。 このサンプルコード的には意味がないのでどちらかに統一で良いのでは
FastEmbed も
なんでここ太字なんだろ
プリフィックス
プレフィックスとプリフィックスの表記揺れ
されます
される
文体の統一
クエリ(単語でも可)
「文」でもよいかなと思った
応した
対応したEmbeddingモデル
と言いたい
別サーバー前提
サーバーの起動は1つ前に書いてあるし、あえて書かなくてもいいかも?
クラウドへ
クラウドに送信される
とか
別サーバー前提
サーバーを別で用意するの?と思われそうなので、下の表とあわせて
Ollamaサーバーの起動が必要
の方がわかりやすいかなと
TODO: ここにE
ここのTODOは対応する?
ベクトル永続化
Googleで検索してもあまりひっかからないけど一般的な用語ですか
"ベクトル永続化"
バッチ処理されるため、forループで1件ずつ処理するより大幅に高速です
バッチ処理だからforより高速、というのがよくわからないです。
テキスト用Embeddingモデルは大きくBERTベースとLLMベースに分かれます。筆者の視点で代表的なモデルIDを以下にまとめます。
この表ありがたいけど、その元となる情報がどこにあるのか、参考情報とかのリンクがほしい
multilingual-e5-large
このあたりの選択肢はどこで調べたらいいの?を書いて欲しい
と思ったら次のセクションに書いていた。 ここにはどのモデルを使うかの話は書かなくていいのでは。
外部APIの活用例
ここの手前で見出しを分けて「エンベディングの3つの方法の比較」みたいな話でまとめてほしい。
ローカル、外部API、Ollamaの3種類あるよ。それぞれ使いたい場合はこんな感じの書き方、比較するとこうだよ(比較が先でもいいかも)
OPENAI_API_KEY環境変数が必要
キーが必要なのとお金がかかることは説明した方がよいかと
ベクトルの「近さ」を測る指標
次のコードの都合でこの説明になっているけど、自分だったら以下の順番で説明して欲しい。
類似度 0.XXXX: 「Electric vehicles are an environmentally friendly way to travel」 類似度 0.XXXX: 「The weather is sunny today」 類似度 0.XXXX:
値が全部0.XXXなのでどれが近いかわからない。値を入れて欲しい
マルチモーダル検索(SigLIP 2)のセクションでは
これもマルチモーダルになってから説明すればいいかなと
Pillow 11.x 画像処理
このあたりは後半で必要になったときにまた紹介すればいいかなと思う。 まずは、テキストのベクトル検索だけに焦点を絞って説明した方がわかりやすいと思う
sentence-transformers
ライブラリはそれぞれリンクがほしい
本記事では以下の技術スタックを順番に扱います。
このスタックがさっきの4つのステップとどう関連しているのかを説明してほしい。用語が多くて理解が難しいです
大きく分けて以下の4つのステップが必要です。
このステップを表した図が欲しい
データベース
これも永続化では「データベース」とは書いていないので、どのデータベース?となる
同じモデル
この前に「モデル」が出てこないので、なにと同じモデルかが不明。ベクトル化のところに説明が必要
さらにテキストと画像を横断するマルチモーダル検索の実装まで、段階的に紹介していきます。
長くなる場合はマルチモーダルは次回に回すのもありかなと
oncurrent.interpreters
ここは、このセクションの内容とは直接関係なさそう。まとめとかに入れた方がいいのでは
では
メソッドでは
注釈
(´・∀・`)へぇ〜
計算を軽くしてタスク数を増やし、転送コストが目立つケースを見てみましょう。
これって一つ前の起動コストが時間には含まれていないんですか?
起動コストは4ワーカーのみだから一つ前とおなじくらいってことなのかな?ちょっとぱっと見どこをどう計測しているんだろう?って思った
ほぼ
起動コストはほぼ
では
ではプロセス生成がない分
とか書いてもいいかも
Mac
MacBook Air
でもいいかなと
C拡張のグローバル状態の問題を避けたい場合や、メモリ空間を完全に分離したい場合
これが具体的にどういうパターンなのかを教えてくれるとうれしい。
私の理解は基本はThread→CPUバウンドならInterpreterでいいかなーと思っているので
7
なんでここ7なんだろう。とくに意味のある数値ではないと思うけど
使ってみる
使用する
とかでよいのでは
独立したGIL
独自のGIL、と、独立したGILという似ているけど異なる表現であることに意味はあるのか。同じものなら表現を合わせたい
独自のGIL
独自のGILとGIL Bという表現の違いはあとでわかる?
意味的にはどちらも独自のGILと言えるかなとおもったので
プロセスより軽量
表現を合わせて「起動コスト小」とかの方がわかりやすいかなーと
てい
トル
Python 3.14で追加された
最初の段階で「◯◯をするための機能」みたいな簡単な説明があった方が読みやすいかなと思いました
title='Pythonで始める
見にくいので改行を入れてほしい派
(みやすくするために改行を入れてます、的な
記事情報のリストを
ここにもArticleInfo ArticleListを書いておくと、ほしいデータとコード上のPydanticモデルの関連が把握しやすくなるかなと
安全
ここの「安全」も気になる
Pythonを安全
Pythonを安全に活用しているわけではないのでは
Pythonを拡張して型安全なLLMアプリを作成する
みたいなイメージ?
python example_5.py
横スクロールしないと一番みたい結果がみれないので、改行して表示して欲しい
いうの
という機能
とか?「というのが」は口語的なので
itleやauthorは
コードでの出現順にあわせて、この項目が最初に来て欲しい
alidate_url_format(
docstringを書いて欲しい
example_4.py
他に併せるなら、このコードは article_common_strict.py みたいなファイルにした方がよいのでは。
で、example_4.pyではそれをimportして使用する
安全
これも安全という表現が適切か気になる。
LLMからのデータをバリデーションして、ルールに則ったデータのみを取得できます。
とか
モデル
Pydanticモデルの
スキーマを直接指定
スキーマとしてPydanticのモデルを
とか
example_2.p
article_common?
での実装
で◯◯を実装する
みたいに言いたい
安全
安全っていうとどちらかというと、情報が漏れるとかそういう話を想像する。
ここで言いたいことは指定した構造のとおりのデータを受け取れるということを言いたいんだと思います。
LLMから適切に構造活かしたデータを受け取る?とか??
text={ "format": { "type": "json_schema", "name": "ArticleList", "schema": schema, } },
ここでOpenAIのAPIに対して「このスキーマに従って構造化したデータを返してね」としているので、その説明がコメントでほしい
schema = make_strict_schema(ArticleList.model_json_schema())
もうちょい説明が欲しい
PydanticのモデルからJSONスキーマを生成し、そのスキーマで必須の項目(?)対してOpen AIでの◯◯のためにadditionalProperties: falseを追加する?
「additionalProperties: false」がないといけないというドキュメントへのリンクもあるといいなぁ
with open(html_path, encoding="utf-8") as f: SAMPLE_HTML = f.read()
Pathオブジェクトからは以下で読み込む派
SAMPLE_THML = html_path.read_text(encoding="utf-8")
APIだけで試してみる
APIでの構造化出力を試す
の方がわかりやすいかなと
プロバイダーに
◯◯プロバイダーと呼びたいけど、なんだろう。 生成AIのAPIプロバイダー?
3.14未満
https://pypi.org/project/pydantic-ai/ 3.14に対応してそう?
「パッケージマネージャーの導入 ─ uv」「静的コード解析ツール ─ Ruff」「構造的パターンマッチ」「一歩進んだ型ヒントの活用」「テンプレート文字列リテラル ─ t-string」「コマンドラインツール – click」「TOMLファイルを扱う – tomllib」「非同期に対応したHTTPクライアント ─ HTTPX」
節タイトルそのままだ冗長かなと思いました。
パッケージマネージャーuv、とか、HTTPクライアントHTTPXとかでいいかなと
版
トル
、
「」が区切りになるので「、」はなくてもいい派
節
節、トルでもいいのでは
前述のように
トルでも意味は通じそう
もの
機能
かなぁ
このなか
ドキュメント
ほとんどの
今見たら3.14の翻訳率は50%くらいだったので「多くの」くらいがよいと思います
はじめに
生成AIが台頭している今のタイミングで本書を手に取る意味、みたいなことは書かなくてもいいかなぁ。 普遍的な知識をつけるとか?
rules = TextFileKnowledgeSource(file_path="writing_rules.txt")
ここにコメントが欲しい
マネージャー LLM が各 Agent の成果物を確認し、妥当性をチェックしたうえで最終結果としてまとめる
これは具体的になにをやっているのかちょっとわからなかったです。
最後のブログ記事の内容を確認して、もともとのタスクの依頼内容を満たしているかをチェックしている? 満たしてなかったらどうなる?
マネージャー LLM がタスク全体を把握し、実行計画をたてる
ここもうちょい具体的に書いてくれた方が、コードをもとにCrewAIがなにをやってるか明確になると思いました。
タスク全体をTaskの内容から把握し、実行計画を立てる。実行計画では◯◯調査、◯◯調査を実施し、その結果をもとにトレンド分析し~~
書くAgentの役割や能力を踏まえ、各タスクを以下のように額Agentに割り当てる
◯◯調査、◯◯調査: データ収集専門家
みたいな
(
閉じ括弧がない。このカッコ不要そう?
LLM やそのバージョンによって異なるため
この説明だとLLMのバージョンが同じだったら同じ結果が返ってくると読める。
実際には実行するたびに微妙に違う結果が返ってくるのでは?
kickoff()
kickoff()メソッド
kickoff()は等幅フォントにしたい
。
デフォルトでは~~の説明が欲しい
一般向け
一般の読者向け
とか
トレンド
トレンド情報
かな
pip install "crewai[google-genai]" python-dotenv
そういえばコードに全体的にキャプションを入れたい
調査→分析→検証
これ、後の方に出てくるストーリーと同じですか?違ったら合わせて欲しい
。
実行したあとに幾つかログが抜粋で表示されていると、処理内容がイメージができていいかなと思いました。
次の行に「ログには主に以下の情報が」と書いてあるので、ログの例がほしいと思います
。
最初の例をYAMLも使った構成で書き直すとこうなります。 みたいなのが見れるとうれしいなー
各専門 Agent が Task 完了後に結果を マネージャー LLM に報告し、マネージャー LLM が最終成果物をユーザーに提出する
シーケンシャルな場合との違いがあまりピントこなかったです
# .env ファイルに環境変数を設定 OPENAI_API_KEY="your-openai-api-key" SERPER_API_KEY="your-serper-api-key"
MUST: これだとコマンドラインで環境変数を設定しているように見える。コードブロックを分けた方が良い
ツール
ツールの説明がここまであんまなかったので唐突に感じる。
します。
箇条書きは「だ、である」派
。
これも、先にどういう構成なのかを説明して欲しい。 図で示せるとわかりやすいかも。
task-attributes
tableが壊れとる...
List[BaseTool]
list[BaseTool] 派。BaseToolってなに?
Union[str, LLM, Any]
str | LLM | Any 派
Anyありなんかい!!
以下に
話が急に飛んでいる。
一度見出し「◯◯の主な引数」みたいなのを挟み
Agent、Task...には◯◯をするためにさまざまな引数があります。 以下に~~
見たいな文章がほしい。
。
SHOULD: コードの前に、どういうことをさせようとしているかの説明分がほしいです。 以下のコードのコメントを読めばわかるとは思うんですが、先に説明してからコードを読む方が、スムーズに理解できるかなと思いました
たとえばこういう感じかなと
最新のAI技術に対してわかりやすい記事を書くという目的で、調査員とライターの2人のメンバーがいて、調査員の調査した内容を元に~~~
dotenv
dotenvが必須かなと思ったけどそうじゃなくて環境変数を.envファイルに書きたいから使っているだけですよね。
ここでは環境変数を.envファイルに書いて~~~のためにdotenvを使用します。
みたいな説明がほしいかなと思いました
しています。
ここも箇条書きにするなら文体を揃えたい
本記事では触れませんが、より高度な制御をすることが可能です。興味のある方は以下を参照してください。
nits 箇条書きだと「体言止め」で文体が違うので、ここは普通の文章にした方がよいかと
選択肢オプションとして特定の拡張子を指定
ここも書き換えてください
以下の
1つの文で「以下」が連続しているので、こっちはトルでも意味が通じるかな。
ファイルパス引数として存在することを確認
上の文章と似た内容だけど微妙に情報が増えて箇条書きになっている。この箇条書きでなにを伝えたいかを直前に文章で書いて欲しい。
以下は〜〜です。 以下に〜〜を示します。
みたいな
click.Choice(["txt", "md"]
例なのでしょうがないけど、自分でファイル名を指定しつつ、拡張子も指定するというコマンドは、オプションの用途としてピンとこないなと思いました。
何か数え方のルールとかを変えられるといいんだけど。文字数でカウントするかバイト数でカウントするか、とか
required=
これも = をトルでいいと思う
default
キーハード引数を示すときに = って付けるのあんまり見たことないので、トルでいいと思います
。
nits: 表の文章は最後の。はトルでいいかなぁ
@click.command()
キャプションがない。
以降も同様
pass
ここに中身を入れて、実際に動作させた例がほしい
指定
オプションに値が
とか?
は
トル
オプションの後に値を指定しない。
これはコマンドで呼び出すときの話ですよね?ちょっとこの文章だけだと意味が取りにくい
長い形
「短縮形」と「長い形」という表現がいまいちだなと
短いオプション名と長いオプション名とか?
短縮形
表でまとめた方が見やすそう
例えば、--nameオプションは名前を指定するために使用されます.
これはなんか--nameは名前を指定するためだけにしか使われないように読めるので、ちょっと違うかなと。
例えば、名前を指定するための--nameオプション、などです。
とか?
テストを安全に出力することができる
ちょっと意味が分からなかったです。
:caption: clickの基本的な使用例 hello.py
なんか変。以降もcaptionになってない
あ
が
--help
これもバッククォートで囲む
などを
などのデコレーターを
サードパーティ製パッケージ
外部ライブラリ
にしたんじゃないっけか
作成
を作成
。
argparseについては「<project:#argparse>」を参照してください。
とか入れて欲しい
モジュール
標準ライブラリの、と書いてあるのでモジュールはトルでよいかと
@click.command()
バッククォートで囲んで欲しい
os.process_cpu_count()
バッククォートで囲んでほしい
free threading
毎回太字にしなくてよいかと。初出の時だけでよいのでは
Python 3.14
Python 3.13からサポートされていますが、ここでは3.14のことしか書かない?
https://docs.python.org/ja/3.14/howto/free-threading-python.html
コア開発者のモチベーションとしては
これはどこ情報なのか、が気になりました
完全に分離
完全に分離、とはどういう意味かがわかりにくい。
なにから完全に分離しているのか
サブインタプリタ
表記揺れ: インタープリター
...
インデントがずれている
un(coroutine, *, debug=False)
引数が増えているので確認してください
補足
捕捉
引数で受け取ったsecの秒数
コードを書き換えたのでこのコメントは正しくない
asyncio.run(coroutine, *, debug=False)
https://docs.python.org/ja/3/library/asyncio-runner.html#asyncio.run
3.12からloop_factory引数が増えてる
... # 時間のかかる処理
インデントが3文字になっている
複数組み込んでも
なにを複数組み込むのか?
実施
ruff checkとruff formatを実施
とか。なにを実施するか書いて欲しい
各種CI
pre-commitはCIじゃないかなー
各種ツールでruffを使用する方法、とか?
に行っておくと便利です。
日本語がなんか変です。
で行(おこな)っておくと?
それだけで
引数無しで
それだけで
引数無しで
quote-style = "double" # 文字列をダブルクォートで統一する indent-style = "space" # インデントはスペ
これデフォルト設定だからなー。 クォートをシングルにできるけど、設定なしの運用でいいんじゃない?みたいな記述がいいかなーって思ってます。
"
カンマを付けたい派
。
これはストーリーとしては、この前に ruff check --fix を実行していないといけないので、そのように手前で実行している必要がある
import sys import os
使われていないモジュールだとF401が出ちゃうのでisortの意味がない(fixできない)
無理やり使うモジュールを入れましょう
datetimeとかなにかをいれてメッセージに追加する感じで
)
文章(文章)。
が正しい書き方(のはず)
。
トル
なお
この手前でfixされたあとのexample.pyを表示して、import osが削除されていることを確認したい
す
す。
F系
系なくてもいい派です
またはruff.toml
下の設定例だとpyproject.tomlなので
前述の設定ファイルを用いて、にしてコードのキャプションに「説明 - pyproject.toml」とか書くのはどうでしょうか
check
checkコマンド
とか
ルールコードの
長いので、トルでも通じるかなと
表のタイトルを入れてください。
https://myst-parser.readthedocs.io/en/latest/syntax/tables.html#table-with-captions
と
と、
ここで、を打たないと「一部のルール」がFにもかかっているように読める。
もしくはE系の一部とF系のルールが
とか
flake8
Flake8 (以下同様
flake8
Flake8と最初は大文字かなと
indent-width = 4 # インデント文字数
同様にデフォルト設定っぽいものは除外して必要最低限にしてほしい
indent-width = 4 # インデント文字数
デフォルト設定を設定例に書いているのが気になります。
デフォルト設定はここにあることを示して、設定ファイルとしては必要最低限の記述例でいいかなと思います https://docs.astral.sh/ruff/configuration/
フォーマッター
整形
他の箇所と表現を合わせる
が記述されます。
を記述します。
前の文は主体が自分だったので
Ruffは、Astral社https://astral.shから提供さ
他のライブラリとかでuvを使ったインストールには触れていないので、ここはなくてもいいかなぁ
Resolved 29 packages in 11ms Installed 27 packages in 58ms (省略) + pytest-cov==7.0.0 (省略) + sphinx==9.0.4 (省略)
ここも両方指定した場合と同じとか、まるっと省略してもいいかも
olved 29 packages in 13ms Uninstalled 20 packages in 200ms Installe
このへんも2回目以降は省略しちゃってもいいんじゃないかな
uv venvコマンド以外に仮想環境を作成できるコマンド
いいと思います