<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>逐水寻源</title>
    <link>https://www.zair.top/ja-jp/</link>
    <description>コンピューター テクノロジー、データ サイエンス、人工知能の分野での私の学習と実践をまとめた個人技術ブログ、Zhushuixunyuan へようこそ。プログラミングスキルからアルゴリズム分析、データ分析から機械学習プロジェクト、技術知識から個人の成長ストーリーまで、探索できる豊富なコンテンツが用意されています。一緒に学び、成長し、テクノロジーの世界の無限の可能性を解き放ちましょう！ </description>
    <follow_challenge>
      <feedId>65268575454017536</feedId>
      <userId>72075959463733248</userId>
    </follow_challenge>
    <generator>Hugo 0.136.4 &amp; FixIt v0.3.17-036cbb41</generator>
    <language>ja-JP</language>
    <managingEditor>blog@zair.top (Tim)</managingEditor>
    <webMaster>blog@zair.top (Tim)</webMaster>
    <copyright>本站内容采用 CC BY-NC-SA 4.0 国际许可协议。</copyright>
    <lastBuildDate>Fri, 28 Nov 2025 14:21:01 +0000</lastBuildDate>
    <atom:link href="https://www.zair.top/ja-jp/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>専門家混合モデル(MoE) 詳説：Mixtral 8X7B、DBRX、Deepseek-v2 のアーキテクチャと応用</title>
      <link>https://www.zair.top/ja-jp/post/mixture-of-experts/</link>
      <pubDate>Wed, 25 Dec 2024 15:44:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/mixture-of-experts/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/llm/">Llm</category>
      <description><![CDATA[<blockquote>
<p>専門家混合モデル (MoE) のアーキテクチャとその作動原理を詳細に解説。Mixtral 8X7B、DBRX、Deepseek-v2といった注目のMoEモデルの応用と利点を探索。PythonでMoEモデルを実装し、論理推論、要約、エンティティ抽出などのタスクにおけるパフォーマンスを評価します。</p>
</blockquote>
<p>専門家混合モデル（Mixture of Experts, 略してMoE）は、大規模言語モデル（LLMs）の分野で長らく注目されている概念です。これはモデルの効率性やスケーラビリティを飛躍的に向上させるだけでなく、複雑なタスクへの新しいアプローチを提供します。簡単に言えば、MoEモデルは1つの大規模モデルを複数の小規模モデルに分割し、それぞれが特定のタスクやデータタイプに特化します。これにより、タスクを処理する際に関連性のある「専門家」のみが活動し、モデル全体を動かす必要がなくなるため、計算リソースを大幅に節約できます。</p>
<p><strong>この記事で学べること：</strong></p>
<ul>
<li>MoEモデルの基本アーキテクチャと動作原理の理解</li>
<li>Mixtral 8X7B、DBRX、Deepseek-v2といった注目の MoEモデルの仕組みと特徴</li>
<li>Google Colab上でPythonを使ってMoEモデルを実装する方法</li>
<li>MoEモデルの論理推論、要約、エンティティ抽出といったタスクにおけるパフォーマンスの評価</li>
<li>MoEモデルが自然言語処理やコード生成などの複雑な課題でどのような利点と課題を持つかの理解</li>
</ul>
<h2 id="専門家混合モデル-moe-とは何か" class="heading-element"><span>1 専門家混合モデル (MoE) とは何か？</span>
  <a href="#%e5%b0%82%e9%96%80%e5%ae%b6%e6%b7%b7%e5%90%88%e3%83%a2%e3%83%87%e3%83%ab-moe-%e3%81%a8%e3%81%af%e4%bd%95%e3%81%8b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>現在のディープラーニングモデルは主に人工ニューラルネットワークに基づいており、それぞれの層に多数の「ニューロン」が含まれています。各ニューロンは入力データを処理し、簡単な数学演算（例：活性化関数）を行って、その結果を次の層に渡します。さらに高度なモデル、例えば Transformer では、自己注意メカニズムを導入し、データ内の複雑なパターンを捉えることができます。</p>
<p>しかし、従来の密集モデルは全ての入力データを処理する際にネットワーク全体を計算に使用するため、計算コストが非常に高くなります。この問題を解決するため、Mixture of Experts（MoE）モデルでは<strong>スパースアーキテクチャ</strong>を採用しており、現在のタスクに関連するネットワークの一部、つまり「専門家」のみを活性化させます。これにより、特に自然言語処理のような複雑なタスクの処理において、計算資源を大幅に削減できます。</p>
<p>例えば、チームプロジェクトでチームメンバーが複数のグループに分かれ、それぞれ異なるタスクに専念する状況をイメージすると、MoEモデルの動作方式が理解しやすくなります。MoEモデルは、複雑な問題を複数のサブタスクに分解し、各サブタスクを特化した「専門家」に担当させる構造です。</p>
<h3 id="moeモデルの主な利点" class="heading-element"><span>1.1 MoEモデルの主な利点：</span>
  <a href="#moe%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e4%b8%bb%e3%81%aa%e5%88%a9%e7%82%b9" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li><strong>事前学習が高速</strong>：従来の密集モデルと比較して、学習プロセスが効率的。</li>
<li><strong>推論速度が向上</strong>：パラメータ数が同じでも、MoEモデルの推論はより高速。</li>
<li><strong>VRAM需要が高い</strong>：全ての専門家がメモリに格納される必要があるため、グラフィックメモリの要求が高い。</li>
</ul>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif" alt="MoE構造イメージ" srcset="https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif?size=small, https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif?size=medium 1.5x, https://cdn1.zair.top/images/2024/12/a7b209eb10f3d2b2c8e5414c41e62f1c.avif?size=large 2x" data-title="MoE構造イメージ" class="suffix-invalid suffix-invalid__small suffix-invalid__large" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>MoEモデルの構成には、主に2つの重要なコンポーネントがあります：**専門家（Experts）<strong>と</strong>ルーター（Router）**です。専門家は特定のタスクに特化した小規模なニューラルネットワークであり、ルーターは入力データを基に関連する専門家を選択的に活性化します。この選択的活性化により、タスクに必要な部分だけが計算に使用され、効率が向上します。</p>
<h2 id="代表的なmoeモデル" class="heading-element"><span>2 代表的なMoEモデル</span>
  <a href="#%e4%bb%a3%e8%a1%a8%e7%9a%84%e3%81%aamoe%e3%83%a2%e3%83%87%e3%83%ab" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>近年、MoEモデルはAI研究の中で注目を集めております。これは、高いパフォーマンスを維持しながら、大規模言語モデルを効率的にスケールさせることができるからです。その中でも、例えば Mixtral 8x7B は、スパースな専門家混合アーキテクチャを採用しており、入力ごとに専門家の一部だけを活性化させることで、従来の完全密集型モデルに匹敵する性能を発揮しながらも効率を大幅に向上させました。</p>
<p>以下、注目すべきMoEモデルについての詳細を見ていき、それらをGoogle Colabを利用したPythonコードで実装する方法についても学びます。</p>
<h3 id="mixtral-8x7b" class="heading-element"><span>2.1 Mixtral 8X7B</span>
  <a href="#mixtral-8x7b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><a href="https://huggingface.co/mistralai/Mixtral-8x7B-v0.1"target="_blank" rel="external nofollow noopener noreferrer">Mixtral 8X7B<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> は、decoder-only 型の Transformer に基づいたアーキテクチャです。モデルの入力としてはトークンのシーケンスが与えられ、これらのトークンはベクトルに埋め込まれ、次にデコーダ層で処理されます。このプロセスにより、各位置でどの単語が占めるかの確率が生成され、テキスト生成や予測が可能となります。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif" alt="MoE Decoder" srcset="https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif?size=small, https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif?size=medium 1.5x, https://cdn1.zair.top/images/2024/12/ccb17e49fea11e6db8e4d3ce48d9f373.avif?size=large 2x" data-title="MoE Decoder" class="suffix-invalid suffix-invalid__small suffix-invalid__large" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>デコーダ層は、以下の2つの主要部分で構成されています：</p>
<ol>
<li><strong>注意機構（Attention Mechanism）</strong>：コンテクスト情報を統合します。</li>
<li><strong>スパース専門家混合 (SMOE) 部分</strong>：個々の単語ベクトルを個別に処理します。MLP層（多層パーセプトロン層）は計算資源を大きく消費する部分です。SMOEでは、各入力に対して最も関連性の高い専門家の出力の加重和が活性化されます。この仕組みにより、計算コストの抑制と複雑なパターンの学習を両立しています。</li>
</ol>
<p><strong>モデルの主な特徴：</strong></p>
<ul>
<li><strong>専門家の総数</strong>：8</li>
<li><strong>活性化する専門家の数</strong>：2</li>
<li><strong>デコーダ層数</strong>：32</li>
<li><strong>語彙サイズ</strong>：32000</li>
<li><strong>埋め込みサイズ</strong>：4096</li>
<li><strong>各専門家のパラメータ数</strong>：56 億（全体に占める一部。残りは共通成分。）</li>
<li><strong>活性化パラメータ総数</strong>：128 億</li>
<li><strong>コンテクスト長</strong>：32k トークン</li>
</ul>
<p>Mixtral 8x7B は、テキスト生成、翻訳、感情分析、教育、顧客サービスの自動化などさまざまな分野で優れた性能を発揮します。</p>
<h3 id="dbrx" class="heading-element"><span>2.2 DBRX</span>
  <a href="#dbrx" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><a href="https://github.com/databricks/dbrx"target="_blank" rel="external nofollow noopener noreferrer">DBRX<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> は Databricks が開発した、Transformer に基づく decoder-only 型の大規模言語モデル（LLM）で、次のトークンの予測（Next-Token Prediction）を用いて訓練されました。本モデルは細粒度の専門家混合 (MoE) アーキテクチャを採用しており、総パラメータは 1320 億にのぼりますが、各入力においては 360 億のパラメータのみが活性化されます。このモデルは 12 兆トークンに及ぶテキストとコードデータを用いて事前学習が行われています。他のオープンソースMoEモデル（例えば Mixtral や Grok-1）と比較して、DBRXはより細かい専門家の設計を特徴とし、小型の専門家を多数使用しています。また、専門家数を増やしつつも、必要に応じて活性化される専門家の数を抑えた設計となっています。</p>
<h4 id="アーキテクチャの特徴" class="heading-element"><span>2.2.1 アーキテクチャの特徴</span>
  <a href="#%e3%82%a2%e3%83%bc%e3%82%ad%e3%83%86%e3%82%af%e3%83%81%e3%83%a3%e3%81%ae%e7%89%b9%e5%be%b4" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><ul>
<li>
<p><strong>細粒度の専門家</strong>  通常、標準的なFFNレイヤーから専門家混合 (MoE) レイヤーに移行する際には、FFNを複数回コピーして複数の専門家を作成します。しかし、細粒度専門家の場合、より多くの専門家を生成しながらも、パラメータ数を増やさない仕組みが必要です。そのため、単一のFFNを複数のセグメントに分割し、各セグメントを個別の専門家として扱います。DBRXでは16個の専門家のうち4個の専門家が活性化される構造を採用しています。</p>
</li>
<li>
<p><strong>革新技術の採用</strong>  本モデルでは、さらなる効率化のために以下の技術が採用されています：</p>
<ul>
<li><strong>回転ポジショナルエンコーディング (RoPE)</strong></li>
<li><strong>ゲーティッド線形単位 (GLU)</strong></li>
<li><strong>グループ化クエリ注意 (GQA)</strong></li>
</ul>
</li>
</ul>
<h4 id="モデルの主な特徴" class="heading-element"><span>2.2.2 モデルの主な特徴：</span>
  <a href="#%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e4%b8%bb%e3%81%aa%e7%89%b9%e5%be%b4" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><ul>
<li><strong>専門家の総数</strong>：16</li>
<li><strong>各層で活性化する専門家の数</strong>：4</li>
<li><strong>デコーダ層数</strong>：24</li>
<li><strong>活性化パラメータ総数</strong>：360 億</li>
<li><strong>総パラメータ数</strong>：1320 億</li>
<li><strong>コンテクスト長</strong>：32k トークン</li>
</ul>
<p>DBRXモデルは、コード生成、高度な言語理解、数学的推論、プログラミングタスクに関する使用例で優れた性能を発揮します。特に、高精度と効率性が求められる場合、例えばコードスニペットの生成、数学問題の解決、複雑な指示への詳細な解答などでその力を発揮します。</p>
<h3 id="deepseek-v2" class="heading-element"><span>2.3 Deepseek-v2</span>
  <a href="#deepseek-v2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><a href="https://github.com/deepseek-ai/DeepSeek-V2"target="_blank" rel="external nofollow noopener noreferrer">Deepseek-v2<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> のMoEアーキテクチャでは、以下の2つの重要なアイデアが活用されています：</p>
<ol>
<li>
<p><strong>細粒度の専門家</strong><br>
専門家をより細かい粒度に分割することで、専門家が習得する知識をさらに特化させ、より正確な結果を提供できるようにしています。</p>
</li>
<li>
<p><strong>共有専門家</strong><br>
特定の専門家を「共有専門家」として指定し、必ず活性化されるよう設計。これにより、様々なコンテクストにおいて汎用的かつ価値の高い知識を収集・統合します。</p>
</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif" alt="DeepSeekMoE" srcset="https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif?size=small, https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif?size=medium 1.5x, https://cdn1.zair.top/images/2024/12/e813bb99ca7a99faa7fff420daaf43a7.avif?size=large 2x" data-title="DeepSeekMoE" class="suffix-invalid suffix-invalid__small suffix-invalid__large" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h4 id="モデルの主な特徴-1" class="heading-element"><span>2.3.1 モデルの主な特徴：</span>
  <a href="#%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e4%b8%bb%e3%81%aa%e7%89%b9%e5%be%b4-1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><ul>
<li><strong>総パラメータ数</strong>：2360 億</li>
<li><strong>活性化パラメータ総数</strong>：210 億</li>
<li><strong>各層での専門家数</strong>：160（その中から2つを選択）</li>
<li><strong>各層での共有専門家数</strong>：2</li>
<li><strong>各層で活性化する専門家数</strong>：8</li>
<li><strong>デコーダ層数</strong>：60</li>
<li><strong>コンテクスト長</strong>：128k トークン</li>
</ul>
<p>このモデルは8.1兆トークンの膨大なデータセットで事前学習が行われ、特に対話に優れた性能を発揮するため、チャットボットや仮想アシスタントとしての用途に最適です。また、文章生成や翻訳、要約といった高品質な文章処理に適しており、コード生成にも効率的に利用可能です。</p>
<h2 id="pythonでmoeモデルを実装する方法" class="heading-element"><span>3 PythonでMoEモデルを実装する方法</span>
  <a href="#python%e3%81%a7moe%e3%83%a2%e3%83%87%e3%83%ab%e3%82%92%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>MoEモデルは、異なる専門家ネットワークを動的に選択してタスクを処理する高度な機械学習モデルです。以下では、Pythonを使用してMoEモデルをどのように実装するかを説明します。</p>
<h3 id="ステップ1必要なpythonライブラリのインストール" class="heading-element"><span>3.1 ステップ1：必要なPythonライブラリのインストール</span>
  <a href="#%e3%82%b9%e3%83%86%e3%83%83%e3%83%971%e5%bf%85%e8%a6%81%e3%81%aapython%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aa%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>まず、必要なライブラリをインストールします：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="err">!</span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">update</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">sudo</span> <span class="n">apt</span> <span class="n">install</span> <span class="o">-</span><span class="n">y</span> <span class="n">pciutils</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">langchain</span><span class="o">-</span><span class="n">ollama</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">curl</span> <span class="o">-</span><span class="n">fsSL</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">ollama</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">install</span><span class="o">.</span><span class="n">sh</span> <span class="o">|</span> <span class="n">sh</span>
</span></span><span class="line"><span class="cl"><span class="err">!</span><span class="n">pip</span> <span class="n">install</span> <span class="n">ollama</span><span class="o">==</span><span class="mf">0.4.2</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="ステップ2スレッドの有効化" class="heading-element"><span>3.2 ステップ2：スレッドの有効化</span>
  <a href="#%e3%82%b9%e3%83%86%e3%83%83%e3%83%972%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e3%81%ae%e6%9c%89%e5%8a%b9%e5%8c%96" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>次に、threadingを用いてOllamaサービスを実行します：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">threading</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">subprocess</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">time</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">run_ollama_serve</span><span class="p">():</span>
</span></span><span class="line"><span class="cl">  <span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s2">&#34;ollama&#34;</span><span class="p">,</span> <span class="s2">&#34;serve&#34;</span><span class="p">])</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">run_ollama_serve</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="ステップ3ollamaモデルの取得" class="heading-element"><span>3.3 ステップ3：Ollamaモデルの取得</span>
  <a href="#%e3%82%b9%e3%83%86%e3%83%83%e3%83%973ollama%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e5%8f%96%e5%be%97" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>例えばDBRXモデルをOllamaから取得：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="err">!</span><span class="n">ollama</span> <span class="n">pull</span> <span class="n">dbrx</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="ステップ4モデルを用いたクエリ" class="heading-element"><span>3.4 ステップ4：モデルを用いたクエリ</span>
  <a href="#%e3%82%b9%e3%83%86%e3%83%83%e3%83%974%e3%83%a2%e3%83%87%e3%83%ab%e3%82%92%e7%94%a8%e3%81%84%e3%81%9f%e3%82%af%e3%82%a8%e3%83%aa" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>モデルをテストするため、以下のようにクエリを投げます：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">langchain_core.prompts</span> <span class="kn">import</span> <span class="n">ChatPromptTemplate</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">langchain_ollama.llms</span> <span class="kn">import</span> <span class="n">OllamaLLM</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">IPython.display</span> <span class="kn">import</span> <span class="n">Markdown</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">template</span> <span class="o">=</span> <span class="s2">&#34;&#34;&#34;Question: </span><span class="si">{question}</span><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2">Answer: Let&#39;s think step by step.&#34;&#34;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">prompt</span> <span class="o">=</span> <span class="n">ChatPromptTemplate</span><span class="o">.</span><span class="n">from_template</span><span class="p">(</span><span class="n">template</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">model</span> <span class="o">=</span> <span class="n">OllamaLLM</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="s2">&#34;dbrx&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">chain</span> <span class="o">=</span> <span class="n">prompt</span> <span class="o">|</span> <span class="n">model</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 入力データを準備</span>
</span></span><span class="line"><span class="cl"><span class="n">input_data</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;question&#34;</span><span class="p">:</span> <span class="s1">&#39;以下の内容を1文に要約してください：&#34;ボブは男の子です。彼は犬を飼っています。ボブと彼の犬は散歩に出かけました。公園に着いたとき、ボブは棒を投げ、犬はそれを拾ってきました。犬はリスを追い、ボブはそれを追いかけました。ボブは犬を見つけ、一緒に家へ帰りました。&#34;&#39;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># チェーンを呼び出し、応答を表示</span>
</span></span><span class="line"><span class="cl"><span class="n">response</span> <span class="o">=</span> <span class="n">chain</span><span class="o">.</span><span class="n">invoke</span><span class="p">(</span><span class="n">input_data</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">display</span><span class="p">(</span><span class="n">Markdown</span><span class="p">(</span><span class="n">response</span><span class="p">))</span></span></span></code></pre></td></tr></table>
</div>
</div><p>このコードにより、モデルの性能をテストし、その結果を見ることができます。</p>
<h2 id="mixtral-8x7b-モデルの性能評価" class="heading-element"><span>4 Mixtral 8x7B モデルの性能評価</span>
  <a href="#mixtral-8x7b-%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e6%80%a7%e8%83%bd%e8%a9%95%e4%be%a1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>異なるMoEモデルの出力を比較する際、例えば論理推論、要約、エンティティ抽出といったタスクの実績を見ることで、パフォーマンスの違いを分析できます。</p>
<p>以下、具体例をいくつか検証していきます。</p>
<p><strong>論理推論問題：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">13個の単語を挙げてください。各単語は9文字で構成されています。</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>出力例：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">以下の13個の9文字の単語を示します：
</span></span><span class="line"><span class="cl"><span class="k">1.</span> Agriculture
</span></span><span class="line"><span class="cl"><span class="k">2.</span> Beautiful
</span></span><span class="line"><span class="cl"><span class="k">3.</span> Chocolate
</span></span><span class="line"><span class="cl"><span class="k">4.</span> Dangerous
</span></span><span class="line"><span class="cl"><span class="k">5.</span> Encyclopedia
</span></span><span class="line"><span class="cl">...</span></span></code></pre></td></tr></table>
</div>
</div><p>上記のような問題では、一部の単語が条件を満たさない場合があります。ただし、一連の正確性を検討することができます。</p>
<p><strong>要約問題</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">次の内容を1文にまとめてください：「ボブは男の子です。彼は犬を飼っています。ボブと彼の犬は散歩に出かけました。ボブと彼の犬は公園に着きました。公園では、ボブが棒を投げ、犬がそれを拾ってきました。犬がリスを追い、ボブがそれを追いかけました。ボブは犬を見つけて、一緒に家に帰りました。」</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>出力：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">少年ボブは愛犬と活発な散歩を楽しみ、公園では棒拾いやリス追いを一緒に遊び、その後一緒に家に帰りました。</span></span></code></pre></td></tr></table>
</div>
</div><p>上記の出力から判断すると、要約は非常に適切にまとめられています。</p>
<p><strong>エンティティ抽出</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">次のテキストから、すべての数値とそれに対応する単位を抽出してください：「マラソンの長さは42キロメートルで、30,000人以上が参加しました。」</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>出力：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">1.</span> 与えられたテキストには、2つの数値と対応する単位があります：
</span></span><span class="line"><span class="cl">   <span class="k">-</span> 42（マラソンの長さ。文中では単位が明示されていませんが、後述からキロメートルと推測できます）
</span></span><span class="line"><span class="cl">   <span class="k">-</span> 30,000（参加人数）
</span></span><span class="line"><span class="cl"><span class="k">2.</span> 文中で後にマラソンの長さの単位が示されています：「キロメートル」。特に別の単位が指定されていないため、この数値もキロメートルと仮定します。
</span></span><span class="line"><span class="cl"><span class="k">3.</span> したがって、最終的な解答は以下の通りです：
</span></span><span class="line"><span class="cl">   <span class="k">-</span> 42（キロメートル、マラソンの長さ）
</span></span><span class="line"><span class="cl">   - 30,000（参加人数）</span></span></code></pre></td></tr></table>
</div>
</div><p>上記の出力から判断すると、すべての数値と単位が正確に抽出されています。</p>
<p><strong>数学的推論問題</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl">2個のりんごを持っています。その後、さらに2個買いました。その2個のりんごを使ってパイを作ります。パイを半分食べた後、残りのりんごは何個ですか？</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>出力：</strong></p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="k">1.</span> 最初に2個のりんごを持っています。
</span></span><span class="line"><span class="cl"><span class="k">2.</span> さらに2個買ったので、合計で4個のりんごを持っています（2 + 2 = 4）。
</span></span><span class="line"><span class="cl"><span class="k">3.</span> パイを作るために2個のりんごを使用しました。その結果、残りは2個です（4 - 2 = 2）。
</span></span><span class="line"><span class="cl">4. パイを半分食べましたが、パイに含まれるりんごの数は不明のため、この情報だけでは残ったりんごの正確な数を判断できません。</span></span></code></pre></td></tr></table>
</div>
</div><p>モデルの出力は不正確です。正しい答えは2です。理由は、合計4個のりんごのうち、2個がパイ作りに使用され、残り2個のりんごはそのまま手元に残っているためです。</p>
<h2 id="まとめ" class="heading-element"><span>5 まとめ</span>
  <a href="#%e3%81%be%e3%81%a8%e3%82%81" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>MoEモデルは、各タスクに関連する専門家のみを活性化することで、効率的な深層学習方法を提供します。この選択的な活性化により、従来の密集型モデルと比較して計算資源を削減しつつ、複雑な操作を実行することが可能です。しかし、MoEモデルにはすべての専門家をメモリ内に格納するための大量のVRAMが必要であり、トレードオフが伴います。</p>
<p>Mixtral 8X7Bアーキテクチャはその典型例であり、スパースな専門家混合（SMoE）メカニズムを活用して、専門家の一部を活性化し効率的なテキスト処理を実現し、計算コストを大幅に削減しました。このモデルは128億の活性化パラメータと32kトークンのコンテクスト長を持ち、テキスト生成から顧客サービスの自動化に至る多くの応用において優れた性能を発揮しています。Databricks社のDBRXモデルは、革新的な細粒度MoEアーキテクチャにより、入力ごとに360億パラメータのみを活性化しつつ、合計1320億パラメータを効率的に利用します。同様に、DeepSeek-v2は細粒度と共有専門家を組み合わせた強力なアーキテクチャを採用しており、2360億パラメータと128,000トークンのコンテクスト長を持つことで、チャットボット、コンテンツ作成、コード生成といった多様な応用に理想的な選択肢となっています。</p>
<h3 id="重要なポイント" class="heading-element"><span>5.1 重要なポイント</span>
  <a href="#%e9%87%8d%e8%a6%81%e3%81%aa%e3%83%9d%e3%82%a4%e3%83%b3%e3%83%88" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>MoEモデルは、特定のタスクに関連する専門家のみを活性化することで深層学習の効率性を高め、従来の密集型モデルと比べて計算資源の使用を削減します。</li>
<li>MoEモデルは計算効率を提供する一方で、すべての専門家を保存するために膨大なVRAMを必要とし、計算能力とメモリ需要の間に課題があります。</li>
<li>Mixtral 8X7Bはスパース専門家混合（SMoE）メカニズムを採用し、専門家の128億活性化パラメータを一部活性化させることで効率的なテキスト処理を実現します。このモデルは32,000トークンのコンテクスト長をサポートし、テキスト生成や顧客サービス自動化を含む幅広い応用に最適です。</li>
<li>DatabricksのDBRXモデルは細粒度専門家混合アーキテクチャを採用し、各入力で360億パラメータのみを活性化する効率的な方式で、1320億パラメータを活かして複雑な言語タスクに対応します。</li>
<li>DeepSeek-v2は、細粒度専門家と共有専門家戦略を組み合わせた強力なアーキテクチャを採用し、2360億パラメータと128,000トークンのコンテクスト長を備え、多面的な応用において成果を挙げています。</li>
</ul>
<h2 id="よくある質問" class="heading-element"><span>6 よくある質問</span>
  <a href="#%e3%82%88%e3%81%8f%e3%81%82%e3%82%8b%e8%b3%aa%e5%95%8f" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><strong>Q1. 専門家混合モデル (MoE) とは何ですか？</strong></p>
<p>A. MoEモデルはスパースアーキテクチャを使用し、特定のタスクに関連する専門家のみを活性化して計算資源の使用を削減する、効率的なディープラーニングモデルです。</p>
<p><strong>Q2. MoEモデルのメリットとデメリットは何ですか？</strong></p>
<p>A. MoEモデルは計算効率を向上させる一方、すべての専門家をメモリに格納するために大量のVRAMを必要とするため、計算能力とメモリ需要のバランスを取る必要があります。</p>
<p><strong>Q3. Mixtral 8X7Bモデルの活性化パラメータ数はいくつですか？</strong></p>
<p>A. Mixtral 8X7Bは128億（2×56億）の活性化パラメータを持ち、総数448億（8×56億）の一部を使用します。このことにより、複雑なタスクを効率的に処理し、より高速な推論を可能にしています。</p>
<p><strong>Q4. DBRXモデルと他のMoEモデル（例: MixtralやGrok-1）の違いは何ですか？</strong></p>
<p>A. DBRXは細粒度の専門家混合方式を採用しており、各層に16個の専門家を含み、そのうち4個を活性化します。一方、他のMoEモデル（例: MixtralやGrok-1）は各層に8個の専門家を持ち、そのうち2個を活性化します。</p>
<p><strong>Q5. DeepSeek-v2は他のMoEモデルとどう異なりますか？</strong></p>
<p>A. DeepSeek-v2は細粒度専門家と共有専門家を組み合わせ、2360億パラメータと128,000トークンのコンテクスト長を備えています。その結果、チャットボット、コンテンツ作成、コード生成のような多様な用途に応用可能なモデルとなっています。</p>
<h2 id="推奨文献" class="heading-element"><span>7 推奨文献</span>
  <a href="#%e6%8e%a8%e5%a5%a8%e6%96%87%e7%8c%ae" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://mistral.ai/news/mixtral-of-experts/"target="_blank" rel="external nofollow noopener noreferrer">Mixtral of experts | Mistral AI | Frontier AI in your hands<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://medium.com/@bnjmn_marie/deepseekmoe-moe-with-segmented-and-shared-experts-dedf22e4a98c"target="_blank" rel="external nofollow noopener noreferrer">DeepSeekMoE: MoE with Segmented and Shared Experts<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://arxiv.org/abs/2401.04088"target="_blank" rel="external nofollow noopener noreferrer">Mixtral of Experts<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://arxiv.org/abs/2401.04089"target="_blank" rel="external nofollow noopener noreferrer">DBRX: A Large-Scale Decoder-Only Language Model with Fine-Grained Mixture of Experts<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>]]></description>
    </item>
    <item>
      <title>数学的視点から見たサポートベクターマシン（SVM）：最適化問題の解法</title>
      <link>https://www.zair.top/ja-jp/post/svm/</link>
      <pubDate>Wed, 27 Nov 2024 16:53:06 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/svm/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/data-science-machine-learning/">Data-Science-Machine-Learning</category>
      <description><![CDATA[<blockquote>
<p>サポートベクターマシン（SVM）は機械学習における古典的なアルゴリズムです。この記事では、SVMの公式導出に焦点を当て、マージン距離の詳細な推論や、元の問題と双対問題の公式化を説明します。制約付き最適化問題をラグランジュ関数を用いて解決し、KKT条件を利用して最適解を求める過程を深く探ります。また、多項式カーネル関数とガウスカーネル関数の公式特性についても触れます。</p>
</blockquote>
<h2 id="マージン距離の推論" class="heading-element"><span>マージン距離の推論</span>
  <a href="#%e3%83%9e%e3%83%bc%e3%82%b8%e3%83%b3%e8%b7%9d%e9%9b%a2%e3%81%ae%e6%8e%a8%e8%ab%96" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>サポートベクターマシン（SVM）において、正の超平面と負の超平面の式はそれぞれ以下の通りです：
$$
\vec{w} \cdot \vec{x} + b = 1 \quad \text{(正の超平面)}
$$
$$
\vec{w} \cdot \vec{x} + b = -1 \quad \text{(負の超平面)}
$$
ここで$\vec{w}=(w_1, w_2)$は重みベクトル、$b$はバイアス項、$\vec{x}=(x_1, x_2)$はデータポイントです。</p>
<p>仮に$\vec{x_m}$が正の超平面上の点、$\vec{x_n}$が負の超平面上の点であるとすると、次のようになります：
$$
w_1 x_{1m} + w_2 x_{2m} + b = 1 \quad \text{(1)}
$$
$$
w_1 x_{1n} + w_2 x_{2n} + b = -1 \quad \text{(2)}
$$</p>
<p>式(1)から式(2)を引くと、次のようになります：
$$
w_1 (x_{1m} - x_{1n}) + w_2 (x_{2m} - x_{2n}) = 2
$$
ベクトル形式で書くと：
$$
\vec{w} \cdot (\vec{x_m} - \vec{x_n}) = 2 \quad \text{(3)}
$$
決定超平面上の2点$\vec{x_0}$と$\vec{x_p}$を考え、それらは決定超平面の式$\vec{w} \cdot \vec{x} + b = 0$を満たします。すなわち：
$$
w_1 x_{10} + w_2 x_{20} + b = 0
$$
$$
w_1 x_{1p} + w_2 x_{2p} + b = 0
$$
2式を引くと：
$$
w_1 (x_{10} - x_{1p}) + w_2 (x_{20} - x_{2p}) = 0
$$
ベクトル形式で書くと：
$$
\vec{w} \cdot (\vec{x_0} - \vec{x_p}) = 0 \quad \text{(4)}
$$
式(4)は、$\vec{w}$が決定超平面上の任意の2点のベクトル差に垂直であることを示しています。</p>
<p>式(3)と(4)から、$\vec{w}$と$(\vec{x_m} - \vec{x_n})$の内積が2であることがわかります。ベクトルの内積の定義$\vec{a} \cdot \vec{b}=|\vec{a}| \cdot |\vec{b}| \cdot \cos \theta$に基づき、ここで$\theta$は$\vec{w}$と$(\vec{x_m} - \vec{x_n})$の間の角度です。次のようになります：
$$
|\vec{x_m} - \vec{x_n}| \cdot \cos \theta \cdot |\vec{w}| = 2
$$
$L = |\vec{x_m} - \vec{x_n}| \cdot \cos \theta$とすると：
$$
L \cdot |\vec{w}| = 2
$$
解くと：
$$
L=\frac{2}{|\vec{w}|}
$$</p>
<p>ここで$L$はSVMのマージン（margin）距離です。</p>
<p>マージン距離を導出する際に、ベクトルの内積の幾何学的意味を利用しました。すなわち、$\vec{a} \cdot \vec{b}=|\vec{a}| \cdot |\vec{b}| \cdot \cos \theta$であり、ここで$\theta$は2つのベクトルの間の角度です。この関係を通じて、内積をベクトルの長さと角度の関係に変換し、マージン距離の表現を導き出しました。</p>
<h2 id="双対性の証明" class="heading-element"><span>双対性の証明</span>
  <a href="#%e5%8f%8c%e5%af%be%e6%80%a7%e3%81%ae%e8%a8%bc%e6%98%8e" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>線形サポートベクターマシン(SVM)において、元の問題は目的関数を最小化する重みベクトル$w$とバイアス$b$を見つけることです：</p>
<p>$$
\min_w f(w) = \frac{1}{2} |w|^2
$$</p>
<p>ここでの$|w|^2$はベクトル$w$のユークリッドノルムの平方、すなわち$L_2$ノルムを表します。目的は決定境界の幅を最小化し、より良い一般化能力を得ることです。この問題は以下の制約を受けます：</p>
<p>$$
y_j (w^T x_j + b) - 1 \geq 0
$$</p>
<p>ここで$x_j$は第$j$番目の訓練サンプル、$y_j$は対応するラベルで、+1または-1の値を取ります。これにより、すべてのデータポイントが正しく分類され、決定境界から少なくとも1単位の距離を持つことが保証されます。</p>
<p>この制約付き最適化問題を処理するために、ラグランジュ関数を構築します：</p>
<p>$$
L(w, b, \alpha) = f(w) - \sum_{j = 1}^n \alpha_j g_j(w, b)
$$</p>
<p>ここで$\alpha_j \geq 0$はラグランジュ乗数で、元の問題の制約条件$g_j(w, b) = y_j (w^T x_j + b) - 1 \geq 0$を導入するために用いられます。</p>
<p>次に、双対関数$q(\alpha)$を定義します：</p>
<p>$$
q(\alpha) = \min_{w, b} L(w, b, \alpha) = \min_{w, b} \left( f(w) - \sum_{j = 1}^n \alpha_j g_j(w, b) \right)
$$</p>
<p>$\alpha_j \geq 0$ および$g_j(w^{*}, b^{*}) \geq 0$であるため、次のように導出できます：</p>
<p>$$
q(\alpha) = \min_{w, b} \left( f(w) - \sum_{j = 1}^n \alpha_j g_j(w, b) \right) \leq f(w^*) - \sum_{j = 1}^n \alpha_j g_j(w^*, b^*) \leq f(w^*) \leq f(w)
$$</p>
<p>これは、双対関数が元の問題の下限を与えることを意味します。次に、$\alpha^*$を見つける必要があります。これにより：</p>
<p>$$
q(\alpha) \leq q(\alpha^*) \leq f(w^*) \leq f(w)
$$</p>
<p>SVMの元の問題と双対問題は次のように表現できます：</p>
<p>$$
\max_{\alpha} q(\alpha) = \max_{\alpha} \min_{w, b} L(w, b, \alpha)
$$</p>
<p>その制約条件は：$ \alpha_i \geq 0 $</p>
<p>弱双対性が満たされるとき、$q(\alpha^*) \leq f(w^*)$が成り立ちます。強双対性が満たされる場合、すなわちSlater条件が成立する場合、$q(\alpha^*) = f(w^*)$が成り立ちます。Slater条件は、すべての不等式制約が厳密に成立する可行解が存在することを要求します。線形サポートベクターマシンは線形可分であり、Slater条件を自動的に満たします。</p>
<p>これにより、次のようになります：</p>
<p>$$
f(w) \geq q(\alpha^*) = f(w^*) \geq q(\alpha_i)
$$</p>
<p>上記の式に基づいて、次のことがわかります：</p>
<p>$$
q(\alpha^*) \geq q(\alpha_i)
$$
$$
f(w^*) \leq f(w)
$$</p>
<p>$f(w)$は最小値を見つけ（元の問題）、$q(\alpha)$は最大値を見つけ（双対問題）、元の問題と双対問題の最適解は等しいです。すなわち：</p>
<p>$ w^*, b^* $は元の問題の解であり、$\alpha^*$は双対問題の解であり、$f(w^*) = q(\alpha^*)$です。</p>
<p>線形SVMにおいて、特定の条件（Slater条件）が満たされるとき、元の問題と双対問題の解が一致することがわかります。これは、複雑な最適化問題を解決するための有効な方法であり、特に元の問題を直接解くことが難しい場合に、双対問題を解くことで間接的に問題を解決することができます。</p>
<h3 id="簡単な例" class="heading-element"><span>簡単な例</span>
  <a href="#%e7%b0%a1%e5%8d%98%e3%81%aa%e4%be%8b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>上記の元の問題と双対問題の解が同じであることをより直感的に理解するために、簡単な最適化問題を考えます。元の問題は次のように定義されます：</p>
<p>元の問題は：
$$
\min_x f(x) = x^2
$$
制約条件は：
$$
x - 1 \geq 0
$$</p>
<p>この問題の目標は、関数$f(x) = x^2$を最小化し、同時に$x$が$x \geq 1$を満たす必要があります。直感的には、$x = 1$のとき、$f(x) = 1$であり、これは与えられた制約下での最小値です。</p>
<p>双対性を検証するために、ラグランジュ関数を構築します：</p>
<p>$$
q(\alpha) = \min_x L(x, \alpha) = \min_x (x^2 - \alpha(x - 1))
$$</p>
<p>ここで$\alpha \geq 0$はラグランジュ乗数で、元の問題の制約条件$x - 1 \geq 0$を導入するために用いられます。ラグランジュ関数を構築することで、制約付きの最適化問題を無制約の問題に変換しました。</p>
<p>次に、$L(x, \alpha)$について$x$の偏導数を求め、それを0に設定します：</p>
<p>$$
\frac{\partial L}{\partial x} = 0
2x - \alpha = 0
$$</p>
<p>解くと：</p>
<p>$$
x = \frac{\alpha}{2}
$$</p>
<p>$x = \frac{\alpha}{2}$を$q(\alpha)$に代入します：</p>
<p>$$
q(\alpha) = - \frac{\alpha^2}{4} + \alpha
$$</p>
<p>これで、双対関数$q(\alpha)$の形式を得ました。次に、双対問題の最大値$\max_{\alpha} q(\alpha) $を求める必要があります。</p>
<p>そのために、$q(\alpha)$について$\alpha$の導関数を求め、それを0に設定します：</p>
<p>$$
\frac{dq}{d\alpha} = - \frac{\alpha}{2} + 1 = 0
$$</p>
<p>解くと$$ \alpha = 2 $$</p>
<p>$\alpha = 2$を$x = \frac{\alpha}{2}$に代入すると、$$ x = 1 $$</p>
<p>このとき、$\alpha = 2$を$q(\alpha)$に代入して計算すると：</p>
<p>$$
q(\alpha) = - \frac{2^2}{4} + 2 = 1
$$</p>
<p>この簡単な例を通じて、元の問題の解$x = 1$、$f(x) = 1$と、双対問題の解$\alpha = 2$、$q(\alpha) = 1$が等価であることがわかります。これは、一定の条件が満たされる場合に、双対問題の解が元の問題の解と一致することを検証しています。</p>
<p>双対理論の応用を通じて、元の問題の解を見つけただけでなく、双対問題を解くことで同じ結果を得ることができ、双対問題の解の等価性を検証しました。</p>
<h2 id="kkt条件による解法" class="heading-element"><span>KKT条件による解法</span>
  <a href="#kkt%e6%9d%a1%e4%bb%b6%e3%81%ab%e3%82%88%e3%82%8b%e8%a7%a3%e6%b3%95" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="svmがkkt条件を満たす" class="heading-element"><span>SVMがKKT条件を満たす</span>
  <a href="#svm%e3%81%8ckkt%e6%9d%a1%e4%bb%b6%e3%82%92%e6%ba%80%e3%81%9f%e3%81%99" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>SVMの元の最適化問題は凸最適化問題です。SVMの目的関数 $\frac{1}{2}|w|^2$ は$w$に関する二次関数であり、凸関数です。同時に、制約条件 $y_i(w \cdot x_i + b) \geq 1$ は線形（アフィン制約）であり、したがって凸です。凸最適化問題では、局所最適解が全体最適解であり、KKT条件は必要かつ十分な条件です。これは、ある点がKKT条件を満たす場合、それが全体最適解であることを意味します。</p>
<p>目的関数 $\frac{1}{2}|w|^2$ は連続で微分可能であり、制約条件 $y_i(w \cdot x_i + b) \geq 1$ も連続で微分可能です。この滑らかさは、勾配の存在と一意性を保証し、KKT条件における勾配条件（すなわち$w$と$b$に関する偏導数を求めて0に設定する）が有効に適用できるようにします。</p>
<p>凸最適化問題では、KKT条件は必要条件であるだけでなく、十分条件でもあります。つまり、ある点がKKT条件を満たす場合、それは全体最適解であることを意味します。SVMにおいて、KKT条件を解くことで最適な$w^*$と$b^*$を見つけ、最適な分離超平面を決定することができます。</p>
<h3 id="kkt条件を利用した線形サポートベクターマシンの解法" class="heading-element"><span>KKT条件を利用した線形サポートベクターマシンの解法</span>
  <a href="#kkt%e6%9d%a1%e4%bb%b6%e3%82%92%e5%88%a9%e7%94%a8%e3%81%97%e3%81%9f%e7%b7%9a%e5%bd%a2%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88%e3%83%99%e3%82%af%e3%82%bf%e3%83%bc%e3%83%9e%e3%82%b7%e3%83%b3%e3%81%ae%e8%a7%a3%e6%b3%95" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>元のSVM最適化問題は、$\frac{1}{2}|w|^{2}$を最小化し、同時に制約条件$y_{i}(w\cdot x_{i}+b)\geqslant1$を満たすことです。ここで$i = 1,2,\cdots,N$です。</p>
<p>まず、ラグランジュ関数を構築します。$L(w,b,\alpha)=\frac{1}{2}|w|^{2}-\sum_{i = 1}^{N}\alpha_{i}(y_{i}(w\cdot x_{i}+b)-1)$、ここで$\alpha_{i}\geqslant0$はラグランジュ乗数です。KKT条件に基づき、次のようになります：</p>
<p>$$
\nabla_{w}L(w^*,b^*,\alpha^*) = w^*-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}=0
$$</p>
<p>$$
\nabla_{b}L(w^*,b^*,\alpha^*)=-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}=0
$$</p>
<p>$$
\alpha_{i}^*(y_{i}(w^*\cdot x_{i}+b^*)-1)=0
$$</p>
<p>$$
y_{i}(w^*\cdot x_{i}+b^*)-1\geqslant0
$$</p>
<p>$$
\alpha_{i}^*\geqslant0
$$</p>
<p>これらの条件はすべての$i = 1,2,\cdots,N$に適用されます。</p>
<p>$\nabla_{w}L(w^*,b^*,\alpha^*) = w^*-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}=0$から次のことが得られます：</p>
<p>$$
w^*=\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i} \quad \text{(5)}
$$
少なくとも1つの$\alpha_{j}^*&gt;0$が存在します（もし$\alpha_{i}^*=0$と仮定すると、式$\nabla_{w}L(w^*,b^*,\alpha^*) = w^*-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}=0$から導かれる解に矛盾が生じます）。</p>
<p>$b^*$の解法については、$w^*=\sum_{i = 1}^{N}\alpha_{i}^*y_{i}x_{i}$を$y_{j}(w^*\cdot x_{j}+b^*)-1 = 0$に代入することで求めることができます（$\alpha_{j}^*&gt;0$が存在する場合を考慮）。また、$y_{j}^{2}=1$に注意して次のように得られます：</p>
<p>$$
b^*=y_{j}-\sum_{i = 1}^{N}\alpha_{i}^*y_{i}(x_{i}\cdot x_{j}) \quad \text{(6)}
$$</p>
<p>上記の理論に基づき、分離超平面は次のように表現できます：</p>
<p>$$
\sum_{i = 1}^{N}\alpha_{i}^*y_{i}(x\cdot x_{i})+b^*=0
$$</p>
<p>したがって、分類の決定関数は次のように書くことができます：</p>
<p>$$
f(x)=\text{sign}(\sum_{i = 1}^{N}\alpha_{i}^*y_{i}(x\cdot x_{i})+b^*)
$$</p>
<p>SVMにおいて、相補的緩和条件$\alpha_i (y_i(w \cdot x_i + b) - 1) = 0$は、あるサンプル点$x_i$がサポートベクターでない場合（すなわち$y_i(w \cdot x_i + b) &gt; 1$）、対応するラグランジュ乗数$\alpha_i$がゼロでなければならないことを示しています。逆に、あるサンプル点がサポートベクターである場合（すなわち$y_i(w \cdot x_i + b) = 1$）、対応する$\alpha_i$はゼロでない可能性があります。この条件は、サポートベクターのみが最適化問題の解に寄与することを保証し、問題の解法を簡素化します。</p>
<h2 id="多項式カーネル関数とガウスカーネル関数" class="heading-element"><span>多項式カーネル関数とガウスカーネル関数</span>
  <a href="#%e5%a4%9a%e9%a0%85%e5%bc%8f%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e9%96%a2%e6%95%b0%e3%81%a8%e3%82%ac%e3%82%a6%e3%82%b9%e3%82%ab%e3%83%bc%e3%83%8d%e3%83%ab%e9%96%a2%e6%95%b0" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>既存の問題が線形に分離できない場合、既存のデータを高次元空間にマッピングし、高次元空間で線形に分離可能な問題にすることができます。しかし、高次元特徴空間で直接計算することは非常に複雑です。式（5）と式（6）からわかるように、実際にデータを高次元空間にマッピングする必要はなく、データ点間の内積を知るだけで十分です。カーネル関数の役割は、高次元特徴マッピングを明示的に行わずに、元の特徴空間でカーネル関数の値を計算することで、高次元特徴空間での内積計算を間接的に実現することです。</p>
<p>ガウスカーネル関数は一般的なカーネル関数で、その形式は次の通りです：
$$
K(x, y) = \exp\left(-\gamma |x - y|^2\right)
$$</p>
<p>ここで$\gamma$は正のパラメータで、カーネル関数の幅を制御します。</p>
<p>指数関数をテイラー展開することができます：</p>
<p>$$
\exp(z) = \sum_{k=0}^{\infty} \frac{z^k}{k!}
$$</p>
<p>$ z = -\gamma |x - y|^2 $を上記の式に代入すると、次のようになります：</p>
<p>$$
K(x, y) = \exp\left(-\gamma |x - y|^2\right) = \sum_{k=0}^{\infty} \frac{(-\gamma |x - y|^2)^k}{k!}
$$</p>
<p>多項式カーネル関数の形式は次の通りです：</p>
<p>$$
K_{\text{poly}}(x, y) = (x \cdot y + c)^d
$$</p>
<p>ここで$c$は定数項、$d$は多項式の次数です。</p>
<p>$|x - y|^2$は次のように展開できます：</p>
<p>$$
|x - y|^2 = (x - y) \cdot (x - y) = x \cdot x + y \cdot y - 2 x \cdot y
$$</p>
<p>この表現をガウスカーネル関数のテイラー展開式に代入します：</p>
<p>$$
K(x, y) = \sum_{k=0}^{\infty} \frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^k}{k!}
$$</p>
<p>各項$\frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^k}{k!}$は実際には多項式項であり、すなわち各項は$x$と$y$の異なるべき乗の組み合わせとして表現できます。</p>
<p>各項を注意深く観察すると、ガウスカーネル関数は実際には異なる次数の多項式カーネル関数を加重して得られたものであることがわかります。各項$\frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^k}{k!}$は、$k$次の多項式カーネル関数の加重形式と見なすことができます。</p>
<p>例えば、$k = 1$の場合：</p>
<p>$$
\frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^1}{1!} = -\gamma (x \cdot x + y \cdot y - 2 x \cdot y)
$$</p>
<p>$k = 2$の場合：</p>
<p>$$
\frac{(-\gamma (x \cdot x + y \cdot y - 2 x \cdot y))^2}{2!} = \frac{\gamma^2 (x \cdot x + y \cdot y - 2 x \cdot y)^2}{2}
$$</p>
<p>これらの項はすべて$x$と$y$の多項式形式であり、階乗$k!$によって加重されています。</p>
<p>ガウスカーネル関数は、無限次元で異なる次数の多項式カーネル関数を調和させて得られたものと見なすことができます。この調和により、ガウスカーネル関数は高次元特徴空間でより複雑な非線形関係を捉えることができます。したがって、多くの非線形タスクのシナリオで、ガウスカーネル関数は非常に優れた選択肢となります。</p>]]></description>
    </item>
    <item>
      <title>VLDB 2024广州之旅</title>
      <link>https://www.zair.top/ja-jp/post/trip-to-guangzhou-during-vldb2024/</link>
      <pubDate>Mon, 23 Sep 2024 11:02:06 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/trip-to-guangzhou-during-vldb2024/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/experience/">Experience</category>
      <description><![CDATA[<blockquote>
<p>VLDB 2024 はデータ管理とデータベース分野のトップ国際会議であり、データ管理、データベースアーキテクチャ、グラフデータ管理、データプライバシーとセキュリティ、データマイニング、機械学習、人工知能とデータベースシステム研究などの分野をカバーしています。今年の会議は8月26日から30日まで中国の広州で開催され、世界中の研究者と企業が集まりました。会議内容は豊富で、250以上の研究報告、11の基調講演、複数のチュートリアルとワークショップがあり、参加者に幅広い学習と交流の機会を提供しました。</p>
</blockquote>
<p>最近広州に行って、VLDB 2024に参加し、学術会議の全プロセスを体験しました。旅行中にも多くの面白いことに出会い、ブログに書いてシェアしようと思いました。
<div class="details admonition note open">
  <div class="details-summary admonition-title"><i class="icon fa-fw fa-solid fa-pencil-alt" aria-hidden="true"></i>注意<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i></div>
  <div class="details-content">
    <div class="admonition-content">この記事は<strong>旅行向けシェア</strong>であり、広州での見聞や学術会議のプロセス紹介を含み、具体的な報告内容や方向の紹介は含まれていませんので、安心してお楽しみください。</div>
  </div>
</div></p>
<p>今回の旅程は6日間で、以下のようにスケジュールされています。最初の5日間は琶洲島の広交会展館付近で、主に会議に参加したり珠江夜游を楽しんだりしました。最後の1日は特種兵のような観光で、西側は沙面島から始まり、十三行博物館を経て、聖心大教堂まで歩き、東側は黄埔軍校記念館です。
<div class="mapbox" data-options="{&#34;darkStyle&#34;:&#34;mapbox://styles/mapbox/dark-v10?optimize=true&#34;,&#34;fullscreen&#34;:true,&#34;geolocate&#34;:true,&#34;lat&#34;:23.10001,&#34;lightStyle&#34;:&#34;mapbox://styles/mapbox/streets-zh-v1&#34;,&#34;lng&#34;:113.35466,&#34;marked&#34;:true,&#34;markers&#34;:&#34;[{\&#34;lng\&#34;: 113.23979, \&#34;lat\&#34;: 23.10946, \&#34;description\&#34;: \&#34;沙面岛\&#34;},{\&#34;lng\&#34;: 113.24564, \&#34;lat\&#34;: 23.11157, \&#34;description\&#34;: \&#34;十三行博物馆\&#34;},{\&#34;lng\&#34;: 113.254735,\&#34;lat\&#34;: 23.11735, \&#34;description\&#34;: \&#34;圣心大教堂\&#34;},{\&#34;lng\&#34;: 113.317919,\&#34;lat\&#34;: 23.111565, \&#34;description\&#34;: \&#34;珠江夜游\&#34;},{\&#34;lng\&#34;: 113.419044,\&#34;lat\&#34;: 23.08878, \&#34;description\&#34;: \&#34;黄埔军校\&#34;}]&#34;,&#34;navigation&#34;:true,&#34;scale&#34;:true,&#34;zoom&#34;:11}" style="width: 100%; height: 20rem;"></div></p>
<h2 id="day-0現実充実者に小さな広州の衝撃を" class="heading-element"><span>Day 0：現実充実者に小さな広州の衝撃を</span>
  <a href="#day-0%e7%8f%be%e5%ae%9f%e5%85%85%e5%ae%9f%e8%80%85%e3%81%ab%e5%b0%8f%e3%81%95%e3%81%aa%e5%ba%83%e5%b7%9e%e3%81%ae%e8%a1%9d%e6%92%83%e3%82%92" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>午後3時、広州南駅から地下鉄で琶洲駅へ。駅を出る前に、地下鉄がコスプレイヤーでいっぱいになっていることに気づきました。運悪く、地図が保利世貿館の出口を選んでしまい、二次元の巣に突っ込んでしまいました。地下鉄の出口から会場の地下、保利世貿館から広交会展館まで、琶洲島は二次元の人々で溢れていました。参加者の数が多いだけでなく、コスプレのキャラクターも非常に豊富で、国産ゲームから日本のアニメ、牢大からトランプ暗殺まで…駐車場も痛車でいっぱいで、これらの車はほとんど電車ではなく、車の持ち主もおそらく二次元の人々でしょう。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp" alt="駐車場の痛車" srcset="https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp?size=small, https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/c156b0a801e9663247ddd67b9a9ebc95.webp?size=large 2x" data-title="駐車場の痛車" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>やっとのことでホテルにたどり着きましたが、夜の21時に食事に行ったところ、展示会がまだ終わっておらず、なんと川沿いに夜の会場が設けられていました。翌日は月曜日なのに！広州の二次元の雰囲気はやはり濃厚です。</p>
<h2 id="day-1学術バッタと晩餐のウロン" class="heading-element"><span>Day 1：学術バッタと晩餐のウロン</span>
  <a href="#day-1%e5%ad%a6%e8%a1%93%e3%83%90%e3%83%83%e3%82%bf%e3%81%a8%e6%99%a9%e9%a4%90%e3%81%ae%e3%82%a6%e3%83%ad%e3%83%b3" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>VLDB2024は香港科技大学（広州）が広州朗豪ホテルで開催しました。初日の登録は朝8時から始まり、初めて学術会議に参加する興奮から、早起きして行きました。登録時には胸章、会議手帳、スケジュール、食券、船券、記念品の箱、スポンサーの広告が渡されます。記念品にはハードカバーノート、ボールペン、傘が含まれており、黒と青の2つのテーマカラーがあります。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp" alt="登録現場" srcset="https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp?size=small, https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/7bb7269f28c393c00fe6ec24e2296522.webp?size=large 2x" data-title="登録現場" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>初日の会議内容はすべてワークショップ形式で行われました。現場では異なるテーマのワークショップが同時に行われるため、事前に興味のあるテーマを選んで参加する必要があります。私はLLM、Knowledge Graph、Vector Databaseに関するテーマを選びました。発表内容を理解するのは問題ありませんが、ディスカッションの段階になると、何人かの方が話に夢中になり、話すスピードが速くなり、理解できなくなりました。英語のリスニングとスピーキングをもっと練習しなければなりません。</p>
<div class="details admonition info">
  <div class="details-summary admonition-title"><i class="icon fa-fw fa-solid fa-circle-info" aria-hidden="true"></i>学術会議にはどのようなセッションがありますか？<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i></div>
  <div class="details-content">
    <div class="admonition-content"><h3 id="1-開幕式opening-ceremony" class="heading-element"><span>1. <strong>開幕式（Opening Ceremony）</strong></span>
  <a href="#1-%e9%96%8b%e5%b9%95%e5%bc%8fopening-ceremony" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>会議の正式な開始セッション。</li>
<li>主催者または主催機関の責任者が挨拶し、会議のテーマ、議程、および重要な参加者を紹介します。</li>
<li>特別な歓迎式典や文化展示が含まれることもあります。</li>
</ul>
<h3 id="2-基調講演keynote-speech" class="heading-element"><span>2. <strong>基調講演（Keynote Speech）</strong></span>
  <a href="#2-%e5%9f%ba%e8%aa%bf%e8%ac%9b%e6%bc%94keynote-speech" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>特定の分野の著名な学者または専門家による講演で、通常は大会のテーマに基づいて行われます。</li>
<li>基調講演は通常、啓発的であり、参加者に先見性や総括的な見解を提供します。</li>
<li>会議の中で注目されるセッションであり、時間は通常45分から1時間です。</li>
</ul>
<h3 id="3-分科会parallel-sessions" class="heading-element"><span>3. <strong>分科会（Parallel Sessions）</strong></span>
  <a href="#3-%e5%88%86%e7%a7%91%e4%bc%9aparallel-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>参加者は研究分野またはテーマに基づいてグループに分かれ、複数の会場で同時に行われます。</li>
<li>各グループ内で複数の報告があり、研究者が自分の研究成果を発表します。</li>
<li>各報告後には短い質問セッションがあり、聴衆が質問や議論を行うことができます。</li>
</ul>
<h3 id="4-ポスターセッションposter-session" class="heading-element"><span>4. <strong>ポスターセッション（Poster Session）</strong></span>
  <a href="#4-%e3%83%9d%e3%82%b9%e3%82%bf%e3%83%bc%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3poster-session" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>研究者がポスターを通じて研究成果を展示し、通常は展示エリアや休憩時間に行われます。</li>
<li>参加者は指定された時間内に自由に各ポスター展示を見学し、研究者と交流して議論することができます。</li>
<li>ポスターセッションは、比較的新しいまたは未成熟な研究プロジェクトを展示するのに適しています。</li>
</ul>
<h3 id="5-パネルディスカッションpanel-discussion" class="heading-element"><span>5. <strong>パネルディスカッション（Panel Discussion）</strong></span>
  <a href="#5-%e3%83%91%e3%83%8d%e3%83%ab%e3%83%87%e3%82%a3%e3%82%b9%e3%82%ab%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3panel-discussion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>複数の専門家が特定のテーマについて対話するディスカッショングループ。</li>
<li>各専門家が見解を発表し、その後司会者がインタラクションと議論を導き、最後に観客からの質問を受け付けます。</li>
<li>パネルディスカッションは、特定の研究問題や学術分野のホットトピックを多角的に深く探求するのに役立ちます。</li>
</ul>
<h3 id="6-円卓会議roundtable-discussion" class="heading-element"><span>6. <strong>円卓会議（Roundtable Discussion）</strong></span>
  <a href="#6-%e5%86%86%e5%8d%93%e4%bc%9a%e8%ad%b0roundtable-discussion" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>参加者が円卓形式で特定のテーマについてオープンディスカッションを行います。</li>
<li>円卓会議はインタラクションを重視し、参加者はいつでも発言し、質問を提起し、意見を共有することができます。</li>
</ul>
<h3 id="7-ワークショップworkshop" class="heading-element"><span>7. <strong>ワークショップ（Workshop）</strong></span>
  <a href="#7-%e3%83%af%e3%83%bc%e3%82%af%e3%82%b7%e3%83%a7%e3%83%83%e3%83%97workshop" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>実際の操作とインタラクティブな学習を強調するセッションで、参加者は会議で新しいスキル、方法、またはツールを学びます。</li>
<li>ワークショップは通常、事前登録が必要で、参加者が自分のデータや資料を持参する必要があることもあります。</li>
</ul>
<h3 id="8-ネットワーキングセッションnetworking-sessions" class="heading-element"><span>8. <strong>ネットワーキングセッション（Networking Sessions）</strong></span>
  <a href="#8-%e3%83%8d%e3%83%83%e3%83%88%e3%83%af%e3%83%bc%e3%82%ad%e3%83%b3%e3%82%b0%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3networking-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>会議中の社交セッションで、参加者に非公式な交流と協力関係を築くためのリラックスした環境を提供します。</li>
<li>ネットワーキングセッションには、晩餐会、ティーブレイク、ランチ、レセプションなどが含まれることがあります。</li>
</ul>
<h3 id="9-閉幕式closing-ceremony" class="heading-element"><span>9. <strong>閉幕式（Closing Ceremony）</strong></span>
  <a href="#9-%e9%96%89%e5%b9%95%e5%bc%8fclosing-ceremony" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>会議の総括と閉幕セッション。</li>
<li>主催者が会議の主要な内容と成果を振り返り、優れた報告、論文、または研究成果を表彰することがあります。</li>
<li>通常、次回の会議の日時と場所も発表されます。</li>
</ul>
<h3 id="10-質疑応答セッションqa-sessions" class="heading-element"><span>10. <strong>質疑応答セッション（Q&amp;A Sessions）</strong></span>
  <a href="#10-%e8%b3%aa%e7%96%91%e5%bf%9c%e7%ad%94%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3qa-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>各報告またはパネルディスカッションの後に続き、聴衆が質問をすることができます。</li>
<li>研究者または講演者が聴衆からの質問に詳細に答え、双方向の交流を促進します。</li>
</ul>
<h3 id="11-ブレイクアウトセッションbreakout-sessions" class="heading-element"><span>11. <strong>ブレイクアウトセッション（Breakout Sessions）</strong></span>
  <a href="#11-%e3%83%96%e3%83%ac%e3%82%a4%e3%82%af%e3%82%a2%e3%82%a6%e3%83%88%e3%82%bb%e3%83%83%e3%82%b7%e3%83%a7%e3%83%b3breakout-sessions" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>大規模な会議で、具体的なサブテーマや研究方向を議論するために、通常、参加者をいくつかの小グループに分けます。</li>
<li>各グループは特定のテーマについて集中して議論し、その後、議論の成果や提案を報告することがあります。</li>
</ul>
<h3 id="12-展示エリアexhibition-booths" class="heading-element"><span>12. <strong>展示エリア（Exhibition Booths）</strong></span>
  <a href="#12-%e5%b1%95%e7%a4%ba%e3%82%a8%e3%83%aa%e3%82%a2exhibition-booths" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>一部の学術会議、特に技術や応用分野の会議では、通常、展示エリアが設けられます。</li>
<li>関連機関、出版社、企業が展示エリアで製品、技術、サービス、または出版物を展示し、参加者は自由に見学できます。</li>
</ul>
<h3 id="13-表彰と認識awards-and-recognition" class="heading-element"><span>13. <strong>表彰と認識（Awards and Recognition）</strong></span>
  <a href="#13-%e8%a1%a8%e5%bd%b0%e3%81%a8%e8%aa%8d%e8%ad%98awards-and-recognition" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>一部の会議では、論文、報告、または研究成果の表彰セッションがあります。</li>
<li>優れた研究者、論文、ポスター展示などが閉幕式や特別な表彰式で表彰されることがあります。</li>
</ul>
<h3 id="14-ティーブレイクとランチcoffee-breaks-and-lunches" class="heading-element"><span>14. <strong>ティーブレイクとランチ（Coffee Breaks and Lunches）</strong></span>
  <a href="#14-%e3%83%86%e3%82%a3%e3%83%bc%e3%83%96%e3%83%ac%e3%82%a4%e3%82%af%e3%81%a8%e3%83%a9%e3%83%b3%e3%83%81coffee-breaks-and-lunches" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>会議中の休憩時間で、ティーやランチが提供されます。</li>
<li>ティーブレイクとランチの時間は、参加者が非公式な交流や社交を行う重要な機会でもあります。</li>
</ul>
</div>
  </div>
</div>
<p>ティーブレイクは午前10時と午後3時にあり、8時の朝食もティーブレイクの規格です。大物たちにとって、ティーブレイクはソーシャルを行う良い機会であり、研究内容を議論したり、連絡先を交換したりします。しかし、私のような学術バッタにとって、ティーブレイクは本当にただのティーブレイクです。各ティーブレイクの食べ物は多少の変化がありますが、全体的にはビスケット、パン、ケーキ、果物、飲み物の数種類です。その中で、ムースケーキとタイ風焼き魚の甘辛ソースが特に気に入りました。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp" alt="ティーブレイク" srcset="https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp?size=small, https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/2f666a1d1847796883f504015934c0fb.webp?size=large 2x" data-title="ティーブレイク" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>夜の歓迎宴会も非常に豪華で、ビュッフェ形式でした。しかし、当時は行列が多すぎて、事前にどの料理があるのか注意を払わず、最初にご飯を2杯も取ってしまい、多くの良い料理を逃しました。料理の中で中華料理は約30％を占め、残りは日本料理（寿司と刺身）、カレー、野菜サラダ、西洋菓子、果物、飲み物（赤ワインとジュース）で、異なる食事の違いに十分に配慮されています。しかし、その中の中華料理は本当に普通で、最終的には炭水化物と炭水化物の組み合わせであるカレーライスと小さなケーキになりました。嗟乎、吾其辞小蛋糕難矣。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp" alt="晩餐会場" srcset="https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp?size=small, https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/7b8be626151b7f432153424206d219e1.webp?size=large 2x" data-title="晩餐会場" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>晩餐会の間にウロンがありました。今回の会議にはもう一人の同級生と一緒に参加しましたが、私たちはまだ指導教官に会ったことがありませんでした。料理を選んで適当なテーブルに座った後、同席の他の人たちが何を話しているのかを聞き始めました。そして、私たちの間で以下のような会話がありました：「向かいの人が私たちの指導教官に似ていると思わない？」、「そんな偶然ある？」、「研究方向が合っているし、さっき彼らが言ったことが…」、「年齢が違うんじゃない？」、「人数も合っているし」、「身長も合っている」、「本当に似ている」、「まさにその通り」、「どうする、今認める？」、「ここまで来たら、まずは食事をしよう」。こうして私たちは非常に緊張しながら食事を終え、認めに行った結果、全く違う人でした。彼らはそれぞれ天津大学と華東師範大学の博士生で、研究方向が非常に似ており、相互紹介の後に友達になりました。後で彼らの論文が最優秀研究論文にノミネートされていることを知り、非常に羨ましかったです。</p>
<h2 id="day-2獅子舞開幕" class="heading-element"><span>Day 2：獅子舞、開幕！</span>
  <a href="#day-2%e7%8d%85%e5%ad%90%e8%88%9e%e9%96%8b%e5%b9%95" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>開幕式で最も印象に残ったのは、広州沙坑の獅子舞のパフォーマンスです。パフォーマンスの開始時に、舞者は獅子を操り、頭を振ったり、かゆみを掻いたり、転がったりするなど、獅子の生活習性を模倣するさまざまなリアルな動作を行いました。その中で最も特徴的なのは、獅子の目が動くことです（これが沙坑の獅子舞であると判断した理由です）。その後、獅子はステージ上で高難度のジャンプや柱を踏む動作を行い、舞者の正確な技術と強健な体力を示しました。最後に、リーダーが上がって目を入れ、獅子が祝賀の対聯をくわえて出しました。全体のパフォーマンスは、太鼓のリズムに合わせて、獅子が時に威猛で、時に軽やかで、力強さと面白さを兼ね備えていました。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp" alt="開幕式の獅子舞" srcset="https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp?size=small, https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/948640fe6fc14f716c337844f4759641.webp?size=large 2x" data-title="開幕式の獅子舞" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>これが私が初めて見た本物の獅子舞のパフォーマンスであり、最も特徴的な広東の獅子舞です。多くのゲームにも広東の獅子舞をモデルにしたシーンがありますが、特に象徴的な柱を踏む動作があるものの、これらのシーンはしばしばパフォーマンスの場面の演出に重点を置き、獅子の模倣動作による面白さが欠けており、現場のパフォーマンスほどの力強さを感じることはできません。</p>
<p>獅子舞のパフォーマンスが終わった後、会議の議長である香港科技大学の陳雷先生が会議の大まかな状況を紹介しました：今回の会議はVLDBの開催歴史上、参加者数が最も多いもので、中国本土の参加者が60％を占め、会議は最も資金が豊富で（half a million dollar）、AI関連の論文が最も多く、データベースの基礎設計の論文が最も少ないなど。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp" alt="分科会" srcset="https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp?size=small, https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/7863a1513eefcffea29210ab0fa95f58.webp?size=large 2x" data-title="分科会" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>開幕式が終わった後、1日中の分科会が正式に始まりました。分科会も事前に興味のあるテーマを選んで参加する必要があり、興味のある論文を事前に読んでおくことが望ましいです。夕食は前日と同じくらい豪華で、イタリア風の野菜スープとミルフィーユが非常に美味しかったです！（唯一）この日は焼き串もあり、手羽元と麺筋の2種類がありました。食事を終えた後、少し歩いてみると、中国人のテーブルには焼き串を取らない人はいなく、白米と焼き串を組み合わせている人もいました。やはりみんな中国の味覚を持っているようです。<del>プログラマーの焼き肉、大いに可能性があります。</del></p>
<h2 id="day-3広東料理の頂点から甲板まで" class="heading-element"><span>Day 3：広東料理の頂点から甲板まで</span>
  <a href="#day-3%e5%ba%83%e6%9d%b1%e6%96%99%e7%90%86%e3%81%ae%e9%a0%82%e7%82%b9%e3%81%8b%e3%82%89%e7%94%b2%e6%9d%bf%e3%81%be%e3%81%a7" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>朝はGoogleからの基調講演で始まり、テーマは大規模モデルがデータベース研究に与える影響についてでした。その後は前日と同じ分科会が行われました。</p>
<h3 id="広東料理の逸品" class="heading-element"><span>広東料理の逸品</span>
  <a href="#%e5%ba%83%e6%9d%b1%e6%96%99%e7%90%86%e3%81%ae%e9%80%b8%e5%93%81" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp" alt="炳勝に入る" srcset="https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp?size=small, https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/6b721b32a1014f4cccd4955ff0a9ef92.webp?size=large 2x" data-title="炳勝に入る" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>夜の宴会は<a href="http://www.bingsheng.com/intro/11.html"target="_blank" rel="external nofollow noopener noreferrer">炳勝品味海印総店<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>で行われました。途中でアメリカで留学している2人の学生に会い、彼らは中国人が主催する会議では、場面をしっかりと整える必要があると言いました。その言葉に偽りはなく、後でこの店がミシュランであり、広東料理の頂点と称されていることを知りました。この2人のうち1人はアメリカ西部に住んでおり、自分の生活が村にいるようだと評価し、食べるものも遊ぶものもないと言いました。もう1人はアメリカ東部に住んでおり、食事条件が悪く、毎日異なるスポーツを続けることができると言いました。しかし、大学院で学ぶ目的について話すと、そのうちの1人は洞察力と生涯学習の思考能力を維持するためだと言い、非常に同意しました。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp" alt="炳勝での食事" srcset="https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp?size=small, https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/d5c6b79be52e29d398dd4140b2795d1b.webp?size=large 2x" data-title="炳勝での食事" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>夕食の料理は本当に豊富でした。テーブルで携帯電話を使うのが難しかったため、記憶に頼って印象に残った料理をいくつか思い出しました：西洋人参のスペアリブスープ、丸ごと焼き乳豚（ただし目に赤い電球が詰められており、外来人としては邪能焼き乳豚と呼びたい）、ニンニク蒸しボストンロブスター、大きな海参、魚、鶏とアヒル、酢豚、甘水、トマトとメロン、サチーマとプーアル茶。全体的に悪くはありませんでした。焼き乳豚は皮がカリカリで肉が柔らかく、酢豚は酸っぱくて美味しかったです。食材の選択には広東の特色がありました。しかし、慣れないためか、広東料理の中で特色のある料理は、逆に最も食べにくかったです：甘水は本当に甘すぎて、スペアリブスープに西洋人参を入れると酸っぱくなり、ある点心はまるで月餅の皮にセロリと豚肉の餃子の生の具を包んだようで、まったく受け入れられませんでした。面白いことに、レストランではデフォルトでナイフとフォークが提供されず、何人かの外国人もやむを得ず箸を使っていましたが、特に問題はなさそうでした。</p>
<p>私たちの師門の同席にはアマゾンの研究員とアメリカのある大学のAPがいました。アマゾンの研究員は私の指導教官の前で、産業界の観点から学生には適さない話をしました。APはアメリカの大学で自分のペースで仕事をするだけで終身職を得られる緩やかな雰囲気について話しました。スペアリブスープはこの時に西洋人参で酸っぱくなったのかもしれません。</p>
<p>食事の後、全員で徒歩で埠頭に向かい、珠江夜游に参加しました。途中で名古屋大学で博士1年生の方に会い、日本での博士生活を大いに称賛しました。指導教官の放任、高い補助金、日本の売り手市場の就職環境、文化環境などです。博士課程を楽しむことができるなんて？</p>
<h3 id="珠江夜游" class="heading-element"><span>珠江夜游</span>
  <a href="#%e7%8f%a0%e6%b1%9f%e5%a4%9c%e6%b8%b8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp" alt="別の船から私たちの船を撮影" srcset="https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp?size=small, https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/fe51049529fee14e8352584425b9594b.webp?size=large 2x" data-title="別の船から私たちの船を撮影" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>夜が更けると、珠江の両岸に明かりが灯り始めました。私たちは遊覧船に乗り、輝く夜の中へとゆっくりと進みました。両岸の高層ビルは灯りが輝き、波のきらめきに映えて、まるで星が碧波に落ちたかのようでした。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp" alt="珠江夜游の外景" srcset="https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp?size=small, https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/42a46c5b4e60a2c6e14297ffdbca41b3.webp?size=large 2x" data-title="珠江夜游の外景" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>沿道には象徴的な建物があり、広州塔はそびえ立ち、変幻自在の光影が夢のように幻想的でした。珠江新城の摩天楼群は輝きを放ち、現代都市のスカイラインを描いていました。船が海珠橋を通過する際、橋上の車の流れは絶え間なく、橋下の遊覧船が行き交い、賑やかな光景が広がっていました。</p>
<p>微風が頬を撫で、江水が船の側面を軽く叩いていました。甲板の下からは民俗音楽が聞こえ、この夜の色に心地よい雰囲気を添えていました。観光客たちは欄干に寄りかかって遠くを眺めたり、杯を傾けて語り合ったりしながら、この魅力的な夜の色に酔いしれていました。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp" alt="珠江夜游の内景" srcset="https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp?size=small, https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/aef20be076fa4c7b76f3db07bf93f331.webp?size=large 2x" data-title="珠江夜游の内景" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>2時間の航程はあっという間に過ぎ去りました。旅全体を振り返ると、繁華な都市と悠久の歴史がこの母なる川で完璧に融合し、忘れられないものとなりました。</p>
<h3 id="新しいナンパ" class="heading-element"><span>新しいナンパ</span>
  <a href="#%e6%96%b0%e3%81%97%e3%81%84%e3%83%8a%e3%83%b3%e3%83%91" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>同行の同級生と一緒に三層の船首で風景を楽しんでいると、外国人がやって来ました。彼はリュックを背負い、汗だくで、少し慌ただしい様子でした。彼はこの船にWIFIがあるかどうか、パスワードを知っているかどうかを尋ね、家族と連絡を取りたいと言いました。それから私たちはそれがないことに気づき、彼にホットスポットを提供することを提案しました。接続が成功した後、私たちはまた、海外のソーシャルメディアはほとんどが壁の外にあるため、この老兄が広州に来た後、ずっとWifiを探していたが、ずっと壁に阻まれていたのではないかと考えました。彼の立場から考えると、遠くて神秘的な東洋にいる人々が、どのWifiもファイアウォールを突破できず、家族と3日間連絡が取れず、他の人にホットスポットを開いてもらおうとしても、誰も「共有」してくれないというのは、本当に可哀想です。それで私たちは、魔法の猫の能力を局域ネットワークで共有しようとしましたが、コンピュータでは簡単なことでも、携帯電話では最終的に成功しませんでした。</p>
<p>しかし、私たちはすぐにこの老兄が社交的な牛であることに気づきました。道中、彼は話題を見つけるのに必死でした：「ICBCは何の略ですか？『猎德』は何を意味しますか？あなたたちはどこから来ましたか？あのロゴは何ですか」…そして私たちと一緒に写真を撮りまくりました。</p>
<p>こうして話しながら、夜游に異なる楽しみを加えました。</p>
<p>後にwhovaで、この老兄が活躍度ランキングで2位であり、ドイツのある大学に勤務しており、会社も持っていることを知りました。これは家族と連絡が取れず、ネットを探し回るような様子ではありませんでした。</p>
<h2 id="day-4無料収集" class="heading-element"><span>Day 4：無料収集</span>
  <a href="#day-4%e7%84%a1%e6%96%99%e5%8f%8e%e9%9b%86" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>VLDB2024の期間中、Google、Meta、アリババ、バイトダンスなどのスポンサー企業のブースがあり、ブースでアンケートに記入すると、無料で何かをもらえます。アンケートは主に研究方向と就職の傾向を調査するもので、名刺を直接受け取ることもあります。すべての無料品の中で、私が最も気に入ったのはGoogleの白いシャツと下の写真のペンギンです。<del>このペンギンがどの会社のものか知らない場合、上に正規の防偽ステッカーが貼られているのを見れば、それがテンセントのものであることがわかります。</del></p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp" alt="テンセントのペンギン無料品" srcset="https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp?size=small, https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/e5cd97b0da922baad80e38f0e27d53eb.webp?size=large 2x" data-title="テンセントのペンギン無料品" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>午後の報告は私に多くのインスピレーションを与えてくれました。ある作業は一見簡単で、単なる素朴なアイデアに過ぎないように見えますが、深く研究することで、完全な論文に仕上げることができ、感心しました。印象に残ったのは、コーネル大学の独り狼の老兄が、同じ報告会で自分で独立して完成させた2つの作業を連続して報告したことです。彼はマイクを手に持ち、片手をポケットに入れ、両腕を講台に支え、PPTはシンプルな大文字スタイルを採用していました（1枚のPPTに30文字を超えるものはありませんでした）。完全に報告を講演として行っていました。これが大物かもしれません、すでに完全に次のレベルです。</p>
<p>この日で私たちのすべての会議日程が終了し、ホテルを出るときに非常に極端な雷雨の天気に遭遇し、大雨が降りました。</p>
<h2 id="day-5半日で中国の500年を歩く" class="heading-element"><span>Day 5：半日で中国の500年を歩く</span>
  <a href="#day-5%e5%8d%8a%e6%97%a5%e3%81%a7%e4%b8%ad%e5%9b%bd%e3%81%ae500%e5%b9%b4%e3%82%92%e6%ad%a9%e3%81%8f" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>「来たからには」という原則に基づき、広州での最後の日に特種兵式の密集したスケジュールを組みました。この日、私は広州のいくつかの有名な観光地を巡り、この都市の豊かな歴史と文化の底力を感じました。
朝早く、まず異国情緒あふれる沙面島に行きました。このかつての租界地を散策し、欧風建築と熱帯植物が調和して、まるで過去にタイムスリップしたかのようでした。ある場所の風景が十分に美しいかどうかを判断する基準は、そこに結婚写真を撮る人がいるかどうかです。南京の浦口駅、緑博園、中山陵がそうであるように、広州の沙面島もそうです。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp" alt="沙面島の風景" srcset="https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp?size=small, https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/c9fd66a828e28a4b12b992f6ded1012e.webp?size=large 2x" data-title="沙面島の風景" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>沙面島で午前中を過ごし、昼に隣の十三行博物館に歩いて行き、広州が海上シルクロードの重要な港としての輝かしい歴史を深く理解しました。博物館に展示されている文物と写真は、広州が17世紀から商業的に繁栄していた様子から、19世紀の半植民地の景観までを生き生きと示しています。ここで知ったのは、広州が強制的に開港された後、各国の商館は現在の広州塔の対岸の市中心の沿江位置に設置されていましたが、後に火災が発生し、沙面島に移転したことです。</p>
<p>午後には聖心大教堂に行きました。これは規模の大きなゴシック建築で、小紅書で必ず訪れるべきスポットとして推奨されています。結果的に、実際には打卡スポットでしかなく、ほとんどの時間は開放されていません。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp" alt="聖心大教堂の風景" srcset="https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp?size=small, https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/d87b6cdd619cecaec340f8a6504a178c.webp?size=large 2x" data-title="聖心大教堂の風景" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>午後には黄埔軍校旧址を見学しました。この無数の革命先烈を育てた場所を歩き、その情熱に燃えた時代を感じたいと思いました。事前に下調べをしていなかったため、想像していたものとは少し違い、多少の失望がありました。黄埔軍校の原址は抗日戦争時に日本軍によって爆撃されて灰燼に帰したため、現在の観光地はできる限り再現されたものです。整然とした再現された建物を見ていると、「夫子廟」の既視感があり、景区にいるとしか感じられませんでした。しばらく探しても、門には「昇官発財請往他処、貪生怕死勿入斯門」という対聯が見つかりませんでした。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp" alt="黄埔軍校旧址の風景" srcset="https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp?size=small, https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/be63cdc9e66d411f0a863944e4a1bb3c.webp?size=large 2x" data-title="黄埔軍校旧址の風景" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>夜が更けると、再び珠江のほとりに行き、川沿いを散歩しました。夜の広州は、地平線と天際線、小蛮腰と大劇院があり、何度見ても飽きません。海珠大橋から猎德大橋まで、同じ珠江でありながら、17世紀から21世紀まで、各世紀の景観がこんなにも異なることに驚きました。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp" alt="珠江の夜景" srcset="https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp?size=small, https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp?size=medium 1.5x, https://cdn1.zair.top/images/2024/09/6499961344854ffce2524a9d20d4be76.webp?size=large 2x" data-title="珠江の夜景" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>この広州での数日間は、まるで古今を行き来する旅のようでした。琶洲の学術殿堂から珠江両岸の灯火輝く夜景まで、沙面島の異国情緒から黄埔軍校の革命遺跡まで。この都市は独自の方法で、学術、文化、歴史、現代性を完璧に融合させています。高層ビルの影の下には、都市村の生活感があり、橋の下にはホームレスの姿があり、この都市が進化と包容の過程にあることを思い出させます。しかし、これらの光景は広州の魅力を削ぐことなく、むしろこの都市をよりリアルで、人情味あふれるものにしています。</p>
<p>さようなら、広州。</p>
<div class="bilibili">
  <iframe src="//player.bilibili.com/player.html?bvid=BV1AP1GYfEBS&page=1&autoplay=false&poster=true&muted=false&danmaku=true&t=0" border="0" framespacing="0" allowfullscreen="true"></iframe>
</div>]]></description>
    </item>
    <item>
      <title>データ枯渇危機：AI発展が直面するデータボトルネックと対策</title>
      <link>https://www.zair.top/ja-jp/post/data-exhaustion-crisis/</link>
      <pubDate>Wed, 21 Aug 2024 15:05:44 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/data-exhaustion-crisis/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/llm/">Llm</category>
      <description><![CDATA[<blockquote>
<p>我们估计人类产生的的公共文本存量约为 300 万亿个token。如果趋势持续，语言模型将在 2026 年至 2032 年之间完全耗尽这一存量，或者如果过度训练，甚至会更早。 ——Epoch AI</p>
</blockquote>
<p>2006年、当時イリノイ大学の教授であった李飛飛（現スタンフォード大学教授）は、インターネットが人工知能（AI）研究を変える可能性を見出しました。言語学の研究では、8万の「名詞同義語セット」、つまり同じ種類の物を表す同義語の集合が特定されていました。李飛飛は、インターネット上の数十億枚の画像に、これらの同義語セットの無数の実例が含まれているに違いないと推測しました。これらの画像を十分に集めることができれば、これまでのAIトレーニング資源を超える巨大なデータベースを作成できると考えました。彼女は「多くの人がモデルに注目していますが、私たちはデータに注目すべきです」と述べ、ImageNetプロジェクトが誕生しました。</p>
<p>インターネットは画像だけでなく、画像のラベル付けのためのリソースも提供しました。検索エンジンで猫、犬、椅子などの画像を見つけた後、AmazonのクラウドソーシングプラットフォームMechanical Turkの人々がこれらの画像を手動でチェックし、ラベル付けしました。最終的に、数百万の検証済み画像を含むデータベースが構築されました。ImageNetデータの一部を使用してトレーニングされたAlexNetが2012年に「ディープラーニング」の巨大な可能性を示し、前回のAIサイクルを開始し、大量のラベル付けデータに依存する業界を生み出しました。</p>
<h2 id="データ駆動のai時代" class="heading-element"><span>1 データ駆動のAI時代</span>
  <a href="#%e3%83%87%e3%83%bc%e3%82%bf%e9%a7%86%e5%8b%95%e3%81%aeai%e6%99%82%e4%bb%a3" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>このAIサイクルでは、AIの発展が大規模言語モデル（LLM）にまで拡大し、これらのモデルのトレーニングもインターネットデータに依存していますが、その方法は異なります。コンピュータビジョン分野（CV）の古典的なトレーニングタスクは、画像の内容を予測すること（画像分類タスク）ですが、LLMのトレーニングの古典的なタスクは、文脈に基づいてテキストの中で削除された単語を予測することです。</p>
<p>このトレーニング方法は、手動でラベル付けされたデータを必要とせず、システムが単語を空け、自動的に推論し、「自己監督トレーニング」を通じて答えの正確性を評価できます。しかし、この方法には大量のデータが必要です。<strong>一般的に、モデルが得るテキストが多ければ多いほど、データ量が大きければ大きいほど、その性能は向上します（スケーリング則）。</strong> インターネットは数十億のテキストを提供し、LLMにとっては、現代の産業にとって精製可能な燃料のような貴重な資源です。</p>
<p>一般的なトレーニングデータのソースはCommon Crawlで、500億のウェブページを含むインターネットアーカイブです。AIモデルの発展に伴い、Books3のような数千冊の書籍を含むデータベースなど、より多くのデータが追加されました。しかし、AIのテキストデータ需要の増加に伴い、インターネット上の高品質なデータ供給は徐々に限界に達しています。Epoch AIの推定によれば、2028年までにインターネット上の高品質なテキストデータは完全に使い果たされ、業界は「データウォール」と呼ばれる問題に直面します。中国語インターネットはさらに深刻で、「中国語インターネットが崩壊している」と言われ、各プラットフォームが次々と門を閉ざし、データの価値に気づいた後、それを金庫に入れました。この壁をどう乗り越えるかは、AIの将来の発展において最も難しい問題の一つであり、進行を遅らせる可能性が最も高い問題でもあります。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png" alt="AIデータウォール現象" srcset="https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png?size=small, https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F08%2Fd834acebf20bd29c720550594dac4481.png?size=large 2x" data-title="AIデータウォール現象" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="データ所有権と著作権の問題" class="heading-element"><span>2 データ所有権と著作権の問題</span>
  <a href="#%e3%83%87%e3%83%bc%e3%82%bf%e6%89%80%e6%9c%89%e6%a8%a9%e3%81%a8%e8%91%97%e4%bd%9c%e6%a8%a9%e3%81%ae%e5%95%8f%e9%a1%8c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>AIモデルはますますインターネットデータに依存していますが、データの著作権問題も議論を呼んでいます。多くの大規模言語モデルのトレーニングに使用されるデータは、著作権者の同意を得ずに使用されることが多く、一部のAI企業は有料のコンテンツも利用しています。AI企業はこの使用が著作権法の「フェアユース」に該当すると主張しますが、著作権者は納得していません。Getty Imagesは画像生成企業Stability AIを訴え、その画像ライブラリを無断で使用したと主張しました。ニューヨークタイムズはOpenAIとMicrosoftを訴え、数百万の記事の著作権を侵害したと主張しました。Stack Overflow、Reddit、X（旧Twitter）は現在、AI企業に料金を請求しています。知乎もビングやグーグルなどのクローラーを妨害するために乱数を使用し、その中国語コンテンツがAIトレーニングのデータセットとして使用されるのを制限しています。</p>
<p>地域によってこの問題に対する態度は異なります。日本とイスラエルはAI産業の発展を促進するために寛容な立場を取っています。EUには共通の「フェアユース」概念がなく、より厳しいかもしれません。国内でも国家データ局が設立され、データが生産資料と生産対象の両方の役割を持つことが明確にされています。</p>
<h2 id="現在のデータ使用戦略" class="heading-element"><span>3 現在のデータ使用戦略</span>
  <a href="#%e7%8f%be%e5%9c%a8%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e4%bd%bf%e7%94%a8%e6%88%a6%e7%95%a5" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>データウォールに直面して、AI分野ではいくつかの対策が提案されています。その中の重要な対策の一つは、<strong>データの量ではなく質に焦点を当てること</strong>です。各AIラボはもはやインターネット全体のデータを盲目的に使用してモデルをトレーニングするのではなく、データのフィルタリング、クリーニング、最適化により重点を置き、モデルが最も価値のあるコンテンツを抽出できるようにしています。過去1年（2024年）で、OpenAIのモデルはもはや「圧倒的なリード」を示していないようで、各社のモデルが互角に戦っており、これらのモデルの異なるタスクでの性能の違いは、トレーニングデータの構築に由来しています。結局のところ、オープンソースのアルゴリズムやモデルは多いですが、オープンソースのデータセットはほとんどありません。</p>
<p>「現実世界の情報」を取得することは非常に重要であり、特にモデルが大量の推論を含む場合、学術教科書などの権威あるリソースが非常に貴重になります。しかし、<strong>異なるデータソース間で最適なバランスを見つけること</strong>は依然として難しい課題です。</p>
<p>データの使用過程で、モデルは「破滅的な忘却」の問題にも直面します。これは、システムが特定のタイプのデータで過度にトレーニングされると、その分野で得意になる一方で、以前学んだ他の知識を忘れてしまう可能性があるという問題です。そのため、<strong>トレーニング時のデータの順序</strong>も慎重に考慮する必要があります。特定のテーマ（例えば数学）に関するすべてのデータをトレーニングプロセスの最後に集中させると、モデルは数学の問題で優れたパフォーマンスを発揮するかもしれませんが、同時に他の分野の能力が弱まる可能性があります。この不均衡なトレーニング方法は、破滅的な忘却のリスクを高めます。</p>
<p>データが異なる分野だけでなく、異なる形式（モダリティ）も含む場合、これらの戦略はさらに複雑になります。新しいテキストデータが供給不足になる中、OpenAIのGPT-4やGoogleのGeminiのような先進的なモデルは、自己監督学習の過程でテキストだけでなく、画像、ビデオ、音声も使用してトレーニングされています。しかし、ビデオデータは特に厄介です。ビデオファイルには非常に密度の高いデータポイントが含まれているためです。問題を簡略化するために、現行のモデルは通常、部分的なフレームを抽出して簡略化処理を行っており、学界はより効率的な解決策を模索しています。</p>
<h2 id="合成データとaiの自己トレーニング" class="heading-element"><span>4 合成データとAIの自己トレーニング</span>
  <a href="#%e5%90%88%e6%88%90%e3%83%87%e3%83%bc%e3%82%bf%e3%81%a8ai%e3%81%ae%e8%87%aa%e5%b7%b1%e3%83%88%e3%83%ac%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>モデルの能力は、自己監督学習で生成されたバージョン（事前トレーニングバージョン）を基に、追加のデータを使用して微細に調整することで向上させることができます（<strong>微調整</strong>）。例えば、「監督微調整」は、人間が収集または作成した質問応答ペアをモデルに提供し、良い答えとは何かを教える方法です。別の方法「<strong>人間のフィードバックに基づく強化学習</strong>」（RLHF）は、モデルに答えが質問者を満足させるかどうかを伝える方法です。</p>
<p>RLHFでは、ユーザーがモデルの出力の品質にフィードバックを行い、そのフィードバックがモデルのパラメータ（重み）を調整するために使用されます。チャットボットとのユーザーインタラクション、例えばいいねやバッドを押すことは、RLHFに特に有用です。これが「データフライホイール」のメカニズムです：より多くのユーザーがより多くのデータをもたらし、そのデータが逆により良いモデルを最適化します。AI企業は、ユーザーがそのモデルに提出するさまざまな質問を注意深く監視し、それに応じてデータを収集してモデルを調整し、これらのテーマをカバーします。アリババ、バイトダンス、Minimaxなどの企業は、モデルの価格競争を繰り広げており、この側面を考慮していないとは言えません。</p>
<p>インターネット上の事前トレーニングデータが徐々に枯渇する中、後期トレーニング（ポストトレーニング）の重要性がますます高まっています。Scale AIやSurge AIのようなラベル付け会社は、後期トレーニングデータを収集することで毎年数億ドルを稼いでいます。Scaleは最近、140億ドルの評価額で10億ドルを調達しました。今日のラベル付け作業は、Mechanical Turkの時代を超えています：トップのラベル付け者は1時間あたり最大100ドルを稼ぐことができます。後期トレーニングはより良いモデルを生成し、多くの商業アプリケーションのニーズを満たすのに役立ちますが、これは依然として増分改善であり、根本的な解決策ではありません。</p>
<p>データウォールを徐々に突破する以外に、完全にそれを飛び越える解決策もあります。それは、機械<strong>生成の合成データ</strong>を使用することです。DeepMind（Googleの子会社）が発表したAlphaGo Zeroモデルはその良い例です。同社の最初の成功した囲碁モデルは、数百万のアマチュア試合のデータでトレーニングされましたが、AlphaGo Zeroは既存のデータを全く使用しませんでした。代わりに、3日間で490万回自分と対局することで囲碁を学び、成功した戦略を記録しました。この「強化学習」は、対戦相手の手に対して多くの可能な応答をシミュレートし、成功の可能性が最も高い戦略を選択する方法を教えました。</p>
<p>同様の方法はLLMにも適用できます。例えば、現在最強のオープンソース大規模モデルLlama 3.1です。LLama3.1のSFTデータには、モデル生成の合成データが相当な割合を占めており、Gemma2のSFT段階のデータも大規模なモデルによって合成されたものが多く、合成データの品質が手動ラベル付けの品質に劣らないことを証明しています。</p>
<p>では、無限に合成データを生成し、左足で右足を踏んで天に登ることができるのでしょうか？私は答えは否定的だと思います。先月『Nature』に発表された研究は、モデルトレーニングで合成データを「乱用」することが「不可逆的な欠陥」を引き起こす可能性があることを発見しました。モデル合成のデータを使用してモデルを微調整する場合、数回繰り返すだけでモデルは意味不明なことを言い始め、この現象を「モデル崩壊」と呼びます。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png" alt="Nature当期カバー：Garbage in, Garbage out." srcset="https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png?size=small, https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F08%2F105aac035a19fd4f52f02f6d7aa0c11c.png?size=large 2x" data-title="Nature当期カバー：Garbage in, Garbage out." style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>より大きな問題は、この方法を医療や教育などの垂直分野にどのように拡張するかです。ゲームでは、勝利の定義が明確であり、特定の行動が有利かどうかのデータを収集するのが容易です。他の分野では、これがはるかに複雑です。「良い」決定に関するデータは通常、専門家から収集されますが、これは高価で時間がかかり、解決策も包括的ではありません。ある専門家が正しいかどうかを判断する方法も、また別の問題です。</p>
<h2 id="まとめ" class="heading-element"><span>5 まとめ</span>
  <a href="#%e3%81%be%e3%81%a8%e3%82%81" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>より多くのデータを取得することは、AIの急速な進歩を維持するための鍵です。専門家のソースから取得した専門データであれ、機械生成の合成データであれ、AIの進歩はデータの継続的な供給に依存しています。最も容易に取得できるデータの蓄えが徐々に枯渇する中、AI業界はこの問題を緩和するために多くの努力をしています：</p>
<ul>
<li>データ品質を強調し、データクリーニングを行う</li>
<li>数学、論理、コードデータの比率を増やし、トレーニング順序を調整する</li>
<li>合成データを使用して実データを補完する</li>
</ul>
<p>しかし、これらは持続可能ではないように見え、新しいデータソースを見つけるか、持続可能な代替案を開発する必要があります。または、アルゴリズムアーキテクチャの観点から、データに依存しない新しいアーキテクチャを設計し、次のAIサイクルを開始する必要があります。</p>
<h2 id="推薦読書" class="heading-element"><span>6 推薦読書</span>
  <a href="#%e6%8e%a8%e8%96%a6%e8%aa%ad%e6%9b%b8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://web.archive.org/web/20240523001943/https:/mp.weixin.qq.com/s/afg3zHPpEyRzSfOR1Aeh3w"target="_blank" rel="external nofollow noopener noreferrer">中文互联网正在加速崩塌 | 何加盐<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://epochai.org/blog/will-we-run-out-of-data-limits-of-llm-scaling-based-on-human-generated-data"target="_blank" rel="external nofollow noopener noreferrer">Will We Run Out of Data? Limits of LLM Scaling Based on Human-Generated Data | EpochAI<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://blog.csdn.net/weixin_41446370/article/details/140030906"target="_blank" rel="external nofollow noopener noreferrer">知乎正通过乱码来干扰必应/谷歌等爬虫 | CSDN<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://wallstreetcn.com/articles/3723705"target="_blank" rel="external nofollow noopener noreferrer">人工智能的训练数据正在枯竭，合成数据引发巨大争议 | 华尔街见闻<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://developer.volcengine.com/articles/7396884852433551379"target="_blank" rel="external nofollow noopener noreferrer">浅谈Llama3.1，从结构、训练过程、影响到数据合成 | 火山社区<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://www.nature.com/articles/s41586-024-07566-y"target="_blank" rel="external nofollow noopener noreferrer">AI models collapse when trained on recursively generated data | Nature<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>]]></description>
    </item>
    <item>
      <title>微調GPT-4o-mini生成ブログ記事</title>
      <link>https://www.zair.top/ja-jp/post/fine-tuning-gpt-4o-mini/</link>
      <pubDate>Wed, 24 Jul 2024 15:05:44 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/fine-tuning-gpt-4o-mini/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/llm/">Llm</category>
      <description><![CDATA[<p>7月18日にリリースされた新モデルGPT-4o-miniは、GPT-3.5を超え、GPT-4に近い性能を持ち、価格はGPT-3.5の半分で、応答速度も全シリーズモデルの中で最速です。OpenAIは本日、GPT-4o-miniの微調インターフェースを正式に公開し、2024年9月23日まで、毎日2Mトークンの無料クレジットがあります。</p>
<p><del>Llama 3.1 405Bを使えないわけではなく、GPT-4o-miniの方がコストパフォーマンスが良いのです。</del></p>
<h2 id="微調適用シーン" class="heading-element"><span>1 微調適用シーン</span>
  <a href="#%e5%be%ae%e8%aa%bf%e9%81%a9%e7%94%a8%e3%82%b7%e3%83%bc%e3%83%b3" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>一般的な簡単なタスクには、プロンプト（Prompting）を作成するだけでモデルがうまく完了できます。タスクが比較的複雑な場合、思考チェーン（Chain of Thought）を使用して複雑なタスクを複数のステップに分解し、段階的に推論することができます。しかし、高精度と一貫性のある出力が必要なタスクには、微調（Fine-tuning）が必要です。</p>
<p>以下の表は、これら三つの方法の利点と欠点、および応用シーンを比較したものです。</p>
<table>
  <thead>
      <tr>
          <th>方法</th>
          <th>利点</th>
          <th>欠点</th>
          <th>応用シーン</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>微調</td>
          <td>高品質な結果を提供</td>
          <td>データの準備とトレーニングに多くの時間とリソースが必要</td>
          <td>安定、信頼性、高品質な出力が必要</td>
      </tr>
      <tr>
          <td></td>
          <td>複雑なタスクや特定の分野のカスタマイズに適用</td>
          <td>フィードバックループが遅く、トレーニングコストが高い</td>
          <td>特定のタスクや分野でのモデル性能の改善</td>
      </tr>
      <tr>
          <td></td>
          <td>トークンを節約し、遅延を減らす</td>
          <td>深層学習の基礎知識が必要</td>
          <td>タスクに高精度または独特のスタイル、トーン、フォーマットが必要な場合</td>
      </tr>
      <tr>
          <td>プロンプト</td>
          <td>迅速な反復とテスト</td>
          <td>プロンプトの設計品質に依存</td>
          <td>一般的なタスクの迅速なプロトタイプとテスト</td>
      </tr>
      <tr>
          <td></td>
          <td>初期探索と一般的なタスクに適している</td>
          <td>複雑なタスクには不十分な場合がある</td>
          <td>モデル出力を柔軟に調整する必要がある場合</td>
      </tr>
      <tr>
          <td></td>
          <td>追加のデータ準備やトレーニングリソースが不要</td>
          <td></td>
          <td>多くの例と複雑なロジックのタスクには不適</td>
      </tr>
      <tr>
          <td>思考チェーン</td>
          <td>ステップごとのロジックと推論を提供</td>
          <td>プロンプトの複雑さと長さを増加させる</td>
          <td>推論とロジックステップが必要なタスクを処理</td>
      </tr>
      <tr>
          <td></td>
          <td>複雑なタスクの性能を改善</td>
          <td>トークン使用量と遅延を増加させる</td>
          <td>多ステップの問題解決が関与するシーン</td>
      </tr>
      <tr>
          <td></td>
          <td>多様な戦略とツールを組み合わせやすい</td>
          <td>非常に複雑なタスクには依然として不十分な場合がある</td>
          <td>明確なロジックフローとステップ実行が必要な場合</td>
      </tr>
  </tbody>
</table>
<p>NFL定理は、どの方法もすべてのシーンに適用できるわけではないと教えてくれます。ここでも同様に、微調が他の二つの方法よりも優れているとは限りません。しかし、<strong>微調は「説明しにくいタスク」に適用される</strong>ことは明らかです。例えば、あるスタイルやトーンなどです。さらに、これら三つの方法は互いに排他的ではなく、微調モデルに精巧に設計されたプロンプトを使用し、さらには思考チェーンを組み合わせることで、より良い結果を達成できるかもしれません。</p>
<p>単に記事や段落を書く場合は、プロンプトで十分です。しかし、ブログ記事を書く場合、SEOを考慮すると、コアキーワードの出現頻度など、多くの詳細があります。これらの詳細を大モデルがすべて理解できるとは限らず、ユーザーとしてもプロンプトでうまく説明できるとは限りません。したがって、このようなブログ記事を書くには微調を使用できます。</p>
<h2 id="データ準備" class="heading-element"><span>2 データ準備</span>
  <a href="#%e3%83%87%e3%83%bc%e3%82%bf%e6%ba%96%e5%82%99" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>データは<code>jsonl</code>形式で組織する必要があります。各行は1つのjsonです。例：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv is a factual chatbot that is also sarcastic.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;What&#39;s the capital of France?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Paris, as if everyone doesn&#39;t know that already.&#34;</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv is a factual chatbot that is also sarcastic.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Who wrote &#39;Romeo and Juliet&#39;?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Oh, just some guy named William Shakespeare. Ever heard of him?&#34;</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv is a factual chatbot that is also sarcastic.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;How far is the Moon from Earth?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Around 384,400 kilometers. Give or take a few, like that really matters.&#34;</span><span class="p">}]}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>また、複数の対話で重みを設定することもできます。weightを0に設定すると、モデルがそのような回答を避けます。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv is a factual chatbot that is also sarcastic.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;What&#39;s the capital of France?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Paris&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Can you be more sarcastic?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Paris, as if everyone doesn&#39;t know that already.&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv is a factual chatbot that is also sarcastic.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Who wrote &#39;Romeo and Juliet&#39;?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;William Shakespeare&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Can you be more sarcastic?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Oh, just some guy named William Shakespeare. Ever heard of him?&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]}</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span><span class="nt">&#34;messages&#34;</span><span class="p">:</span> <span class="p">[{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Marv is a factual chatbot that is also sarcastic.&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;How far is the Moon from Earth?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;384,400 kilometers&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Can you be more sarcastic?&#34;</span><span class="p">},</span> <span class="p">{</span><span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;assistant&#34;</span><span class="p">,</span> <span class="nt">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Around 384,400 kilometers. Give or take a few, like that really matters.&#34;</span><span class="p">,</span> <span class="nt">&#34;weight&#34;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}]}</span></span></span></code></pre></td></tr></table>
</div>
</div><p>もちろん、データ処理は最も時間がかかるため、ここでは<a href="https://github.com/Ryaang/industry-article-dataset/blob/main/all_filter_2120.jsonl"target="_blank" rel="external nofollow noopener noreferrer">私が作成したデータセット<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>を直接使用することもできます。このデータセットは大モデルの微調に使用され、<a href="https://reads.alibaba.com/"target="_blank" rel="external nofollow noopener noreferrer">reads.alibaba.com<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>サイトの13の分類分野から3000以上のページをクロールしたもので、処理済みデータだけでなく、元データやクローラーコードもオープンソース化されています。</p>
<p>準備したデータをアップロードし、返されたファイルIDを記録します。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">files</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">file</span><span class="o">=</span><span class="nb">open</span><span class="p">(</span><span class="s2">&#34;all_filter_2120.jsonl&#34;</span><span class="p">,</span> <span class="s2">&#34;rb&#34;</span><span class="p">),</span>
</span></span><span class="line"><span class="cl">  <span class="n">purpose</span><span class="o">=</span><span class="s2">&#34;fine-tune&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="微調モデル" class="heading-element"><span>3 微調モデル</span>
  <a href="#%e5%be%ae%e8%aa%bf%e3%83%a2%e3%83%87%e3%83%ab" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>データを準備し、誤りがないことを確認し、トークンコストを確認した後、微調タスクを作成できます。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">training_file</span><span class="o">=</span><span class="s2">&#34;file-zWptPbsD37ZnemssjpsK6CnF&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">  <span class="n">model</span><span class="o">=</span><span class="s2">&#34;gpt-4o-mini&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>このステップの詳細なパラメータ設定については、<a href="https://platform.openai.com/docs/api-reference/fine-tuning/create"target="_blank" rel="external nofollow noopener noreferrer">公式APIドキュメント<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>を参照してください。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png" alt="OpenAI 微調UI" srcset="https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png?size=small, https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F07%2F3e3c8d91530a4be8e7ca7d3d96ad3cae.png?size=large 2x" data-title="OpenAI 微調UI" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>上記の2ステップも<a href="https://platform.openai.com/finetune"target="_blank" rel="external nofollow noopener noreferrer">UIインターフェース<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>で迅速に完了でき、タスクを提出した後、UIインターフェースで進捗と損失の変化をリアルタイムで確認できます。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png" alt="OpenAI 微調過程ログ" srcset="https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png?size=small, https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F07%2F853e4147b0c7e82527a646eb60b612b5.png?size=large 2x" data-title="OpenAI 微調過程ログ" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="モデル呼び出し" class="heading-element"><span>4 モデル呼び出し</span>
  <a href="#%e3%83%a2%e3%83%87%e3%83%ab%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%97" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>以下のコードで微調タスクの状態を確認し、作業が成功した後、<code>fine_tuned_model</code>フィールドにモデルの名前が入力されます。この名前を記録して呼び出しを行います。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 微調タスクリストを確認</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">list</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 微調タスクの詳細を確認</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">retrieve</span><span class="p">(</span><span class="s2">&#34;ftjob-gvP0VB7RlWcF3QHdQrEVf49Y&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># タスクをキャンセル</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">cancel</span><span class="p">(</span><span class="s2">&#34;ftjob-gvP0VB7RlWcF3QHdQrEVf49Y&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># タスクのログを確認</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">fine_tuning</span><span class="o">.</span><span class="n">jobs</span><span class="o">.</span><span class="n">list_events</span><span class="p">(</span><span class="n">fine_tuning_job_id</span><span class="o">=</span><span class="s2">&#34;ftjob-gvP0VB7RlWcF3QHdQrEVf49Y&#34;</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 微調モデルを削除</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="s2">&#34;ft:gpt-3.5-turbo:acemeco:suffix:abc123&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>呼び出し方法は公式のモデルと同じで、モデル名を1つ変更するだけで済みます。例えば：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">openai</span> <span class="kn">import</span> <span class="n">OpenAI</span>
</span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">OpenAI</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">completion</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">chat</span><span class="o">.</span><span class="n">completions</span><span class="o">.</span><span class="n">create</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">  <span class="n">model</span><span class="o">=</span><span class="s2">&#34;ft:gpt-4o-mini-2024-07-18:personal:0724:9oMH6S7A&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="n">messages</span><span class="o">=</span><span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="s2">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;system&#34;</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">:</span> <span class="s2">&#34;Please write an SEO article of no less than 800 words based on the title I gave you, including at least 4 subtitles by HTML format. Do not include the &lt;h1&gt; , &lt;body&gt; tag.  Do not include the &lt;html&gt; tag in the start and end of the content. Directly start with the content.&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="s2">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;user&#34;</span><span class="p">,</span> <span class="s2">&#34;content&#34;</span><span class="p">:</span> <span class="sa">f</span><span class="s2">&#34;title:</span><span class="si">{</span><span class="n">task</span><span class="o">.</span><span class="n">title</span><span class="si">}</span><span class="s2">,core keyword:</span><span class="si">{</span><span class="n">task</span><span class="o">.</span><span class="n">coreKeywords</span><span class="si">}</span><span class="s2">,related keyword:</span><span class="si">{</span><span class="n">task</span><span class="o">.</span><span class="n">relatedKeywords</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">completion</span><span class="o">.</span><span class="n">choices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">message</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="評価結果" class="heading-element"><span>5 評価結果</span>
  <a href="#%e8%a9%95%e4%be%a1%e7%b5%90%e6%9e%9c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>トレーニング中に参考にできる指標が2つあり、それぞれ損失値とトークン正確率です。公式の説明は以下の通りです：</p>
<blockquote>
<p>検証損失と検証トークン正確率は、2つの異なる方法で計算されます。各ステップ中の小バッチデータで計算され、各エポックの終わりに全体の検証セットで計算されます。全体の検証損失と全体の検証トークン正確率の指標は、モデルの全体的な性能を追跡する最も正確な指標です。これらの統計は、トレーニングが順調に進んでいることを確認するための合理的なチェックを提供します（損失は減少し、トークン正確率は増加するはずです）。</p>
</blockquote>
<p>しかし、指標はあくまで参考であり、実際の効果は自分で評価する必要があります。微調後のモデルは少なくとも以下の改善があります：</p>
<ul>
<li>記事の長さが20%増加</li>
<li>記事の構造がトレーニングデータにより近くなる</li>
<li>フォーマットエラー（例えばmarkdownフォーマット、CSSの追加など）が発生しなくなる</li>
</ul>
<p>「What is the Difference Between a Mural and a Mosaic?」という題で生成された記事は以下の通りです：</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png" alt="評価結果" srcset="https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png?size=small, https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F07%2F4821854ba99cf201f9b8795df70d0d9d.png?size=large 2x" data-title="評価結果" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="参考記事" class="heading-element"><span>6 参考記事</span>
  <a href="#%e5%8f%82%e8%80%83%e8%a8%98%e4%ba%8b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ul>
<li><a href="https://platform.openai.com/docs/guides/fine-tuning"target="_blank" rel="external nofollow noopener noreferrer">https://platform.openai.com/docs/guides/fine-tuning<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ul>]]></description>
    </item>
    <item>
      <title>AIエージェントの4つの設計パターン：汎用人工知能への必須の道</title>
      <link>https://www.zair.top/ja-jp/post/ai-agent-design-pattern/</link>
      <pubDate>Wed, 22 May 2024 18:00:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/ai-agent-design-pattern/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/llm/">Llm</category>
      <description><![CDATA[<h2 id="ai-agent智能体四类设计模式通用人工智能必经之路" class="heading-element"><span>AI Agent智能体四类设计模式：通用人工智能必经之路</span>
  <a href="#ai-agent%e6%99%ba%e8%83%bd%e4%bd%93%e5%9b%9b%e7%b1%bb%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e9%80%9a%e7%94%a8%e4%ba%ba%e5%b7%a5%e6%99%ba%e8%83%bd%e5%bf%85%e7%bb%8f%e4%b9%8b%e8%b7%af" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>もしAIを使ってタスクを完了することを作文に例えるならば、非エージェント（Agent）の方法はAIに最初から最後まで一度で書き上げさせ、修正を許さないものであり、Agentの方法はAIに何度も修正を許し、その過程でツールを利用したり、外部と協力したりすることを可能にします。2024年において、Agentは通用人工智能（AGI）を実現する道の一つと見なされています。</p>
<p>基礎モデルは生成型人工知能の発展を推進し、AI Agentがユーザーのタスクを自動的に完了するのを助けています。この1年間で、さまざまなAgentが次々と登場しています。Andrew Ngの紅杉AIサミットでの講演に触発され、この記事では過去1年以内に発表された論文やLangchainなどのエンジニアリングブログを組み合わせて、既存のAgentを整理し、設計パラダイムをまとめ、基礎モデルに基づくインテリジェントエージェントの設計に役立てることを目指しています。</p>
<p>以下の表に示す16のモードを初歩的に整理することができます：</p>
<table>
  <thead>
      <tr>
          <th>モード</th>
          <th>概要</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Passive goal creator</td>
          <td>対話インターフェースを通じてユーザーの明確なヒントを分析し、インタラクティブ性、目標追跡、直感性を維持します。</td>
      </tr>
      <tr>
          <td>Proactive goal creator</td>
          <td>人間のインタラクションを理解し、コンテキストをキャプチャすることでユーザーの目標を予見し、インタラクティブ性、目標追跡、アクセス性を強化します。</td>
      </tr>
      <tr>
          <td>Prompt/response optimiser</td>
          <td>予想される入力または出力の内容と形式に基づいてプロンプト/レスポンスを最適化し、標準化、応答の正確性、相互運用性、適応性を提供します。</td>
      </tr>
      <tr>
          <td>Retrieval augmented generation</td>
          <td>ローカル基礎モデルエージェントシステムを使用してデータプライバシーを保ちながら、エージェントの知識更新能力を強化します。</td>
      </tr>
      <tr>
          <td>One-shot model querying</td>
          <td>単一のインスタンスで基礎モデルにアクセスして計画に必要なすべてのステップを生成し、コスト効率とプロセスの簡素化を向上させます。</td>
      </tr>
      <tr>
          <td>Incremental model querying</td>
          <td>計画生成プロセスの各ステップで基礎モデルにアクセスし、補足コンテキストを提供し、応答の正確性と説明性を向上させます。</td>
      </tr>
      <tr>
          <td>Single-path plan generator</td>
          <td>ユーザーの目標を達成するための中間ステップを調整し、推論の確実性、一貫性、効率を向上させます。</td>
      </tr>
      <tr>
          <td>Multi-path plan generator</td>
          <td>ユーザーの目標を達成する各ステップで複数の選択肢を作成することを許可し、推論の確実性、一貫性、人間の好みの整合性と包括性を強化します。</td>
      </tr>
      <tr>
          <td>Self-reflection</td>
          <td>エージェントが計画と推論プロセスに対するフィードバックを生成し、自己改善の指針を提供することで、推論の確実性、説明性、継続的改善、効率を向上させます。</td>
      </tr>
      <tr>
          <td>Cross-reflection</td>
          <td>異なるエージェントまたは基礎モデルを使用してフィードバックを提供し、生成された計画と推論プロセスを改善し、推論の確実性、説明性、相互運用性、包括性、拡張性、継続的改善を向上させます。</td>
      </tr>
      <tr>
          <td>Human reflection</td>
          <td>人間のフィードバックを収集して計画と推論プロセスを改善し、人間の好みに効果的に整合し、争議性、有効性、公平性、継続的改善を向上させます。</td>
      </tr>
      <tr>
          <td>Voting-based cooperation</td>
          <td>エージェントが自由に意見を表明し、投票を通じて合意に達することで、多様性、効果的な分業、フォールトトレランスを向上させます。</td>
      </tr>
      <tr>
          <td>Role-based cooperation</td>
          <td>異なる役割を割り当て、エージェントの役割に基づいて最終的な意思決定を行い、意思決定の確実性、分業、フォールトトレランス、拡張性、責任性を向上させます。</td>
      </tr>
      <tr>
          <td>Debate-based cooperation</td>
          <td>エージェントが議論を通じてフィードバックを提供し受け取り、合意に達するまで考えや行動を調整することで、意思決定の確実性、適応性、説明性、応答の正確性、批判的思考を向上させます。</td>
      </tr>
      <tr>
          <td>Multimodal guardrails</td>
          <td>基礎モデルの入力と出力を制御し、ユーザーの要求、倫理基準、法律規制などの特定の要件を満たすことで、堅牢性、安全性、標準整合性、適応性を強化します。</td>
      </tr>
      <tr>
          <td>Tool/agent registry</td>
          <td>異なるエージェントとツールを選択するための統一かつ便利なソースを維持し、発見性、効率、ツールの適用性を向上させます。</td>
      </tr>
  </tbody>
</table>
<p>これらの16のモードは、Andrew Ngが紅杉AIサミットでの講演で提案した4つのパラダイムにまとめることができます：</p>
<ul>
<li>Reflection</li>
<li>Tool Use</li>
<li>Planning</li>
<li>Multiagent Collaboration</li>
</ul>
<h2 id="reflection" class="heading-element"><span>1 Reflection</span>
  <a href="#reflection" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="basic-reflection" class="heading-element"><span>1.1 Basic Reflection</span>
  <a href="#basic-reflection" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>LLM Agent構築の背景において、反思（Reflection）は、LLMに過去のステップ（およびツール/環境からの潜在的な観察）を観察させ、選択した行動の質を評価するプロセスを指します。これらのフィードバックは、再計画、検索、評価などの下流タスクに使用されます。以下の図は基本的な反思モードの一例です。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png" alt="Basic Reflection" srcset="https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F88d05b24ee82d9bead9a2b0c6c2b2724.png?size=large 2x" data-title="Basic Reflection" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Basic Reflection</p>
<h3 id="reflexion-actor" class="heading-element"><span>1.2 Reflexion Actor</span>
  <a href="#reflexion-actor" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Shinnらによって提案されたReflexionは、言語フィードバックと自己反思を通じて学習するアーキテクチャです。このエージェントはタスクの結果を評価し、より高品質な最終結果を生成しますが、実行時間が長くなります。主に以下の3つの構成要素を含みます：</p>
<ol>
<li>Actor (agent) with self-reflection  自己反思を行うワーカー</li>
<li>External evaluator (task-specific, e.g. code compilation steps)  外部評価者（特定タスク、例：コードコンパイルステップ）</li>
<li>Episodic memory that stores the reflections from (1).  （1）からの反思を保存するエピソード記憶</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png" alt="Reflexion Actor" srcset="https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png?size=small, https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2Fa33408400ae8ecf30cbbf598cf709e2f.png?size=large 2x" data-title="Reflexion Actor" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Reflexion Actor</p>
<h3 id="lats" class="heading-element"><span>1.3 LATS</span>
  <a href="#lats" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>言語エージェントツリー検索（LATS）は、Zhouらによって提案された一般的なLLM Agent検索アルゴリズムで、反思/評価と検索（特にモンテカルロツリー検索）を組み合わせ、ReACT、Reflexion、Tree of Thoughtsなどの類似技術と比較して、全体的なタスクパフォーマンスを向上させます。</p>
<p>主に以下の4つのステップがあります：</p>
<ol>
<li>
<p>Select: pick the best next actions based on the aggregate rewards from step (2). Either respond (if a solution is found or the max search depth is reached) or continue searching.</p>
<p>選択：ステップ（2）からの総報酬に基づいて最適な次のアクションを選択します。解決策が見つかった場合または最大検索深度に達した場合は応答し、そうでない場合は検索を続けます。</p>
</li>
<li>
<p>Expand and simulate: select the &ldquo;best&rdquo; 5 potential actions to take and execute them in parallel.</p>
<p>拡張とシミュレーション：選択した「最適な」5つの候補アクションを並行して実行します。</p>
</li>
<li>
<p>Reflect + Evaluate: observe the outcomes of these actions and score the decisions based on reflection (and possibly external feedback)</p>
<p>反思 + 評価：これらのアクションの結果を観察し、反思（および可能な外部フィードバック）に基づいて決定を評価します。</p>
</li>
<li>
<p>Backpropagate: update the scores of the root trajectories based on the outcomes.</p>
<p>逆伝播：結果に基づいてルート軌道のスコアを更新します。</p>
</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png" alt="LATS" srcset="https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F64ac3101a548d42fd1ede6715e99d143.png?size=large 2x" data-title="LATS" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>LATS</p>
<h2 id="tool-use" class="heading-element"><span>2 Tool Use</span>
  <a href="#tool-use" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>ツールを呼び出し、関数の形式で使用します。</p>
<h2 id="planning" class="heading-element"><span>3 Planning</span>
  <a href="#planning" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="react" class="heading-element"><span>3.1 ReAct</span>
  <a href="#react" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>ReActは推論と行動を組み合わせることでエージェントの能力を強化します。ReActメソッドは、情報を受け取った後に即座に反応することをエージェントに許可し、すべての情報が処理されるのを待つのではなく、推論と行動の緊密な結合を重視します。エージェントは入力情報を分析し理解するだけでなく、分析結果に基づいて適切な行動を取る必要があります。この方法の利点は、その柔軟性と環境適応性にあります。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png" alt="ReActフレームワーク" srcset="https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F3627afc055f30f3c275fadaf2ec38080.png?size=large 2x" data-title="ReActフレームワーク" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>ReActフレームワーク</p>
<h3 id="plan-and-execute" class="heading-element"><span>3.2 Plan and Execute</span>
  <a href="#plan-and-execute" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Plan and Executeの核心思想は、まず多段階の計画を立て、その計画を項目ごとに実行することです。特定のタスクを完了した後、計画を再検討し、適切な修正を行うことができます。</p>
<p>これは典型的なReActスタイルのエージェントと比較して、後者は一度に一歩を考えるものです。この「計画と実行」スタイルの利点は：</p>
<ol>
<li>明確な長期計画（非常に強力なLLMでも難しい）</li>
<li>実行ステップでより小さな/弱いモデルを使用し、計画ステップでより大きな/優れたモデルを使用できる</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png" alt="Plan-and-Execute" srcset="https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png?size=small, https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2Ffacdd82299104208c2110cff4a41ce81.png?size=large 2x" data-title="Plan-and-Execute" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p><strong>Plan-and-Execute</strong></p>
<h3 id="rewoo" class="heading-element"><span>3.3 ReWOO</span>
  <a href="#rewoo" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>ReWOOでは、Xuらは多段階のプランナーと変数置換を組み合わせたエージェントを提案し、効果的なツール使用を実現します。以下の点でReACTスタイルのエージェントアーキテクチャを改善します：</p>
<ol>
<li>使用する完全なツールチェーンを一度に生成することで、トークン消費と実行時間を削減します。（ReACTスタイルのエージェントアーキテクチャは多くのLLM呼び出しを必要とし、システムプロンプトと前のステップが各推論ステップでLLMに提供されるため冗長なプレフィックスがあります）</li>
<li>微調整プロセスを簡素化します。計画データはツールの出力に依存しないため、理論的にはツールを実際に呼び出さなくてもモデルを微調整できます</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png" alt="Reasoning without Observation" srcset="https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F63e39cb8db866a5a4a1db4e9970f9413.png?size=large 2x" data-title="Reasoning without Observation" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p><strong>Reasoning without Observation</strong></p>
<h3 id="llmcompiler" class="heading-element"><span>3.4 LLMCompiler</span>
  <a href="#llmcompiler" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>LLMCompilerは、DAGでタスクを突撃実行することでエージェントタスクの実行を加速するエージェントアーキテクチャです。また、LLMの呼び出し回数を減らすことで冗長なトークン使用のコストを節約します。主に以下の3つの部分を含みます：</p>
<ol>
<li>
<p>Planner: stream a DAG of tasks.</p>
<p>プランナー：タスクの有向非巡回グラフをストリーム処理します。</p>
</li>
<li>
<p>Task Fetching Unit: schedules and executes the tasks as soon as they are executable</p>
<p>タスク取得ユニット：タスクが実行可能になるとすぐにスケジュールし実行します</p>
</li>
<li>
<p>Joiner: Responds to the user or triggers a second plan</p>
<p>ジョイナー：ユーザーに応答するか、2番目の計画をトリガーします</p>
</li>
</ol>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png" alt="LLMCompiler" srcset="https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F593ce5e78b3d68b79abffb49fe0a137d.png?size=large 2x" data-title="LLMCompiler" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>LLMCompiler</p>
<h2 id="multiagent-collaboration" class="heading-element"><span>4 Multiagent collaboration</span>
  <a href="#multiagent-collaboration" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="supervison" class="heading-element"><span>4.1 Supervison</span>
  <a href="#supervison" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>監督者を通じて、複数のエージェントを管理し協力します。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png" alt="監督方式" srcset="https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F8d55fa6833db17b2e1970198230f1373.png?size=large 2x" data-title="監督方式" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>監督方式</p>
<h3 id="hierarchical-teams" class="heading-element"><span>4.2 <strong>Hierarchical Teams</strong></span>
  <a href="#hierarchical-teams" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>階層的、段階的にエージェントを組織し、複雑で作業量の多いタスクを完了します。AutoGenはこの方法の典型的な例です。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png" alt="階層チーム方式" srcset="https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F77c3c444633cb7c024fbc0ac23b8f690.png?size=large 2x" data-title="階層チーム方式" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>階層チーム方式</p>
<h3 id="collaboration" class="heading-element"><span>4.3 <strong>Collaboration</strong></span>
  <a href="#collaboration" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>単一のエージェントが使用できるツールの能力には限界があり、複数のエージェントが協力してより多くの種類のツールを使用する必要があります。「分治法」の考え方を使用し、各エージェントを特定の問題を処理する「専門家」にし、彼らが協力するようにします。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png" alt="基本的な多エージェント協力" srcset="https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png?size=small, https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2Fd16b1684829ffde358e49d51b5d0e8c0.png?size=large 2x" data-title="基本的な多エージェント協力" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>基本的な多エージェント協力</p>
<h2 id="评估" class="heading-element"><span>5 评估</span>
  <a href="#%e8%af%84%e4%bc%b0" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>最も直接的な考え方は、エージェントを「仮想ユーザー」として使用して評価を行うことです。多くのタスク結果が量的に評価できないタスクは、この方法を使用せざるを得ないかもしれません。しかし、明確な指標があるタスク（分類、回帰）については、直接ツールを使用して評価を行うことができるかもしれません。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png" alt="Agent-based Evaluation" srcset="https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F558f46c4a3d4c8ed5bd4d6f0d06837ac.png?size=large 2x" data-title="Agent-based Evaluation" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>Agent-based Evaluation</p>
<h2 id="agiの其它方式" class="heading-element"><span>6 AGIの其它方式</span>
  <a href="#agi%e3%81%ae%e5%85%b6%e5%ae%83%e6%96%b9%e5%bc%8f" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>エージェントはAGIの実現において有望な方法の一つですが、唯一の方法ではありません。エージェント方式自体はRAGやユーザー参加などの方法と有機的に組み合わせることができます。例えば、以下のShiらはエージェントと検索を組み合わせる方法を用いて、大規模モデルでオリンピックプログラミング問題を解決しました。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png" alt="Untitled" srcset="https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png?size=small, https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png?size=medium 1.5x, https://cdn1.zair.top/images/2024%2F05%2F787708ee6ea3b818eda88ca3ac7504f2.png?size=large 2x" data-title="Untitled" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<h2 id="推荐阅读" class="heading-element"><span>7 推荐阅读</span>
  <a href="#%e6%8e%a8%e8%8d%90%e9%98%85%e8%af%bb" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><a href="https://github.com/AGI-Edgerunners/LLM-Agents-Papers?tab=readme-ov-file"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/AGI-Edgerunners/LLM-Agents-Papers<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p><a href="https://github.com/zjunlp/LLMAgentPapers"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/zjunlp/LLMAgentPapers<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p><a href="https://www.cnblogs.com/bonelee/p/18153432"target="_blank" rel="external nofollow noopener noreferrer">AI agent智能体任务分解和调度的几篇经典文章 - bonelee - 博客园 (cnblogs.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p><a href="https://zhuanlan.zhihu.com/p/691370751"target="_blank" rel="external nofollow noopener noreferrer">Agent四大范式 | CRITIC：吴恩达力推Agent设计范式 - 知乎 (zhihu.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<h2 id="参考" class="heading-element"><span>8 参考</span>
  <a href="#%e5%8f%82%e8%80%83" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li>Kim, Sehoon, Suhong Moon, Ryan Tabrizi, Nicholas Lee, Michael W. Mahoney, Kurt Keutzer, and Amir Gholami. “An LLM Compiler for Parallel Function Calling.” arXiv, February 6, 2024. <a href="https://doi.org/10.48550/arXiv.2312.04511"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2312.04511<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Liu, Yue, Sin Kit Lo, Qinghua Lu, Liming Zhu, Dehai Zhao, Xiwei Xu, Stefan Harrer, and Jon Whittle. “Agent Design Pattern Catalogue: A Collection of Architectural Patterns for Foundation Model Based Agents.” arXiv, May 16, 2024. <a href="https://doi.org/10.48550/arXiv.2405.10467"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2405.10467<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Shi, Quan, Michael Tang, Karthik Narasimhan, and Shunyu Yao. “Can Language Models Solve Olympiad Programming?” arXiv, April 16, 2024. <a href="https://doi.org/10.48550/arXiv.2404.10952"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2404.10952<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Shinn, Noah, Federico Cassano, Edward Berman, Ashwin Gopinath, Karthik Narasimhan, and Shunyu Yao. “Reflexion: Language Agents with Verbal Reinforcement Learning.” arXiv, October 10, 2023. <a href="https://doi.org/10.48550/arXiv.2303.11366"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2303.11366<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Wang, Lei, Wanyu Xu, Yihuai Lan, Zhiqiang Hu, Yunshi Lan, Roy Ka-Wei Lee, and Ee-Peng Lim. “Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models.” arXiv, May 26, 2023. <a href="https://doi.org/10.48550/arXiv.2305.04091"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2305.04091<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Xu, Binfeng, Zhiyuan Peng, Bowen Lei, Subhabrata Mukherjee, Yuchen Liu, and Dongkuan Xu. “ReWOO: Decoupling Reasoning from Observations for Efficient Augmented Language Models.” arXiv, May 22, 2023. <a href="https://doi.org/10.48550/arXiv.2305.18323"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2305.18323<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Yao, Shunyu, Jeffrey Zhao, Dian Yu, Nan Du, Izhak Shafran, Karthik Narasimhan, and Yuan Cao. “ReAct: Synergizing Reasoning and Acting in Language Models.” arXiv, March 9, 2023. <a href="https://doi.org/10.48550/arXiv.2210.03629"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2210.03629<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>“Yoheinakajima/Babyagi.” Accessed May 21, 2024. <a href="https://github.com/yoheinakajima/babyagi/tree/main"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/yoheinakajima/babyagi/tree/main<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>“LangGraph tutorials.” Accessed May 21, 2024.  <a href="https://langchain-ai.github.io/langgraph/tutorials/"target="_blank" rel="external nofollow noopener noreferrer">https://langchain-ai.github.io/langgraph/tutorials/<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li>Zhou, Andy, Kai Yan, Michal Shlapentokh-Rothman, Haohan Wang, and Yu-Xiong Wang. “Language Agent Tree Search Unifies Reasoning Acting and Planning in Language Models.” arXiv, December 5, 2023. <a href="https://doi.org/10.48550/arXiv.2310.04406"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2310.04406<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
<li>Zhou, Pei, Jay Pujara, Xiang Ren, Xinyun Chen, Heng-Tze Cheng, Quoc V. Le, Ed H. Chi, Denny Zhou, Swaroop Mishra, and Huaixiu Steven Zheng. “Self-Discover: Large Language Models Self-Compose Reasoning Structures.” arXiv, February 5, 2024. <a href="https://doi.org/10.48550/arXiv.2402.03620"target="_blank" rel="external nofollow noopener noreferrer">https://doi.org/10.48550/arXiv.2402.03620<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>.</li>
</ol>
]]></description>
    </item>
    <item>
      <title>ベクトルデータベース比較：Weaviate、Milvus、Qdrant</title>
      <link>https://www.zair.top/ja-jp/post/vector-database-compare/</link>
      <pubDate>Tue, 02 Apr 2024 15:44:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/vector-database-compare/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/llm/">Llm</category>
      <description><![CDATA[<p>RAGシステムの成功は、大量の情報を効率的に取得し処理する能力に大きく依存しています。ベクトルデータベースはその中で不可欠な役割を果たし、RAGシステムのコアを構成しています。ベクトルデータベースは、高次元ベクトルデータを保存および管理するために特化されており、テキスト、画像、音声、さらにはビデオをベクトルに変換して保存することができます（この点については後述します）。RAGシステムが最終的に実現できる効果は、これらの基盤となるベクトルデータベースのパフォーマンスに依存しています。</p>
<p>多くのベクトルデータベースとベクトルライブラリの中で、それぞれが独自の特徴を持っており、自分のアプリケーションシナリオに適したものを選ぶには評価が必要です。本稿では、RAGにベクトルデータベースを選択する際に考慮すべき重要な要素について深く掘り下げます。これには、オープンソースの可用性、CRUD（作成、読み取り、更新、削除）サポート、分散アーキテクチャ、レプリカサポート、スケーラビリティ、パフォーマンス、継続的なメンテナンスなどの6つの側面が含まれます。</p>
<p>現在、Weaviate、Milvus、Qdrant、Vespa、Pineconeのようなベクトル専用に設計されたデータベースが業界で非常に注目されています。それに加えて、誕生が早いベクトルライブラリもこの機能を持っています。本文では、FAISS、HNSWLib、ANNOYのようなベクトルライブラリ、およびpgvectorやSupabaseなどのベクトル機能をサポートするSQLデータベースも比較します。</p>
<div align="center"><img src="https://cdn1.zair.top/images/2024/04/30c04fed7d88adea8257c73eadc85b1e.png" alt="利用Milvus实现的图片语义搜索" style="width: 50%;"></div>
Milvusを利用した画像セマンティック検索
<h2 id="ベクトルライブラリfaisshnswlibannoy" class="heading-element"><span>1 ベクトルライブラリ（FAISS、HNSWLib、ANNOY）</span>
  <a href="#%e3%83%99%e3%82%af%e3%83%88%e3%83%ab%e3%83%a9%e3%82%a4%e3%83%96%e3%83%a9%e3%83%aafaisshnswlibannoy" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>ベクトルデータベースとベクトルライブラリの違いは、ベクトルライブラリが主に静的データの保存に使用される点です。これらのライブラリでは、インデックスデータは不変です。これは、ベクトルライブラリがベクトル埋め込みのみを保存し、<strong>これらのベクトル埋め込みを生成する関連オブジェクトを保存しない</strong>ためです。したがって、ベクトルデータベースとは異なり、ベクトルライブラリはCRUD（作成、読み取り、更新、削除）操作をサポートしていません。これは、FAISSやANNOYのようなベクトルライブラリで既存のインデックスに新しいドキュメントを追加するのが難しい可能性があることを意味します。HNSWLibはこの例外であり、CRUD機能を持ち、同時読み書き操作を独自にサポートしています。しかし、それもベクトルライブラリとしての制限を逃れることはできず、デプロイメントエコシステム、インスタンスのレプリケーション能力、およびフォールトトレランスを提供しません。</p>
<h2 id="全文検索データベースelasticsearchopensearch" class="heading-element"><span>2 全文検索データベース（ElasticSearch、OpenSearch）</span>
  <a href="#%e5%85%a8%e6%96%87%e6%a4%9c%e7%b4%a2%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9elasticsearchopensearch" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>全文検索データベース（例えばElasticSearchやOpenSearch）は、比較的包括的なテキスト検索と高度な分析機能をサポートしています。しかし、ベクトル類似性検索を実行し高次元データを処理する際には、専用のベクトルデータベースに比べて強力ではありません。これらのデータベースは、主にインバーテッドインデックスに依存しており、ベクトルインデックスではないため、セマンティック検索を実現するためには他のツールと組み合わせて使用する必要があります。Qdrantのテスト結果によると、ElasticsearchはWeaviate、Milvus、Qdrantなどのベクトルデータベースと比較してパフォーマンスが劣っています。</p>
<h2 id="ベクトルをサポートするsqlデータベースpgvectorsupabasestarrocks" class="heading-element"><span>3 ベクトルをサポートするSQLデータベース（pgvector、Supabase、StarRocks）</span>
  <a href="#%e3%83%99%e3%82%af%e3%83%88%e3%83%ab%e3%82%92%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88%e3%81%99%e3%82%8bsql%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9pgvectorsupabasestarrocks" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>pgvectorのようなSQLデータベースは、ベクトルサポート拡張を通じて、ベクトルデータを既存のデータストレージシステムに統合する方法を提供しますが、専用のベクトルデータベースと比較して、いくつかの明らかな欠点もあります。</p>
<p>最も明らかな欠点は、従来のSQLデータベースのリレーショナルモデルと非構造化ベクトルデータの本質との間に不一致があることです。この不一致は、ベクトル類似性検索を含む操作の効率を低下させ、この種のデータベースは大量のベクトルデータを処理する際のパフォーマンスが理想的ではありません。詳細は<a href="https://github.com/erikbern/ann-benchmarks"target="_blank" rel="external nofollow noopener noreferrer">ANNテスト<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>を参照してください。さらに、pgvectorがサポートするベクトル次元の上限（2000次元）は、Weaviateのような専用ベクトルデータベースと比較して低く、後者は最大65535次元のベクトルデータを処理できます。スケーラビリティと効率の面で、専用ベクトルデータベースはより優れています。ベクトルをサポートするSQLデータベース拡張、例えばpgvectorは、ベクトルデータ量が少ない（10万ベクトル未満）で、ベクトルデータがアプリケーションの補完機能としてのみ使用されるシナリオに適しています。逆に、ベクトルデータがアプリケーションのコアである場合や、スケーラビリティに高い要求がある場合、専用ベクトルデータベースがより適した選択となります。</p>
<p>StarRocksについては、SQLフレームワーク上で動作する別のシステムであり、オンライン分析処理（OLAP）およびオンライントランザクション処理（OLTP）シナリオに最適化されていますが、ベクトル類似性検索に特化して最適化されているわけではありません。</p>
<h2 id="ベクトルをサポートするnosqlデータベースredismongodb" class="heading-element"><span>4 ベクトルをサポートするNoSQLデータベース（Redis、MongoDB）</span>
  <a href="#%e3%83%99%e3%82%af%e3%83%88%e3%83%ab%e3%82%92%e3%82%b5%e3%83%9d%e3%83%bc%e3%83%88%e3%81%99%e3%82%8bnosql%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9redismongodb" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>NoSQLデータベースに新たに追加されたベクトルサポート機能はまだ初期段階にあり、十分なテスト検証を経ていません。Redisベクトル類似性検索（VSS）を例にとると、この機能は2022年4月に公開され、まだ2年未満です。Redis VSSは多機能データベースとしてサービスを提供できますが、ベクトル類似性検索に最適化された設計ではありません。</p>
<h2 id="専用ベクトルデータベースpineconemilvusweaviateqdrantvaldchromavespavearch" class="heading-element"><span>5 専用ベクトルデータベース（Pinecone、Milvus、Weaviate、Qdrant、Vald、Chroma、Vespa、Vearch）</span>
  <a href="#%e5%b0%82%e7%94%a8%e3%83%99%e3%82%af%e3%83%88%e3%83%ab%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9pineconemilvusweaviateqdrantvaldchromavespavearch" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>専用ベクトルデータベースは、ドット積、コサイン類似度など、さまざまなベクトル演算をネイティブにサポートしています。これらのデータベースは高次元データを処理するために設計されており、大量のクエリ要求に対応し、ベクトル間の類似性検索を迅速に完了することができます。これらの目標を達成するために、通常は近似最近傍（ANN）アルゴリズムに基づいた多様なインデックス戦略を採用しています。これらのアルゴリズムは、効率、ストレージスペースの占有、および検索の正確性の間でトレードオフを必要とします。たとえば、FLATインデックスは、最適化や近似技術を使用しないベクトルインデックスであり、100％のリコール率と精度を実現できますが、他のタイプのベクトルインデックスよりも遅く、効率が低いです。相対的に、IVF_FLATインデックスは、いくつかの精度を犠牲にして、より高速な検索速度を実現します。HNSWインデックスは、精度と検索速度の間で妥協案を提供します。</p>
<p>Pineconeは、プロフェッショナルチームによって維持されるクローズドソースのベクトルデータベースであり、無料版ではスケーラビリティの面で限られた機能を提供しています。Chromaは音声データ専用に設計されたシステムですが、テキストデータの処理に特別な最適化は行われていません。他の主流のベクトルデータベースと比較して、Chromaの総合的なパフォーマンスベンチマークの資料は比較的少ないです。Chromaは0.4バージョンでSQLiteをドキュメントストレージ方式として採用しているため、スケーラビリティと効率の面で、他のベクトルデータ専用に設計されたストレージソリューションに劣る可能性があります。</p>
<p>VearchとValdは、Langchainとの統合において不足しており、開発の使用にとって非常に不利です。Milvusなどの競合他社と比較して、開発者コミュニティの規模が小さく、オープンソースコミュニティのメンテナンスも活発ではありません。</p>
<p>したがって、RAGにとって、Weaviate、Milvus、Qdrant、Vespaは最良の選択肢かもしれません。理論的には、パフォーマンスとスケーラビリティのベンチマークテスト（下記のANNベンチマークを参照）に基づいて最適なシステムを選択する必要があります。しかし、システム設計や機能の特徴も比較する必要があります。以下の表は、これらの側面から視覚的に比較しています。</p>
<table>
  <thead>
      <tr>
          <th>データベース</th>
          <th>Qdrant</th>
          <th>Weaviate</th>
          <th>Milvus</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>オープンソースで自ホスティング可能</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>オープンソースライセンス</td>
          <td>Apache-2.0</td>
          <td>BSD</td>
          <td>Apache-2.0</td>
      </tr>
      <tr>
          <td>開発言語</td>
          <td>Rust</td>
          <td>Go</td>
          <td>Go, C++</td>
      </tr>
      <tr>
          <td>Github Stars</td>
          <td>17k</td>
          <td>9.2k</td>
          <td>26.2k</td>
      </tr>
      <tr>
          <td>初回リリース日</td>
          <td>2021</td>
          <td>2019</td>
          <td>2019</td>
      </tr>
      <tr>
          <td>SDK</td>
          <td>Python, JS, Go, Java, .Net, Rust</td>
          <td>Python, JS, Java, Go</td>
          <td>Python, Java, JS, Go</td>
      </tr>
      <tr>
          <td>クラウドサービス</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>内蔵テキスト埋め込み</td>
          <td><a href="https://qdrant.github.io/fastembed/examples/Supported_Models/">✅FastEmbed</a></td>
          <td>✅</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>ハイブリッド検索</td>
          <td>❌</td>
          <td>✅RRF*+RSF*</td>
          <td><a href="https://milvus.io/docs/multi-vector-search.md"> ✅表内多ベクトルハイブリッド</a></td>
      </tr>
      <tr>
          <td>メタ情報フィルタリング</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>BM25サポート</td>
          <td>❌</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>テキスト検索</td>
          <td>✅</td>
          <td>✅</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>単一ポイント多ベクトル</td>
          <td>✅</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>テンソル検索</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>Langchain統合</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Llamaインデックス統合</td>
          <td>✅</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
      <tr>
          <td>Geo地理情報検索</td>
          <td>✅</td>
          <td>✅</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>マルチテナントサポート</td>
          <td>✅コレクション/メタデータを通じて</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>メタ情報とドキュメントサイズ制限</td>
          <td>無制限</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>最大次元</td>
          <td>無制限</td>
          <td>65535</td>
          <td>32768</td>
      </tr>
      <tr>
          <td>インデックスタイプ</td>
          <td>HNSW</td>
          <td>HNSW</td>
          <td>ANNOY, FAISS, HNSW, ScANN …</td>
      </tr>
      <tr>
          <td>ストリーミングインデックス</td>
          <td>❌</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>スパースベクトルサポート</td>
          <td>❌</td>
          <td>❌</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>一時インデックスサポート（サーバーを含まない）</td>
          <td>✅</td>
          <td>❌</td>
          <td></td>
      </tr>
      <tr>
          <td>シャード</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>価格</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>Facets（カウント付き集計）</td>
          <td>❌</td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>内蔵画像埋め込み</td>
          <td></td>
          <td>✅</td>
          <td></td>
      </tr>
      <tr>
          <td>推奨API</td>
          <td>✅</td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>パーソナライズ</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>ユーザーイベント</td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr>
          <td>内蔵LLMをRAGに使用</td>
          <td></td>
          <td><a href="https://weaviate.io/developers/weaviate/modules/reader-generator-modules/generative-openai">✅Generative Search </a></td>
          <td></td>
      </tr>
  </tbody>
</table>
<table>
  <thead>
      <tr>
          <th>データベース</th>
          <th>Qdrant</th>
          <th>Weaviate</th>
          <th>Milvus</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>主観的な利点</td>
          <td>1. 1つのコレクションに複数のベクトル（画像、テキストなど）を保存できる<br>2. リソース消費が非常に少ない</td>
          <td>1. パフォーマンスが比較的良い<br>2. 内蔵埋め込みをサポート<br>3. テキスト検索をサポート<br>4. GraphQL API<br>5. S3バックアップをサポート</td>
          <td>1. 公式サポートの視覚的操作インターフェース<br>2. 高い検索精度<br>3. 豊富なSDK<br>4. GPUアクセラレーション</td>
      </tr>
  </tbody>
</table>
<p>要約すると、Qdrantは非常に小さなオーバーヘッドで、<strong>Weaviateはベクトル検索、オブジェクトストレージ、インバーテッドインデックスの組み合わせをサポート</strong>し、Milvusは最も強力なパフォーマンスと多くの機能を持っています。</p>
<h2 id="ベクトルデータベースの検索方法の比較" class="heading-element"><span>6 ベクトルデータベースの検索方法の比較</span>
  <a href="#%e3%83%99%e3%82%af%e3%83%88%e3%83%ab%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ae%e6%a4%9c%e7%b4%a2%e6%96%b9%e6%b3%95%e3%81%ae%e6%af%94%e8%bc%83" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><div align="center"><img src="https://cdn1.zair.top/images/2024/04/15d0b710c084965f99586dceccb62898.png" alt="ベクトルデータベースの検索方法の比較" style="width: 75%;"></div>
<table>
  <thead>
      <tr>
          <th></th>
          <th>Milvus</th>
          <th>Weaviate</th>
          <th>Qdrant</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>独自の検索方法</td>
          <td>多ベクトル検索</td>
          <td>BM25キーワード検索+ハイブリッド検索</td>
          <td>キーワードフィルタリングをベクトル検索に適用</td>
      </tr>
  </tbody>
</table>
<h3 id="milvus" class="heading-element"><span>6.1 Milvus</span>
  <a href="#milvus" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>Milvusは、コレクション内のベクトルフィールドの数に応じて、2種類の検索をサポートしています：単一ベクトル検索と多ベクトル検索。</p>
<p>単一ベクトル検索は、search()メソッドを使用して、クエリベクトルとコレクション内の既存のベクトルを比較し、最も類似したエンティティのIDとその間の距離を返します。また、結果のベクトル値とメタデータをオプションで返すこともできます。</p>
<p>多ベクトル検索は、2つ以上のベクトルフィールドを持つコレクションに適しており、hybrid_search()メソッドを使用して実行されます。このメソッドは、複数の近似最近傍（ANN）検索リクエストを実行し、結果を再ランキングして最も関連性の高い一致を返します。（最新の2.4.xバージョンでサポートされ、最大10個のベクトル検索が可能です）</p>
<p><strong>多ベクトル検索</strong>は、高精度が必要な複雑な状況に非常に適しており、特に1つのエンティティが複数の異なるベクトルで表現できる場合に役立ちます。これは、同じデータ（例えば1つの文）が異なる埋め込みモデルで処理される場合や、多モーダル情報（例えば個人の画像、指紋、声紋）がさまざまなベクトル形式に変換される場合に適しています。テーブル全体の「マルチウェイリコール」を通じて、これらのベクトルに重みを割り当てることで、それらの総合的な効果がリコール能力を大幅に向上させ、検索結果の有効性を高めることができます。</p>
<p>その他の基本的な検索操作：</p>
<ul>
<li>基本検索には、単一ベクトル検索、バッチベクトル検索、パーティション検索、指定された出力フィールドを持つ検索が含まれます。</li>
<li>フィルタ検索は、スカラーフィールドのフィルタ条件に基づいて検索結果を絞り込みます。</li>
<li>範囲検索は、クエリベクトルと特定の距離範囲内のベクトルを見つけます。</li>
<li>グループ検索は、特定のフィールドに基づいて検索結果をグループ化し、結果の多様性を確保します。</li>
</ul>
<h3 id="weaviate" class="heading-element"><span>6.2 Weaviate</span>
  <a href="#weaviate" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li>ベクトル類似度検索：一連の近似検索方法をカバーし、この種の検索はクエリベクトル表現に最も類似したオブジェクトを探します。</li>
<li>画像検索：画像を類似度検索の入力として使用します。</li>
<li><strong>キーワード検索：BM25Fアルゴリズムを使用して結果をランク付けするキーワード検索。</strong></li>
<li><strong>ハイブリッド検索：BM25と類似度検索を組み合わせて結果をランク付けします。</strong></li>
<li>生成的検索：検索結果をLLMのプロンプトとして使用します。</li>
<li>再ランキング：検索された検索結果を再ランキングモジュールを使用して再ランキングします。</li>
<li>集計：結果セットからデータを集計します。</li>
<li>フィルタ：検索に条件フィルタを適用します。</li>
</ul>
<h3 id="qdrant" class="heading-element"><span>6.3 Qdrant</span>
  <a href="#qdrant" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>サポートされている基本的な検索操作：</p>
<ul>
<li>関連スコアによるフィルタリング</li>
<li>単一リクエストで複数の検索操作をロード</li>
<li>推奨API</li>
<li>グループ操作</li>
</ul>
<p>Qdrantがサポートするその他の検索方法：</p>
<blockquote>
<p><a href="https://qdrant.tech/documentation/faq/qdrant-fundamentals/#does-qdrant-support-a-full-text-search-or-a-hybrid-search"target="_blank" rel="external nofollow noopener noreferrer">Qdrantは全文検索またはハイブリッド検索をサポートしていますか？<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
</blockquote>
<blockquote>
<p>Qdrantはまずベクトル検索エンジンであり、ベクトル検索ユースケースに影響を与えない場合にのみ全文サポートを実装します。これにはインターフェースとパフォーマンスが含まれます。</p>
<p>Qdrantができること：</p>
<ul>
<li>全文フィルタを使用して検索</li>
<li><strong>全文フィルタをベクトル検索に適用する</strong>（つまり、特定の単語やフレーズを含むレコードでベクトル検索を実行する）</li>
<li>プレフィックス検索とセマンティックインスタント検索を行う</li>
</ul>
<p>Qdrantが将来導入する予定の機能：</p>
<ul>
<li>SPLADEや類似モデルで使用されるスパースベクトルのサポート</li>
</ul>
<p>Qdrantがサポートする予定のない機能：</p>
<ul>
<li>BM25または他の非ベクトルベースの検索またはランキング関数</li>
<li>組み込みのオントロジーまたは知識グラフ</li>
<li>クエリアナライザーやその他のNLPツール</li>
</ul>
</blockquote>
<div class="details admonition question open">
  <div class="details-summary admonition-title"><i class="icon fa-fw fa-regular fa-circle-question" aria-hidden="true"></i>BM25と単純なキーワード検索の違いは何ですか？<i class="details-icon fa-solid fa-angle-right fa-fw" aria-hidden="true"></i></div>
  <div class="details-content">
    <div class="admonition-content"><ol>
<li><strong>関連性スコアリング</strong>：
<ul>
<li><strong>単純なキーワード検索</strong>は通常、単語の頻度に基づいています：単語がドキュメントに出現する場合、そのドキュメントは関連していると見なされます。この方法は、キーワードの出現回数を計算するだけで、すべてのキーワードが同等に重要と見なされるかもしれません。</li>
<li><strong>BM25</strong>は、より複雑なアルゴリズムを採用しており、単語の頻度だけでなく、ドキュメントの長さや単語の逆文書頻度（すなわち、すべてのドキュメントでの希少性）も考慮します。これにより、BM25はより精緻な関連性スコアを提供し、クエリとドキュメントの一致度をよりよく反映します。</li>
</ul>
</li>
<li><strong>ドキュメントの長さの処理</strong>：
<ul>
<li>単純なキーワード検索は、ドキュメントの長さを考慮しないかもしれません。これにより、より長いドキュメント（より多くの単語を含む）が優先される可能性があります。</li>
<li>BM25は、そのアルゴリズム内部の標準化プロセスを通じてドキュメントの長さを考慮し、このような偏りを避け、長短のドキュメントが関連性スコアリングで公平になるようにします。</li>
</ul>
</li>
<li><strong>クエリ単語の重要性</strong>：
<ul>
<li>単純なキーワード検索では、すべてのキーワードが等しく扱われるかもしれません。</li>
<li>BM25は、逆文書頻度（IDF）を利用して、各クエリ単語の重要性を調整します。これにより、より少ないドキュメントに出現する単語（よりユニークな単語）がドキュメントの関連性スコアにより大きな影響を与えます。</li>
</ul>
</li>
<li><strong>パラメータ調整</strong>：
<ul>
<li>単純なキーワード検索には、検索結果を最適化するための設定可能なパラメータがほとんどありません。</li>
<li>BM25は、アルゴリズムの感度を微調整するためのパラメータ（例：k1とb）を提供し、異なるタイプのテキストや検索ニーズに適応させることができます。</li>
</ul>
</li>
</ol>
<p>単純なキーワード検索と比較して、BM25はドキュメントとクエリ間の関連性を評価するためのより複雑で精緻な方法を提供し、より正確でユーザーの期待に合った検索結果を生成できます。</p></div>
  </div>
</div>
<p>現在のところ、ベクトルデータベースのセマンティック検索特性と、従来のキーワード検索の正確な特性を両立させる方法があるかどうかが課題です。</p>
<h2 id="付録" class="heading-element"><span>7 付録</span>
  <a href="#%e4%bb%98%e9%8c%b2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="annベンチマーク" class="heading-element"><span>7.1 ANNベンチマーク</span>
  <a href="#ann%e3%83%99%e3%83%b3%e3%83%81%e3%83%9e%e3%83%bc%e3%82%af" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><blockquote>
<p>ベンチマークは、検索タイプ（フィルタ検索または通常検索）、設定、インデックスアルゴリズム、データ埋め込み、ハードウェアなど、データベースのパフォーマンスに影響を与えるさまざまな要因によって影響を受けます。ベンチマークのパフォーマンスに加えて、ベクトルライブラリを選択する際には、分散能力、メモリレプリカとキャッシュのサポート、採用されているインデックスアルゴリズム、ベクトル類似性検索の能力（ハイブリッド検索、フィルタリング、およびさまざまな類似性メトリックを含む）、シャーディングメカニズム、クラスター方法、スケーラビリティの可能性、データの一貫性、およびシステムの全体的な可用性など、複数の側面を考慮する必要があります。</p>
</blockquote>
<p><a href="https://github.com/erikbern/ann-benchmarks"target="_blank" rel="external nofollow noopener noreferrer">ANN-Benchmarks<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a> は、近似最近傍アルゴリズムの検索パフォーマンスを評価する主要なベンチマークプラットフォームです。テキスト検索では、ベクトルデータベースの角度メトリックでのパフォーマンスは、ユークリッドメトリックでのパフォーマンスよりも重要です。これは、角度メトリックが文書のセマンティック類似性に対してより敏感であり、ユークリッドメトリックが文書の長さと規模に対してより敏感であるためです。したがって、生成されたコンテキストの検索を強化する際には、異なる次元を超えた角度データセットでのベクトルデータベースのパフォーマンスを評価することに焦点を当てる必要があります。</p>
<h4 id="glove-100-angular" class="heading-element"><span>7.1.1 glove-100-angular</span>
  <a href="#glove-100-angular" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div align="center"><img src="https://cdn1.zair.top/images/2024/04/77413edaa99720289808ab7dd1da27cc.png" alt="glove-100-angularベンチマーク" style="width: 75%;"></div>
明らかに、Milvusはリコール値が0.95未満のときに最高のスループットを持っています。リコール値が0.95を超えると、スループットの差が縮小します。Vespaの構築時間が最も長いです。WeaviateとMilvusの構築時間は同等ですが、Milvusはやや長いです。インデックスサイズに関しては、Weaviateのインデックスが最小です。Milvusのインデックスは最大ですが、1.5GB未満です（100次元のベクトルを持つ120万のベクトルを含むデータセット）。
<h4 id="nytimes-256-angular" class="heading-element"><span>7.1.2 nytimes-256-angular</span>
  <a href="#nytimes-256-angular" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div align="center"><img src="https://cdn1.zair.top/images/2024/04/d2ef6ccb67567ccf48793c7df8520f65.png" alt="nytimes-256-angularベンチマーク" style="width: 75%;"></div>
このデータセットの結果は、glove-100-angularデータセットの結果と似ています。Weaviateはこのデータセットの構築時間が最も長く、インデックスが最小です。Milvusのインデックスは最大ですが、440MBしかありません（256次元のベクトルを持つ290,000のベクトルを含むデータセット）。
<h3 id="ベクトル類似度指標" class="heading-element"><span>7.2 ベクトル類似度指標</span>
  <a href="#%e3%83%99%e3%82%af%e3%83%88%e3%83%ab%e9%a1%9e%e4%bc%bc%e5%ba%a6%e6%8c%87%e6%a8%99" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><table>
  <thead>
      <tr>
          <th>指標</th>
          <th>説明</th>
          <th>サポートされているデータベース</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>コサイン距離</td>
          <td>2つのベクトル間の角度のコサイン値を測定</td>
          <td>pgvector, Pinecone, Weaviate, Qdrant, Milvus, Vespa</td>
      </tr>
      <tr>
          <td>ユークリッド距離（L2）</td>
          <td>多次元空間で2つのベクトル間の直線距離を計算</td>
          <td>pgvector, Pinecone, Qdrant, Milvus, Vespa</td>
      </tr>
      <tr>
          <td>内積（ドット積）</td>
          <td>ベクトルの対応する成分の積の和を計算</td>
          <td>pgvector, Pinecone, Weaviate, Qdrant, Milvus</td>
      </tr>
      <tr>
          <td>L2平方距離</td>
          <td>2つのベクトル間のユークリッド距離の平方</td>
          <td>Weaviate</td>
      </tr>
      <tr>
          <td>ハミング距離</td>
          <td>各次元でベクトル間の差異数を測定</td>
          <td>Weaviate, Milvus, Vespa</td>
      </tr>
      <tr>
          <td>マンハッタン距離</td>
          <td>直角軸に沿って2つのベクトル次元間の距離を測定</td>
          <td>Weaviate</td>
      </tr>
  </tbody>
</table>
<p>以下は、各指標の詳細な紹介であり、それらの相対的な利点、欠点、およびそれらが適した使用シナリオを含んでいます。</p>
<h4 id="コサイン距離" class="heading-element"><span>7.2.1 コサイン距離</span>
  <a href="#%e3%82%b3%e3%82%b5%e3%82%a4%e3%83%b3%e8%b7%9d%e9%9b%a2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>コサイン距離は、2つのベクトル間の角度のコサイン値を測定し、正規化または凸集合を処理する際によく使用されます。</p>
<ul>
<li>利点：主にベクトルの方向を考慮し、高次元空間（例えばテキストの比較）に非常に適しています。テキストの比較では、文書の長さがそれほど重要ではありません。</li>
<li>欠点：ベクトル次元の一致が必要なシナリオには適していません。例えば、ピクセル密度に基づいて画像の埋め込みを比較する場合です。データが凸集合を形成していない場合、正確な類似性メトリックを提供できない可能性があります。</li>
</ul>
<p>コサイン距離は、文書分類、セマンティック検索、推薦システム、および高次元データと標準化データを含むその他のタスクに適しています。情報を検索する際には、コサイン距離はクエリコンテンツと文書ベクトル間の類似性を測定するために使用され、長さを無視し、セマンティックな意味に焦点を当てます。</p>
<h4 id="ユークリッド距離-l2" class="heading-element"><span>7.2.2 ユークリッド距離 L2</span>
  <a href="#%e3%83%a6%e3%83%bc%e3%82%af%e3%83%aa%e3%83%83%e3%83%89%e8%b7%9d%e9%9b%a2-l2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>ユークリッド距離は、多次元空間で2つのベクトル間の直線距離を計算し、二乗ノルムとも呼ばれます。</p>
<ul>
<li>利点：直感的で計算が容易であり、ベクトルの大きさと方向の両方に敏感です。</li>
<li>欠点：「次元の呪い」により、高次元空間でのパフォーマンスが低下する可能性があります。</li>
</ul>
<p>画像認識、音声認識、手書き分析などのシナリオに適しています。</p>
<h4 id="内積" class="heading-element"><span>7.2.3 内積</span>
  <a href="#%e5%86%85%e7%a9%8d" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>内積は、ベクトルの対応する成分の積の和を計算し、n乗ノルムとも呼ばれます。</p>
<ul>
<li>利点：計算速度が速く、ベクトルの大きさと方向を反映します。</li>
<li>欠点：ベクトルの方向に敏感であるだけでなく、ベクトルの大きさにも敏感です。</li>
</ul>
<p>内積の最も古典的な応用は、推薦システムの分野です。推薦システムでは、内積を使用してユーザーベクトルとアイテムベクトル間の類似度を決定し、ユーザーが特定のアイテムに対して持つ興味を予測するのに役立ちます。内積は、推薦システム、協調フィルタリング、行列分解に適しています。</p>
<h4 id="l2平方距離" class="heading-element"><span>7.2.4 L2平方距離</span>
  <a href="#l2%e5%b9%b3%e6%96%b9%e8%b7%9d%e9%9b%a2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>2つのベクトル間のユークリッド距離の平方。</p>
<ul>
<li>利点：ベクトル要素間の大きな差異を罰することができ、特定の状況で役立つ可能性があります。</li>
<li>欠点：平方操作が距離を歪める可能性があり、外れ値に敏感です。</li>
</ul>
<p>L2平方距離は、特定の次元の差異の問題に特に適しており、例えば画像処理で2つの画像の違いを比較する際に使用されます。</p>
<h4 id="ハミング距離" class="heading-element"><span>7.2.5 ハミング距離</span>
  <a href="#%e3%83%8f%e3%83%9f%e3%83%b3%e3%82%b0%e8%b7%9d%e9%9b%a2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>各次元でベクトル間の差異数を測定します。</p>
<ul>
<li>利点：バイナリまたは分類データの比較に適しています。</li>
<li>欠点：連続または数値データには適していません。</li>
</ul>
<p>適用シナリオも比較的特殊であり、例えばエラー検出と修正（分類データ）や、2つのDNA鎖間の遺伝的距離を測定する際に使用されます。</p>
<h4 id="マンハッタン距離-l1" class="heading-element"><span>7.2.6 マンハッタン距離 L1</span>
  <a href="#%e3%83%9e%e3%83%b3%e3%83%8f%e3%83%83%e3%82%bf%e3%83%b3%e8%b7%9d%e9%9b%a2-l1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><p>直角軸に沿って2つのベクトル次元間の距離を測定し、一乗ノルムとも呼ばれます。</p>
<ul>
<li>利点：ユークリッド距離よりも外れ値に対して耐性があります。</li>
<li>欠点：幾何学的な意味ではユークリッド距離ほど直感的ではありません。</li>
</ul>
<p>チェスボード距離の計算や、物流計画における最短経路問題に適しています。</p>
<h2 id="参考資料" class="heading-element"><span>8 参考資料</span>
  <a href="#%e5%8f%82%e8%80%83%e8%b3%87%e6%96%99" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://github.com/milvus-io/milvus"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/milvus-io/milvus<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://www.farfetchtechblog.com/en/blog/post/powering-ai-with-vector-databases-a-benchmark-part-i/"target="_blank" rel="external nofollow noopener noreferrer">Powering AI With Vector Databases: A Benchmark - Part I - Data - Blog - F-Tech (farfetchtechblog.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://qdrant.tech/documentation/faq/qdrant-fundamentals/"target="_blank" rel="external nofollow noopener noreferrer">Fundamentals - Qdrant<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://milvus.io/docs"target="_blank" rel="external nofollow noopener noreferrer">Milvus documentation<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://weaviate.io/developers/weaviate"target="_blank" rel="external nofollow noopener noreferrer">Home | Weaviate - Vector Database<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://qdrant.tech/documentation/"target="_blank" rel="external nofollow noopener noreferrer">Qdrant Documentation - Qdrant<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://qdrant.tech/use-cases/"target="_blank" rel="external nofollow noopener noreferrer">Vector Database Use Cases - Qdrant<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>
]]></description>
    </item>
    <item>
      <title>AIナレッジベースからRAGへ</title>
      <link>https://www.zair.top/ja-jp/post/rag-knowledge-base/</link>
      <pubDate>Thu, 21 Mar 2024 17:14:22 +0800</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/rag-knowledge-base/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/llm/">Llm</category>
      <description><![CDATA[<p>AIアプリケーションを構築する際、「AIがタスク中のデータを見たことがない」という問題に直面します。例えば、企業にとってAIは各顧客の情報を把握できず、個人にとってAIは個人情報やプライバシー情報をあまり理解していません。AIの能力が非常に高くても（理想的な世界モデルも例外ではありません）、具体的なタスクのデータが欠けていると、「具体的な問題を具体的に分析する」能力を失います。</p>
<h2 id="ragとは何か" class="heading-element"><span>1 RAGとは何か</span>
  <a href="#rag%e3%81%a8%e3%81%af%e4%bd%95%e3%81%8b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>外部資料を検索することで生成AIモデルの正確性と信頼性を向上させる技術が、検索強化生成技術（<strong>R</strong>etrieval-<strong>A</strong>ugmented <strong>G</strong>eneration）です。大規模言語モデル（LLM）がタスクを完了する過程を試験に例えるなら、RAGを持つ大規模モデルはオープンブックテストに相当し、RAGのサポートがない場合はクローズドブックテストのようです。RAGはLLMが資料を<strong>検索</strong>することで、<strong>生成</strong>効果を向上させる技術です。</p>
<p>RAGはPatrick Lewisらによって<a href="https://arxiv.org/pdf/2005.11401.pdf"target="_blank" rel="external nofollow noopener noreferrer">この論文<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>で初めて提案され、彼らが所属する会社がCohereです。この会社は現在、EmbeddingやRerankモデルを含むAPIサービスを提供しており、性能も非常に優れています。</p>
<h2 id="なぜragが必要なのか" class="heading-element"><span>2 なぜRAGが必要なのか</span>
  <a href="#%e3%81%aa%e3%81%9crag%e3%81%8c%e5%bf%85%e8%a6%81%e3%81%aa%e3%81%ae%e3%81%8b" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>RAGの登場は、大規模言語モデルがアプリケーションで直面するいくつかの問題と不足を解決するためです。最も顕著な点は<strong>大規模モデルの幻覚問題</strong>であり、これは大規模モデルの出力が事実と一致しないか、答えを捏造することです。また、LLMを訓練するためのデータが古く、LLMが新しい資料を全く知らない可能性があります。</p>
<p>RAGはLLMが最新またはカスタムの資料にアクセスできるようにし、ユーザーがLLMの情報源を検証できるようにして、その正確性を確保します。RAGが検索するデータは公開されているもの（検索エンジンなど）もあれば、非公開のもの（企業資料、個人の機密データなど）もあります。この点がRAGに広い応用の可能性を与えています。RAGはすでに広く使用されており、例えばNVIDIAのNeMo Retrieverは企業内部資料を読み取り、月の暗面のKimi Chatは検索エンジンを利用して回答しています。</p>
<div align="center"><img src="https://cdn1.zair.top/images/2024%2F03%2Fa4c4933267645b81ed019e29ccc8ced6.png" alt="黄仁勋がGTC2024で紹介したNeMo Retriever" style="width: 75%;"></div>
黄仁勋がGTC2024で紹介したNeMo Retriever
<h2 id="ragを中心に構築されたナレッジベース" class="heading-element"><span>3 RAGを中心に構築されたナレッジベース</span>
  <a href="#rag%e3%82%92%e4%b8%ad%e5%bf%83%e3%81%ab%e6%a7%8b%e7%af%89%e3%81%95%e3%82%8c%e3%81%9f%e3%83%8a%e3%83%ac%e3%83%83%e3%82%b8%e3%83%99%e3%83%bc%e3%82%b9" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>AIナレッジベースはAIが「オーダーメイド」できるようにする重要なツールです。ナレッジベースを通じてAIがタスクをより良く完了できるようにするために、現在のAIナレッジベースの構築方法には以下の3つがあります：</p>
<ul>
<li>プロンプトエンジニアリング (Prompt Engineering)</li>
<li>微調整 (Fine Tuning)</li>
<li>埋め込み (Embedding)</li>
</ul>
<p>プロンプトエンジニアリングは、プロンプト内にナレッジベースを直接構築し、すべての資料をプロンプトに入れる方法です。この方法は小規模での使用に適していますが、現在のAIモデルの入力トークン数ではこの実装方法を満たすことは基本的にできません。実際、AIが発展し、ある日AIの入力ウィンドウが一般的なナレッジベースを収容できるほど十分に大きくなったとしても、ナレッジベースを構築することには依然として価値があります。なぜなら、入力の内容の長さがAIの性能に影響を与えるからです（<del>少なくとも現在のモデルではそうです</del>）。具体的には<a href="https://github.com/gkamradt/LLMTest_NeedleInAHaystack"target="_blank" rel="external nofollow noopener noreferrer">Needle In A Haystack - Pressure Testing LLMs<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>を参照してください。</p>
<p>微調整は学界でよく見られる形式で、特定のタスクデータを使用して事前訓練モデルを微調整します。この方法は実際には業界共通の大規模モデルを作成するのに適しています。例えば、法律業界の大規模モデル、医療大規模モデルなどです。一方で、微調整には多くの訓練データが必要で、コストも高いです。また、微調整はあまり柔軟ではなく、1、2つのドキュメントに基づいて即座に調整することはできません。微調整の過程は実際には訓練データを学習し、一般化することであり、内容を記憶するというよりも、特定の分野の能力を強化することです。</p>
<p>したがって、現在最も主流のナレッジベースの構築方法は、Embeddingの方法を採用しています。そして、この形式のナレッジベースもRAGと組み合わせる必要があります。</p>
<h2 id="ragの基本構成" class="heading-element"><span>4 RAGの基本構成</span>
  <a href="#rag%e3%81%ae%e5%9f%ba%e6%9c%ac%e6%a7%8b%e6%88%90" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>クラシックで基本的なRAGの構成は以下の図のようになっています。</p>
<div align="center"><img src="https://cdn1.zair.top/images/2024/03/rag-base.drawio.svg" alt="RAGの基本構成" style="width: 75%;"></div>
RAGシステムは主にインデックス、検索、生成の3つの段階を含みます。
<h3 id="embedding-埋め込み" class="heading-element"><span>4.1 Embedding 埋め込み</span>
  <a href="#embedding-%e5%9f%8b%e3%82%81%e8%be%bc%e3%81%bf" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>このプロセスでは、ユーザーは最初にドキュメントをアップロードし、システムはアップロードされたドキュメントをEmbeddingを通じてベクトルデータベースに保存します。Embeddingは、意味が類似したテキストを距離が近いベクトルに変換することであり、このプロセスは俗にベクトル化と呼ばれます。</p>
<h3 id="retrieval-検索" class="heading-element"><span>4.2 Retrieval 検索</span>
  <a href="#retrieval-%e6%a4%9c%e7%b4%a2" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>ユーザーがLLMに質問すると、質問の内容はEmbeddingを経てベクトルデータベースで一致し、一連の内容が検索されます。これが第一段階の検索です。</p>
<h3 id="rerank-再順位付け" class="heading-element"><span>4.3 Rerank 再順位付け</span>
  <a href="#rerank-%e5%86%8d%e9%a0%86%e4%bd%8d%e4%bb%98%e3%81%91" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>ベクトルデータベースで直接検索された内容は完璧ではない可能性があり、結果が検索内容と一致しないことがよくあります。したがって、第二段階の検索、つまりRerankが必要です。この段階では、Rerankモデルが前の段階で検索された内容を再順位付けし、関連性に基づいて結果を出力します。Rerankが完了した後、Top Kを取得して後の生成段階で使用できます。</p>
<h2 id="5行コードでragを実装" class="heading-element"><span>5 5行コードでRAGを実装</span>
  <a href="#5%e8%a1%8c%e3%82%b3%e3%83%bc%e3%83%89%e3%81%a7rag%e3%82%92%e5%ae%9f%e8%a3%85" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><blockquote>
<p><del>代入文が1行と数える</del></p>
</blockquote>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">transformers</span> <span class="kn">import</span> <span class="n">RagTokenizer</span><span class="p">,</span> <span class="n">RagRetriever</span><span class="p">,</span> <span class="n">RagTokenForGeneration</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datasets</span> <span class="kn">import</span> <span class="n">load_dataset</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">retriever</span> <span class="o">=</span> <span class="n">RagRetriever</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">config_name</span> <span class="o">=</span> <span class="s2">&#34;facebook/rag-token-nq&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">index_name</span> <span class="o">=</span> <span class="s2">&#34;compressed&#34;</span><span class="p">,</span>  <span class="c1"># インデックスのタイプ</span>
</span></span><span class="line"><span class="cl">    <span class="n">use_dummy_dataset</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>  <span class="c1"># テスト用にダミーデータセットを使用</span>
</span></span><span class="line"><span class="cl">    <span class="n">dataset</span> <span class="o">=</span> <span class="s2">&#34;wiki_dpr&#34;</span>  <span class="c1"># 検索に使用するデータセット</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 事前訓練されたtokenizerとモデルをロード</span>
</span></span><span class="line"><span class="cl"><span class="n">tokenizer</span> <span class="o">=</span> <span class="n">RagTokenizer</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span><span class="s2">&#34;facebook/rag-token-nq&#34;</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="n">model</span> <span class="o">=</span> <span class="n">RagTokenForGeneration</span><span class="o">.</span><span class="n">from_pretrained</span><span class="p">(</span><span class="s2">&#34;facebook/rag-token-nq&#34;</span><span class="p">,</span> <span class="n">retriever</span><span class="o">=</span><span class="n">retriever</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 質問を入力しベクトルに変換</span>
</span></span><span class="line"><span class="cl"><span class="n">input_ids</span> <span class="o">=</span> <span class="n">tokenizer</span><span class="p">(</span><span class="n">input_text</span> <span class="o">=</span> <span class="s2">&#34;What is the capital of France?&#34;</span><span class="p">,</span> 
</span></span><span class="line"><span class="cl">		<span class="n">return_tensors</span><span class="o">=</span><span class="s2">&#34;pt&#34;</span><span class="p">)</span><span class="o">.</span><span class="n">input_ids</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 回答を生成</span>
</span></span><span class="line"><span class="cl"><span class="n">outputs</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="n">input_ids</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="n">tokenizer</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">outputs</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">skip_special_tokens</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span></span></span></code></pre></td></tr></table>
</div>
</div><p><code>RagTokenizer</code>はテキストのトークン化に使用され、<code>RagTokenForGeneration</code>はRAGモデルの生成部分であり、<code>RagRetriever</code>は検索を担当する部分です。<code>RagTokenizer.from_pretrained(&quot;facebook/rag-token-nq&quot;)</code>は、事前に訓練されたトークナイザーをロードし、テキストをモデルが理解できる形式（トークン化）に変換します。<code>RagTokenForGeneration.from_pretrained(&quot;facebook/rag-token-nq&quot;, retriever=retriever)</code>は、事前訓練されたRAGモデルをロードします。<code>facebook/rag-token-nq</code>はモデルとトークナイザーの名称で、Natural Questionsデータセットで事前訓練されています。</p>
<h2 id="オープンソースのrag実装" class="heading-element"><span>6 オープンソースのRAG実装</span>
  <a href="#%e3%82%aa%e3%83%bc%e3%83%97%e3%83%b3%e3%82%bd%e3%83%bc%e3%82%b9%e3%81%aerag%e5%ae%9f%e8%a3%85" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><a href="https://github.com/langgenius/dify"target="_blank" rel="external nofollow noopener noreferrer">Dify<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>はLLMアプリケーション開発プラットフォームで、すでに10万以上のアプリケーションが<a href="http://dify.ai/"target="_blank" rel="external nofollow noopener noreferrer">Dify.AI<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>を基に構築されています。Backend as ServiceとLLMOpsの理念を融合し、生成AIネイティブアプリケーションを構築するために必要なコア技術スタックをカバーしています。<strong>内蔵RAGエンジンを含む</strong>。Difyを使用すると、任意のモデルに基づいてAssistants APIやGPTsの能力を自動展開できます。このプロジェクトは蘇州の会社によって主催されており、SasSサービスを提供しています。</p>
<p><a href="https://github.com/chatchat-space/Langchain-Chatchat"target="_blank" rel="external nofollow noopener noreferrer">Langchain-Chatchat<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>は、ChatGLMなどの大規模言語モデルとLangchainなどのアプリケーションフレームワークに基づいて実装された、オープンソースでオフラインデプロイ可能な検索強化生成（RAG）大規模モデルナレッジベースプロジェクトです。最初はChatGLMモデルのみをサポートしていましたが、その後多くのオープンソースモデルやオンラインモデルのサポートが追加されました。</p>
<p>両社の機能比較は以下の表の通りです：</p>
<table>
  <thead>
      <tr>
          <th></th>
          <th>Dify-api</th>
          <th>ChatChat</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>外部機能</td>
          <td>一般的なドキュメント読み取り</td>
          <td>一般的なドキュメント <br> 画像OCR</td>
      </tr>
      <tr>
          <td>データソース</td>
          <td>ドキュメントテキスト内容 <br> ベクトルデータベース</td>
          <td>検索エンジン <br> ベクトルデータベース</td>
      </tr>
      <tr>
          <td>モデルサポート</td>
          <td>オンラインembeddingモデル <br> オンラインrerankモデル <br> オンラインLLM</td>
          <td>オンラインembeddingモデル <br> オフラインembeddingモデル <br> オフラインLLM</td>
      </tr>
      <tr>
          <td>高度な機能</td>
          <td>ESハイブリッド検索</td>
          <td>無</td>
      </tr>
      <tr>
          <td>高度なRAG</td>
          <td>サポートしない</td>
          <td>サポートしない</td>
      </tr>
  </tbody>
</table>
<p>実際には、現在のオープンソースプロジェクトが完全にカバーしていない機能もいくつかあります。例えば：</p>
<ul>
<li>マルチモーダル能力</li>
<li>伝統的なリレーショナルデータベースのサポート</li>
<li>複数のデータベースの統合/クロスデータベースの資料取得</li>
<li>引用機能</li>
<li>高度なRAG</li>
<li>評価指標</li>
</ul>
<h2 id="参考資料" class="heading-element"><span>7 参考資料</span>
  <a href="#%e5%8f%82%e8%80%83%e8%b3%87%e6%96%99" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><ol>
<li><a href="https://github.com/gkamradt/LLMTest_NeedleInAHaystack"target="_blank" rel="external nofollow noopener noreferrer">gkamradt/LLMTest_NeedleInAHaystack: Doing simple retrieval from LLM models at various context lengths to measure accuracy (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://research.ibm.com/blog/retrieval-augmented-generation-RAG"target="_blank" rel="external nofollow noopener noreferrer">What is retrieval-augmented generation? | IBM Research Blog<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://www.langchain.com/retrieval"target="_blank" rel="external nofollow noopener noreferrer">Retrieval (langchain.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://github.com/langgenius/dify"target="_blank" rel="external nofollow noopener noreferrer">langgenius/dify (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
<li><a href="https://github.com/chatchat-space/Langchain-Chatchat"target="_blank" rel="external nofollow noopener noreferrer">Langchain-Chatchat (github.com)<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></li>
</ol>
]]></description>
    </item>
    <item>
      <title>stderrとstdout：ログと出力の理解</title>
      <link>https://www.zair.top/ja-jp/post/standard-output/</link>
      <pubDate>Sat, 17 Feb 2024 20:42:32 +0000</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/standard-output/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/computer-technology/">Computer-Technology</category>
      <category domain="https://www.zair.top/ja-jp/categories/coding/">Coding</category>
      <description><![CDATA[<p>標準出力（<code>stdout</code>）と標準エラー（<code>stderr</code>）という2つの概念はシンプルでありながら、ログ記録、エラー処理、データフロー管理において重要な役割を果たします。本記事では、<code>stdout</code>と<code>stderr</code>の違いとその応用について、特にPython環境での効果的な使用法を探ります。</p>
<h2 id="標準出力stdoutと標準エラーstderr" class="heading-element"><span>1 標準出力（<code>stdout</code>）と標準エラー（<code>stderr</code>）</span>
  <a href="#%e6%a8%99%e6%ba%96%e5%87%ba%e5%8a%9bstdout%e3%81%a8%e6%a8%99%e6%ba%96%e3%82%a8%e3%83%a9%e3%83%bcstderr" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>ほとんどのオペレーティングシステムでは、標準出力と標準エラーはプロセスの2つの主要な出力ストリームです。これらは、プロセスが情報やエラーメッセージを端末やファイルに送信するためのメカニズムを提供します。物理的には同じ（例えば、同じ端末インターフェースに表示される）場合があるものの、論理的には異なる目的で使用されます：</p>
<ul>
<li><strong>標準出力（<code>stdout</code>）</strong>：通常、プログラムの実行結果や正常な動作情報を出力するために使用されます。</li>
<li><strong>標準エラー（<code>stderr</code>）</strong>：エラーメッセージや警告を出力するために特化しており、標準出力がリダイレクトされている場合でも、これらの情報は通常表示されるか記録される必要があります。</li>
</ul>
<h2 id="pythonにおけるprintとlogging" class="heading-element"><span>2 Pythonにおける<code>print</code>と<code>logging</code></span>
  <a href="#python%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8bprint%e3%81%a8logging" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>Pythonでは、<code>print</code>関数はデフォルトで情報を<code>stdout</code>に送信し、<code>logging</code>モジュールはデフォルトでログメッセージを<code>stderr</code>に送信します。これは、通常のプログラム出力とログ（エラーやデバッグ情報を含む）出力を区別しやすくするためです。</p>
<h3 id="printの使用" class="heading-element"><span>2.1 <code>print</code>の使用</span>
  <a href="#print%e3%81%ae%e4%bd%bf%e7%94%a8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><code>print</code>はPythonで最も基本的な出力関数で、情報を標準出力ストリームに出力するために使用されます。簡単で使いやすく、迅速なデバッグやユーザーへの情報表示に適しています。例えば：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="s2">&#34;Hello, world!&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="loggingの使用" class="heading-element"><span>2.2 <code>logging</code>の使用</span>
  <a href="#logging%e3%81%ae%e4%bd%bf%e7%94%a8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><code>logging</code>モジュールは、アプリケーションにログメッセージを追加するための柔軟なフレームワークを提供します。<code>print</code>とは異なり、<code>logging</code>は異なるログレベル（DEBUG, INFO, WARNING, ERROR, CRITICAL）をサポートしており、必要に応じてログの詳細度や出力先を調整できます。例えば：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">logging</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">logging</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;This is an error message&#39;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="tqdmとstderr" class="heading-element"><span>3 tqdmと<code>stderr</code></span>
  <a href="#tqdm%e3%81%a8stderr" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>複雑または長時間実行されるプログラムでは、進行状況バーを使用してプロセスの進行をユーザーに示すことが効果的です。Pythonの<code>tqdm</code>ライブラリは、コマンドラインに進行状況バーを追加するための広く使用されているツールです。<code>tqdm</code>はデフォルトで進行情報を<code>stderr</code>に出力し、通常のプログラム出力（<code>stdout</code>）を妨げないようにします。</p>
<h3 id="stdoutとstderrの分流" class="heading-element"><span>3.1 <code>stdout</code>と<code>stderr</code>の分流</span>
  <a href="#stdout%e3%81%a8stderr%e3%81%ae%e5%88%86%e6%b5%81" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p>場合によっては、通常の出力とエラーやログメッセージを分けることが有用です。例えば、これらを異なるファイルや端末にリダイレクトすることができます。コマンドラインでは、リダイレクト演算子<code>&gt;</code>と<code>2&gt;</code>を使用して実現できます。Pythonコードでは、<code>logging</code>モジュールの設定や特定のファイルオブジェクトを使用して、より細かい制御が可能です。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python script.py &gt; output.log 2&gt; error.log</span></span></code></pre></td></tr></table>
</div>
</div><p>コマンドラインリダイレクト、Pythonの<code>print</code>関数、さらには<code>logging</code>モジュールを通じて、これら2種類の出力を柔軟に制御および分流することができ、エラー処理、ログ記録、ユーザーインタラクションがより明確かつ秩序立ったものになります。</p>
<h2 id="nohupを使用したstdoutとstderrの管理" class="heading-element"><span>4 <code>nohup</code>を使用した<code>stdout</code>と<code>stderr</code>の管理</span>
  <a href="#nohup%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%97%e3%81%9fstdout%e3%81%a8stderr%e3%81%ae%e7%ae%a1%e7%90%86" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>長時間実行されるバックグラウンドプロセスをデプロイする際、<code>nohup</code>コマンドは重要なツールとなります。<code>nohup</code>（「no hang up」）は、ユーザーがログアウトした後もコマンドを実行し続けることを可能にし、特にリモートでタスクを開始する際に便利です。<code>nohup</code>の重要な特性の1つは、<code>stdout</code>と<code>stderr</code>を管理する能力です。</p>
<p>デフォルトでは、<code>nohup</code>を使用してコマンドを実行すると、<code>stdout</code>と<code>stderr</code>が<code>nohup.out</code>ファイルに統合されてリダイレクトされますが、別途指定しない限りです。これにより、通常の出力とエラーメッセージの両方が同じファイルにキャプチャされ、後で確認するのに便利です。しかし、場合によっては、これら2種類の出力を分けることがより有用です。</p>
<h3 id="stdoutとstderrを分けるnohupの使用" class="heading-element"><span>4.1 <code>stdout</code>と<code>stderr</code>を分ける<code>nohup</code>の使用</span>
  <a href="#stdout%e3%81%a8stderr%e3%82%92%e5%88%86%e3%81%91%e3%82%8bnohup%e3%81%ae%e4%bd%bf%e7%94%a8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><code>nohup</code>を使用する際に<code>stdout</code>と<code>stderr</code>を異なるファイルに出力するには、リダイレクト演算子を組み合わせて使用します。例えば：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">nohup python script.py &gt; output.log 2&gt; error.log <span class="p">&amp;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>このコマンドは、<code>stdout</code>を<code>output.log</code>にリダイレクトし、<code>stderr</code>を<code>error.log</code>にリダイレクトし、<code>&amp;</code>でバックグラウンドで実行します。これにより、端末やSSHセッションを閉じてもプログラムは実行を続け、その出力は適切に記録されます。</p>
<h2 id="pythonにおけるバッファリング動作" class="heading-element"><span>5 Pythonにおけるバッファリング動作</span>
  <a href="#python%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%83%90%e3%83%83%e3%83%95%e3%82%a1%e3%83%aa%e3%83%b3%e3%82%b0%e5%8b%95%e4%bd%9c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p><code>stdout</code>と<code>stderr</code>は、データをバッファリングする際に異なる動作を示します。デフォルトでは、<code>stdout</code>は行バッファリングされ、端末に接続されている場合、データは改行文字を受け取るかバッファが満たされるまでキャッシュされます。非対話モードでは、<code>stdout</code>はブロックバッファリングされます（ファイルのように）。一方、<code>stderr</code>は常に行バッファリングされます（Python 3.9以前のバージョンでは、非対話モードではブロックバッファリングされていました）。以下は公式ドキュメントからの引用です：<a href="https://docs.python.org/3.12/library/sys.html#sys.stdout"target="_blank" rel="external nofollow noopener noreferrer">sys &mdash; システム関連のパラメータと関数 — Python 3.12.2 ドキュメント<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<blockquote>
<p>対話的な場合、<code>stdout</code>ストリームは行バッファリングされます。それ以外の場合、通常のテキストファイルのようにブロックバッファリングされます。<code>stderr</code>ストリームはどちらの場合も行バッファリングされます。両方のストリームをバッファリングしないようにするには、<code>[u](&lt;https://docs.python.org/3.12/using/cmdline.html#cmdoption-u&gt;)</code>コマンドラインオプションを渡すか、<code>[PYTHONUNBUFFERED](&lt;https://docs.python.org/3.12/using/cmdline.html#envvar-PYTHONUNBUFFERED&gt;)</code>環境変数を設定します。</p>
<p><em>バージョン3.9で変更:</em> 非対話的な<code>stderr</code>は、完全にバッファリングされる代わりに行バッファリングされるようになりました。</p>
</blockquote>
<p>バッファの粒度が小さいほど、出力はより迅速になりますが、対応するIOコストも大きくなります。Python 3.8以前では、<code>stdout</code>と<code>stderr</code>は同じ粒度でバッファリングされていましたが、これはあまり合理的ではありませんでした。3.9以降、<code>stderr</code>はより小さなバッファ粒度を持つようになり、各書き込み操作の出力が<code>stdout</code>よりも迅速になります。この差異により、<code>stderr</code>はエラーやログ情報に適しており、プログラムがクラッシュしたり異常終了した場合でも、これらの情報が標準出力よりも高い優先度で出力されることが保証されます。</p>
<p>C++では、標準エラーはバッファリングされていない（後述）ため、より積極的ですが、個人的にはこの方が合理的だと思います。</p>
<p>幸いなことに、Pythonでは<code>python -u</code>や環境変数<code>PYTHONUNBUFFERED</code>を設定することで、このバッファリング動作を無効にしたり、<code>sys.stdout.flush()</code>を直接操作して出力のタイミングを制御することができます。</p>
<h2 id="pythonの並行環境での動作" class="heading-element"><span>6 Pythonの並行環境での動作</span>
  <a href="#python%e3%81%ae%e4%b8%a6%e8%a1%8c%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%ae%e5%8b%95%e4%bd%9c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>マルチスレッドまたはマルチプロセス環境で<code>stdout</code>と<code>stderr</code>を使用する場合、出力が交錯したり混乱したりする可能性があります。これは、異なるスレッドやプロセスからの出力が端末やファイルに書き込まれる際に相互に干渉する可能性があるためです。この問題を解決する方法の1つは、各スレッドやプロセスに独立した出力ファイルを作成するか、スレッドロック（thread locks）やプロセス同期メカニズム（例：<code>multiprocessing.Lock</code>）を使用して<code>stdout</code>や<code>stderr</code>へのアクセスを同期することです。</p>
<h2 id="pythonでのstdoutとstderrの制御" class="heading-element"><span>7 Pythonでの<code>stdout</code>と<code>stderr</code>の制御</span>
  <a href="#python%e3%81%a7%e3%81%aestdout%e3%81%a8stderr%e3%81%ae%e5%88%b6%e5%be%a1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>複雑なアプリケーションでは、出力ストリームの目的地をより柔軟に制御する必要があるかもしれません。Pythonはこれを実現するためのさまざまな方法を提供しています：</p>
<ul>
<li><strong><code>stdout</code>と<code>stderr</code>のリダイレクト</strong>：Pythonプログラムの標準出力とエラー出力をリダイレクトするには、<code>sys.stdout</code>と<code>sys.stderr</code>の値を変更することができます。これは、出力をキャプチャして分析したり、出力をグラフィカルインターフェースなどの非標準出力デバイスにリダイレクトする際に特に有用です。</li>
<li><strong><code>subprocess</code>モジュールの使用</strong>：外部コマンドやスクリプトを実行する際、<code>subprocess</code>モジュールを使用すると、コマンドの<code>stdout</code>と<code>stderr</code>ストリームを制御できます。これには、Pythonプログラム内部の変数にリダイレクトしたり、分離または統合したりすることが含まれます。</li>
<li><strong>ログモジュールの高度な応用</strong>：Pythonの<code>logging</code>モジュールは、ログを複数の目的地に出力することをサポートしています。これには、ファイル、標準出力、ネットワークなどが含まれます。異なるログハンドラ（handlers）を設定することで、ログレベルやメッセージ内容に基づいてログを異なる出力に分流するなど、複雑なログ管理スキームを実現できます。</li>
</ul>
<h3 id="提案" class="heading-element"><span>7.1 提案</span>
  <a href="#%e6%8f%90%e6%a1%88" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li><strong>出力の管理に注意を払う</strong>：ソフトウェアを設計する際、ユーザーインタラクションに使用する出力（<code>stdout</code>）とエラー報告やログ記録に使用する出力（<code>stderr</code>）を明確に区別します。これにより、プログラムの可用性と保守性が向上します。</li>
<li><strong>パフォーマンスを最適化する</strong>：特に高頻度のログやデータ出力のシナリオでは、出力操作のパフォーマンスへの影響を考慮します。バッファリングやバッチ処理を適切に使用することで、パフォーマンスへの影響を軽減できます。</li>
<li><strong>セキュリティを考慮する</strong>：出力する前に適切なフィルタリングやデータのマスキングを行い、ログを通じて機密データが漏洩しないようにします。</li>
</ul>
<p><code>stdout</code>と<code>stderr</code>を深く理解し、柔軟に応用することで、より堅牢で管理しやすいPythonアプリケーションを構築し、ログと出力を効果的に処理し、ユーザーエクスペリエンスとアプリケーションの安定性を向上させることができます。</p>
<h2 id="cにおけるバッファリング動作" class="heading-element"><span>8 C++におけるバッファリング動作</span>
  <a href="#c%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b%e3%83%90%e3%83%83%e3%83%95%e3%82%a1%e3%83%aa%e3%83%b3%e3%82%b0%e5%8b%95%e4%bd%9c" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>C++では、<code>stdout</code>（通常は<code>std::cout</code>に対応）と<code>stderr</code>（<code>std::cerr</code>に対応）は異なるバッファリング戦略を持っています：</p>
<ul>
<li><strong><code>std::cout</code></strong> はデフォルトで行バッファリングされており、端末に接続されている場合、出力は各行の終わりでフラッシュされるか、バッファが満たされたときにフラッシュされます。</li>
<li><strong><code>std::cerr</code></strong> はデフォルトでバッファリングされていないため、<code>std::cerr</code>に書き込まれたデータは即座に出力されます。これは、プログラムがクラッシュしてエラーメッセージが出力されないリスクを減少させるため、エラーメッセージの報告に非常に有用です。</li>
</ul>
<h2 id="stdoutとstderrのリダイレクト" class="heading-element"><span>9 <code>stdout</code>と<code>stderr</code>のリダイレクト</span>
  <a href="#stdout%e3%81%a8stderr%e3%81%ae%e3%83%aa%e3%83%80%e3%82%a4%e3%83%ac%e3%82%af%e3%83%88" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>C++プログラムでは、<code>stdout</code>と<code>stderr</code>をリダイレクトするためのさまざまな方法があります。一般的な方法の1つは、プログラムの実行中に<code>freopen</code>関数を使用して標準出力またはエラー出力をファイルにリダイレクトすることです：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">freopen</span><span class="p">(</span><span class="s">&#34;output.txt&#34;</span><span class="p">,</span> <span class="s">&#34;w&#34;</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">freopen</span><span class="p">(</span><span class="s">&#34;error.log&#34;</span><span class="p">,</span> <span class="s">&#34;w&#34;</span><span class="p">,</span> <span class="n">stderr</span><span class="p">);</span></span></span></code></pre></td></tr></table>
</div>
</div><p>この方法は、出力をファイルにリダイレクトし、後で分析やデバッグを行うのに便利です。</p>
<h2 id="cのマルチスレッド環境での使用" class="heading-element"><span>10 C++のマルチスレッド環境での使用</span>
  <a href="#c%e3%81%ae%e3%83%9e%e3%83%ab%e3%83%81%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e7%92%b0%e5%a2%83%e3%81%a7%e3%81%ae%e4%bd%bf%e7%94%a8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>C++のマルチスレッドプログラムで<code>std::cout</code>や<code>std::cerr</code>を使用する際、競合状態が発生し、出力が混乱する可能性があります。このような状況を回避するために、<code>std::mutex</code>などのミューテックスを使用してこれらのストリームへのアクセスを同期することをお勧めします：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;mutex&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;thread&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">mutex</span> <span class="n">cout_mutex</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">thread_function</span><span class="p">(</span><span class="kt">int</span> <span class="n">id</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">lock_guard</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">mutex</span><span class="o">&gt;</span> <span class="n">lock</span><span class="p">(</span><span class="n">cout_mutex</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;Thread &#34;</span> <span class="o">&lt;&lt;</span> <span class="n">id</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; is running</span><span class="se">\\</span><span class="s">n&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="kr">thread</span> <span class="n">t1</span><span class="p">(</span><span class="n">thread_function</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="kr">thread</span> <span class="n">t2</span><span class="p">(</span><span class="n">thread_function</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">t1</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="n">t2</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="cでの出力制御" class="heading-element"><span>11 C++での出力制御</span>
  <a href="#c%e3%81%a7%e3%81%ae%e5%87%ba%e5%8a%9b%e5%88%b6%e5%be%a1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>C++標準ライブラリは<code>std::streambuf</code>を提供しており、<code>std::cout</code>や<code>std::cerr</code>のより細かい制御を実現するために使用できます。これには、リダイレクトやカスタムバッファリング動作の実装が含まれます。<code>std::streambuf</code>を継承し、対応するメンバ関数をオーバーライドすることで、カスタムバッファリング戦略を作成したり、出力をGUIコンポーネントやネットワーク接続などにリダイレクトすることができます。</p>
<h3 id="提案-1" class="heading-element"><span>11.1 提案</span>
  <a href="#%e6%8f%90%e6%a1%88-1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><ul>
<li><strong>バッファを適切に使用する</strong>：アプリケーションのシナリオに応じて適切なバッファリング戦略を選択します。即時フィードバックが必要なエラーメッセージには、<code>std::cerr</code>を使用するか、手動で<code>std::cout</code>をフラッシュします。</li>
<li><strong>マルチスレッドで標準出力を直接使用しない</strong>：出力の一貫性と順序を保証するために、ミューテックスや他の同期メカニズムを使用します。</li>
<li><strong>リダイレクトとカスタム<code>streambuf</code>を使用する</strong>：出力をより柔軟に処理するために、リダイレクトやカスタム<code>streambuf</code>を使用して、ログ記録やネットワーク伝送などの特殊な出力要件を実現します。</li>
</ul>
<p>これらの高度な技術を習得することで、C++プログラムの堅牢性と柔軟性を確保しながら、プログラムの出力を効果的に管理および制御することができます。</p>
]]></description>
    </item>
    <item>
      <title>ウェブページの長いスクリーンショット自動分割ツール</title>
      <link>https://www.zair.top/ja-jp/post/web-page-screenshot-segmentation/</link>
      <pubDate>Tue, 06 Feb 2024 11:29:01 +0000</pubDate><author>blog@zair.top (Tim)</author>
      <guid>https://www.zair.top/ja-jp/post/web-page-screenshot-segmentation/</guid>
      <category domain="https://www.zair.top/ja-jp/categories/tools-applications/">Tools-Applications</category>
      <description><![CDATA[<h2 id="背景" class="heading-element"><span>1 背景</span>
  <a href="#%e8%83%8c%e6%99%af" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>ウェブコンテンツを共有または分析する際、長いスクリーンショットは非常に便利な形式です。ページを完全に表示することができます。しかし、これらの長いスクリーンショットを処理する際に、情報の完全性と可読性を保ちながら後続の操作を容易にすることは常に課題でした。例えば、現在（2024年初頭）の市場にある主流のAI画像モデルは、非常に大きく複雑な画像を処理できません。長いスクリーンショットを無理にモデルに入力すると、モデルの出力性能が低下し（多くの詳細が認識されない）、問題が生じます。この問題を解決するために、OpenCVに基づいたツールを開発し、長いスクリーンショットの処理を簡素化し、その内容の完全性と可読性を保つことを目指しました。</p>
<p>このプロジェクトは私のGithubでオープンソース化されています：<a href="https://github.com/Ryaang/Web-page-Screenshot-Segmentation"target="_blank" rel="external nofollow noopener noreferrer">https://github.com/Ryaang/Web-page-Screenshot-Segmentation<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a></p>
<p>多くの既存のツールや方法とは異なり、Web-page-Screenshot-SegmentationはOpenCVを使用してウェブコンテンツの自然な区切り線を自動で認識し、最適な分割点を見つけます。つまり、タイトル、段落、またはグラフが分割後の画像にきちんと保持され、内容の断裂や欠落が発生しません。</p>
<p>Web-page-Screenshot-Segmentationの使用は非常に簡単で、長いスクリーンショットを用意するだけで、ツールが画像内容を自動で分析し、分割点を賢く決定します。最終的に、一連の完全で構造化された画像が得られ、共有やさらなる処理が容易になります。</p>
<h2 id="介绍" class="heading-element"><span>2 介绍</span>
  <a href="#%e4%bb%8b%e7%bb%8d" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>このプロジェクトは、テキストの高さに基づいてウェブページの長いスクリーンショットをいくつかの部分に分割するためのものです。主な考え方は、画像の低変化領域を見つけ、その低変化領域で分割線を見つけることです。</p>
<p><img loading="lazy" src="https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png" alt="image-20240229161346869" srcset="https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png?size=small, https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png?size=medium 1.5x, https://cdn1.zair.top/images/2024/02/7288ed320d403a17bd010e49cf7c2ea5.png?size=large 2x" data-title="image-20240229161346869" style="background: url(/images/loading.min.svg) no-repeat center;" onload="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}this.dataset.lazyloaded='';" onerror="this.title=this.dataset.title;for(const i of ['style', 'data-title','onerror','onload']){this.removeAttribute(i);}"/></p>
<p>出力されるのは、ウェブページの小さくて完全な画像で、<a href="https://github.com/abi/screenshot-to-code"target="_blank" rel="external nofollow noopener noreferrer">Screen-to-code<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>を使用してウェブページを生成したり、モデルを訓練したりするのに使用できます。より多くの結果は、<a href="https://raw.githubusercontent.com/Ryaang/Web-page-Screenshot-Segmentation/main/images/"target="_blank" rel="external nofollow noopener noreferrer">images<i class="fa-solid fa-external-link-alt fa-fw fa-xs ms-1 text-secondary" aria-hidden="true"></i></a>ディレクトリで見つけることができます。</p>
<h2 id="开始使用" class="heading-element"><span>3 开始使用</span>
  <a href="#%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="安装" class="heading-element"><span>3.1 安装</span>
  <a href="#%e5%ae%89%e8%a3%85" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> pip install Web-page-Screenshot-Segmentation</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="在命令行中使用" class="heading-element"><span>4 在命令行中使用</span>
  <a href="#%e5%9c%a8%e5%91%bd%e4%bb%a4%e8%a1%8c%e4%b8%ad%e4%bd%bf%e7%94%a8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><p>画像の分割線の高さを取得する</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.master -f <span class="s2">&#34;path/to/img&#34;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>出力はリストであるはずです：<code>[6, 868, 1912, 2672, 3568, 4444, 5124, 6036, 7698]</code>。これは画像の分割線の高さのリストです。
画像にこの分割線を表示したい場合は、<code> -s True</code>パラメータを追加できます：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.master -f <span class="s2">&#34;path/to/img&#34;</span> -s True</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="在图像中画出分割线" class="heading-element"><span>4.1 在图像中画出分割线</span>
  <a href="#%e5%9c%a8%e5%9b%be%e5%83%8f%e4%b8%ad%e7%94%bb%e5%87%ba%e5%88%86%e5%89%b2%e7%ba%bf" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.drawer --image_file path/to/image.jpg --hl <span class="o">[</span>100,200<span class="o">]</span> --color <span class="o">(</span>0,255,0<span class="o">)</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="切分图像" class="heading-element"><span>4.2 切分图像</span>
  <a href="#%e5%88%87%e5%88%86%e5%9b%be%e5%83%8f" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python -m Web_page_Screenshot_Segmentation.spliter --f path/to/image.jpg -ht <span class="s2">&#34;[233,456]&#34;</span></span></span></code></pre></td></tr></table>
</div>
</div><p>分割された画像が得られ、コマンドの戻り値のパスに保存されます。</p>
<p>より多くの使用法の説明は、ヘルプを参照してください：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">python master.py --help
</span></span><span class="line"><span class="cl">python spliter.py --help</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="从源码使用" class="heading-element"><span>5 从源码使用</span>
  <a href="#%e4%bb%8e%e6%ba%90%e7%a0%81%e4%bd%bf%e7%94%a8" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h2><h3 id="split_heights-函数" class="heading-element"><span>5.1 split_heights 函数</span>
  <a href="#split_heights-%e5%87%bd%e6%95%b0" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><code>split_heights</code> 関数は、さまざまな閾値に基づいて画像をいくつかの部分に分割するために使用されます。以下のパラメータを受け取ります：</p>
<ul>
<li><code>file_path</code>: 画像ファイルのパス。</li>
<li><code>split</code>: 画像を分割するかどうかを示すブール値。</li>
<li><code>height_threshold</code>: 低変化領域の高さの閾値。</li>
<li><code>variation_threshold</code>: 低変化領域の変化の閾値。</li>
<li><code>color_threshold</code>: 色差の閾値。</li>
<li><code>color_variation_threshold</code>: 色差変化の閾値。</li>
<li><code>merge_threshold</code>: 2本の線の間の最小距離の閾値。</li>
</ul>
<p><code>split</code> が <code>False</code> の場合、関数は分割線の高さのリストを返します。<code>split</code> が <code>True</code> の場合、分割された画像のパスを返します。</p>
<h4 id="示例用法" class="heading-element"><span>5.1.1 示例用法</span>
  <a href="#%e7%a4%ba%e4%be%8b%e7%94%a8%e6%b3%95" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">Web_page_Screenshot_Segmentation</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Web_page_Screenshot_Segmentation.master</span> <span class="kn">import</span> <span class="n">split_heights</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># &#39;path/to/image.jpg&#39; をいくつかの部分に分割する</span>
</span></span><span class="line"><span class="cl"><span class="n">split_image_path</span> <span class="o">=</span> <span class="n">split_heights</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">file_path</span><span class="o">=</span><span class="s1">&#39;path/to/image.jpg&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">split</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">height_threshold</span><span class="o">=</span><span class="mi">102</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">variation_threshold</span><span class="o">=</span><span class="mf">0.5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">color_threshold</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">color_variation_threshold</span><span class="o">=</span><span class="mi">15</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">merge_threshold</span><span class="o">=</span><span class="mi">350</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;分割された画像は </span><span class="si">{</span><span class="n">split_image_path</span><span class="si">}</span><span class="s2"> に保存されました&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>この例では、提供された閾値に基づいて、&lsquo;path/to/image.jpg&rsquo; の画像がいくつかの部分に分割されます。分割された画像は関数の戻り値のパスに保存されます。</p>
<h3 id="draw_line_from_file-函数" class="heading-element"><span>5.2 draw_line_from_file 函数</span>
  <a href="#draw_line_from_file-%e5%87%bd%e6%95%b0" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h3><p><code>draw_line_from_file</code> 関数は、指定された高さの画像に線を描画するために使用されます。以下のパラメータを受け取ります：</p>
<ul>
<li><code>image_file</code>: 画像ファイルのパス。</li>
<li><code>heights</code>: 指定された高さに線を描画する高さのリスト。</li>
<li><code>color</code>: 線の色。デフォルトの色は赤 <code>(0, 0, 255)</code> です。</li>
</ul>
<p>この関数は、提供されたファイルパスから画像を読み込み、指定された高さに線を描画し、変更された画像を新しいファイルに保存します。新しいファイルは <code>result</code> ディレクトリに保存され、元のファイルと同じ名前ですが、ファイル拡張子の前に &lsquo;result&rsquo; が追加されています。</p>
<p>関数が画像ファイルの読み込み中にエラーに遭遇した場合（例えば、ファイルパスに &lsquo;.&rsquo; や日本語文字が含まれている場合）、例外がスローされます。</p>
<h4 id="示例用法-1" class="heading-element"><span>5.2.1 示例用法</span>
  <a href="#%e7%a4%ba%e4%be%8b%e7%94%a8%e6%b3%95-1" class="heading-mark">
    <svg class="octicon octicon-link" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="m7.775 3.275 1.25-1.25a3.5 3.5 0 1 1 4.95 4.95l-2.5 2.5a3.5 3.5 0 0 1-4.95 0 .751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018 1.998 1.998 0 0 0 2.83 0l2.5-2.5a2.002 2.002 0 0 0-2.83-2.83l-1.25 1.25a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042Zm-4.69 9.64a1.998 1.998 0 0 0 2.83 0l1.25-1.25a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042l-1.25 1.25a3.5 3.5 0 1 1-4.95-4.95l2.5-2.5a3.5 3.5 0 0 1 4.95 0 .751.751 0 0 1-.018 1.042.751.751 0 0 1-1.042.018 1.998 1.998 0 0 0-2.83 0l-2.5 2.5a1.998 1.998 0 0 0 0 2.83Z"></path></svg>
  </a>
</h4><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">Web_page_Screenshot_Segmentation</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">Web_page_Screenshot_Segmentation.spliter</span> <span class="kn">import</span> <span class="n">draw_line_from_file</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># &#39;path/to/image.jpg&#39; の画像に、高さ 100 と 200 に線を描画する</span>
</span></span><span class="line"><span class="cl"><span class="n">result_image_path</span> <span class="o">=</span> <span class="n">draw_line_from_file</span><span class="p">(</span>
</span></span><span class="line"><span class="cl">    <span class="n">image_file</span><span class="o">=</span><span class="s1">&#39;path/to/image.jpg&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">heights</span><span class="o">=</span><span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">200</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">    <span class="n">color</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>  <span class="c1"># 緑色で線を描画</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;変更された画像は </span><span class="si">{</span><span class="n">result_image_path</span><span class="si">}</span><span class="s2"> に保存されました&#34;</span><span class="p">)</span></span></span></code></pre></td></tr></table>
</div>
</div><p>この例では、&lsquo;path/to/image.jpg&rsquo; の画像が変更され、高さ 100 と 200 に緑色の線が描画されます。変更された画像は関数の戻り値のパスに保存されます。</p>
]]></description>
    </item>
  </channel>
</rss>
