<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jenny Met</title>
    <description>The latest articles on DEV Community by Jenny Met (@xujfcn).</description>
    <link>https://dev.to/xujfcn</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3789823%2F2c9e4c1c-52be-4e47-b75c-c97051adb99c.png</url>
      <title>DEV Community: Jenny Met</title>
      <link>https://dev.to/xujfcn</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xujfcn"/>
    <language>en</language>
    <item>
      <title>text-embedding-3-large で RAG ナレッジベースを作る：チャンク分割から検索順位付けまで</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 10:52:26 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-de-rag-naretuzibesuwozuo-rutiyankufen-ge-karajian-suo-shun-wei-fu-kemade-429k</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-de-rag-naretuzibesuwozuo-rutiyankufen-ge-karajian-suo-shun-wei-fu-kemade-429k</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large で RAG ナレッジベースを作る：チャンク分割から検索順位付けまで
&lt;/h1&gt;

&lt;p&gt;多くのRAGデモは一見シンプルです。PDFをアップロードして、質問するとAIが答えてくれる。&lt;/p&gt;

&lt;p&gt;でも実際に本番運用しようとすると、すぐに課題が出てきます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ドキュメントが長すぎて、そのままではコンテキストに入りきらない&lt;/li&gt;
&lt;li&gt;キーワード検索では意味が近い内容を見つけられない&lt;/li&gt;
&lt;li&gt;ユーザーの質問は口語的、ドキュメントは形式的でギャップが大きい&lt;/li&gt;
&lt;li&gt;検索結果が的外れだと、モデルが「それっぽく」作り話を始める&lt;/li&gt;
&lt;li&gt;データ量が増えると、検索速度やコストが一気に上がる&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; が解決するのは、まさにこの中核部分、&lt;strong&gt;質問とドキュメントを比較可能な意味ベクトルに変換すること&lt;/strong&gt;です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnk2qn51gfxp6feeavno.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnk2qn51gfxp6feeavno.webp" alt="RAG knowledge base architecture with embeddings" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;この記事では抽象的な話は抜きにして、エンジニア視点で実践的なRAG構築フローを解説します。&lt;/p&gt;

&lt;h2&gt;
  
  
  RAGシステムの基本構成
&lt;/h2&gt;

&lt;p&gt;一般的なRAGナレッジベースは、オフラインとオンラインの2つの処理チェーンに分かれます。&lt;/p&gt;

&lt;p&gt;まずはオフラインのインデックス作成フロー：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ドキュメント収集&lt;/li&gt;
&lt;li&gt;テキストのクレンジング&lt;/li&gt;
&lt;li&gt;チャンク分割（chunking）&lt;/li&gt;
&lt;li&gt;embeddingモデルでベクトル化&lt;/li&gt;
&lt;li&gt;ベクトルDBに保存&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;次にオンラインのQAフロー：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ユーザーが質問&lt;/li&gt;
&lt;li&gt;質問をembedding化&lt;/li&gt;
&lt;li&gt;ベクトルDBで類似チャンクを検索&lt;/li&gt;
&lt;li&gt;（任意）rerankで再順位付け&lt;/li&gt;
&lt;li&gt;コンテキストを組み立て&lt;/li&gt;
&lt;li&gt;チャットモデルで回答生成&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;この流れの中で、&lt;code&gt;text-embedding-3-large&lt;/code&gt; は主に4番目と、オンラインの2番目で使われます。&lt;/p&gt;

&lt;p&gt;最終的な回答は生成しませんが、モデルが正しい情報にアクセスできるかどうかを左右します。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ1：ドキュメント準備とチャンク分割
&lt;/h2&gt;

&lt;p&gt;RAGの品質はチャンク設計に大きく左右されます。&lt;/p&gt;

&lt;p&gt;チャンクが大きすぎると、ノイズが増えて無関係な情報まで拾ってしまう。&lt;/p&gt;

&lt;p&gt;逆に小さすぎると、文脈が切れて必要な情報が足りなくなる。&lt;/p&gt;

&lt;p&gt;よく使われる目安は以下の通りです：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ドキュメント種別&lt;/th&gt;
&lt;th&gt;推奨チャンクサイズ&lt;/th&gt;
&lt;th&gt;オーバーラップ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FAQ・ヘルプセンター&lt;/td&gt;
&lt;td&gt;200-500トークン&lt;/td&gt;
&lt;td&gt;30-80トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技術ドキュメント&lt;/td&gt;
&lt;td&gt;400-800トークン&lt;/td&gt;
&lt;td&gt;80-120トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レポート・論文&lt;/td&gt;
&lt;td&gt;600-1000トークン&lt;/td&gt;
&lt;td&gt;100-150トークン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コードドキュメント&lt;/td&gt;
&lt;td&gt;関数/クラス/見出し単位&lt;/td&gt;
&lt;td&gt;ケースバイケース&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;チャンク分割のサンプルコード：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chunk_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;
        &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;本番環境では単純なスペース区切りではなく、見出し・段落・リスト・コードブロックの境界で分割するのが理想です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ2：text-embedding-3-large でベクトル化
&lt;/h2&gt;

&lt;p&gt;以下はOpenAI互換APIを使った例です。同じSDKで &lt;code&gt;/v1/embeddings&lt;/code&gt; エンドポイントを呼び出せます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ベクトルの次元数を指定したい場合は、&lt;code&gt;dimensions&lt;/code&gt; パラメータを追加します：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;次元数を下げるとストレージや検索コストは下がりますが、検索精度も落ちる可能性があります。実際のクエリでA/Bテストするのがおすすめです。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ3：ベクトルDBに保存
&lt;/h2&gt;

&lt;p&gt;小規模な検証ならローカルファイルやSQLiteでも動きますが、本番運用では専用のベクトルDBを使いましょう。&lt;/p&gt;

&lt;p&gt;代表的な選択肢：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ツール&lt;/th&gt;
&lt;th&gt;適した用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pgvector&lt;/td&gt;
&lt;td&gt;既存のPostgreSQLを活用したい場合&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qdrant&lt;/td&gt;
&lt;td&gt;独立型ベクトルDB、導入が簡単でフィルタ機能が強力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Milvus&lt;/td&gt;
&lt;td&gt;大規模ベクトル検索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinecone&lt;/td&gt;
&lt;td&gt;フルマネージド型、運用不要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weaviate&lt;/td&gt;
&lt;td&gt;スキーマやハイブリッド検索対応&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;どのDBでも、各チャンクには最低限以下の情報を持たせるのが推奨です：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"doc_001_chunk_003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chunk content here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"embedding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-0.0456&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing-guide.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Billing Guide"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Token pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-18"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;メタデータは非常に重要です。製品・言語・日付・権限などで柔軟に検索結果を絞り込めます。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ4：検索時のセマンティック検索
&lt;/h2&gt;

&lt;p&gt;ユーザーが質問したら、まずembedding化してからベクトルDBで類似チャンクを検索します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;query_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;language&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ベクトルDBを使わずに、numpyでコサイン類似度を計算するサンプルも：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ただし、数万件を超えるとベクトルDBを使うべきです。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ5：rerankで「的外れ回答」を減らす
&lt;/h2&gt;

&lt;p&gt;Embedding検索は「粗い」検索です。高速ですが、必ずしも最適な順序とは限りません。&lt;/p&gt;

&lt;p&gt;Rerankは「精密」な再順位付け。クエリと候補ドキュメントの関連度を再評価します。&lt;/p&gt;

&lt;p&gt;おすすめの流れ：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;embeddingでtop20を取得&lt;/li&gt;
&lt;li&gt;rerankで順位付け&lt;/li&gt;
&lt;li&gt;最終的にtop5をチャットモデルに渡す&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;embeddingのtop5をそのまま使うより、安定した精度が出ます。特に以下のようなケースで有効です：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;技術ドキュメントQA&lt;/li&gt;
&lt;li&gt;カスタマーサポートナレッジ&lt;/li&gt;
&lt;li&gt;法務・財務資料&lt;/li&gt;
&lt;li&gt;多言語コンテンツ&lt;/li&gt;
&lt;li&gt;ドキュメント数が多く、タイトルが似ている場合&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crazyrouterは &lt;code&gt;/v1/rerank&lt;/code&gt; のような再順位付けエンドポイントを提供しているので、RAGの検索パイプラインに組み込むのが簡単です。&lt;/p&gt;

&lt;h2&gt;
  
  
  ステップ6：検索結果をチャットモデルに渡す
&lt;/h2&gt;

&lt;p&gt;検索したチャンクをプロンプトとして組み立てます：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Source: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
あなたは厳密なナレッジベースアシスタントです。
以下の資料だけを根拠に質問に答えてください。
資料に答えがなければ「資料中に見つかりませんでした」と返答してください。

資料：
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

質問：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;そしてチャットモデルで回答を生成します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;build_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ここでembeddingモデルとチャットモデルは役割が分かれています：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;text-embedding-3-large&lt;/code&gt;：関連資料の検索&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-5-mini&lt;/code&gt; / Claude / Gemini：資料をもとに回答を生成&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large の多言語RAGでの強み
&lt;/h2&gt;

&lt;p&gt;多くのチームでは、ドキュメントが単一言語とは限りません。&lt;/p&gt;

&lt;p&gt;例えば：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;英語APIドキュメント&lt;/li&gt;
&lt;li&gt;中国語ヘルプセンター&lt;/li&gt;
&lt;li&gt;日本語ユーザーマニュアル&lt;/li&gt;
&lt;li&gt;韓国語コミュニティ記事&lt;/li&gt;
&lt;li&gt;ベトナム語チュートリアル&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;多言語RAGの難しさは、ユーザーの質問と言語が異なる資料に答えがある場合です。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; は公式にも英語・非英語の両方に強いembeddingモデルとされています。クロスリンガル検索用途では、まず候補としてテストする価値があります。&lt;/p&gt;

&lt;p&gt;ただし、公式ベンチマークだけでなく、自分のデータで評価しましょう。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;クエリ&lt;/th&gt;
&lt;th&gt;正解ドキュメント&lt;/th&gt;
&lt;th&gt;言語&lt;/th&gt;
&lt;th&gt;召喚できたか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;余额为什么扣费快？&lt;/td&gt;
&lt;td&gt;billing-token-cost.md&lt;/td&gt;
&lt;td&gt;zh&lt;/td&gt;
&lt;td&gt;yes/no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;how to set API base URL&lt;/td&gt;
&lt;td&gt;quickstart.md&lt;/td&gt;
&lt;td&gt;en&lt;/td&gt;
&lt;td&gt;yes/no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code 怎么配置？&lt;/td&gt;
&lt;td&gt;integrations/claude-code.md&lt;/td&gt;
&lt;td&gt;zh&lt;/td&gt;
&lt;td&gt;yes/no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;最終的にはtop3/top5の召喚率で評価します。&lt;/p&gt;

&lt;h2&gt;
  
  
  本番運用のためのTips
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 増分インデックスで効率化
&lt;/h3&gt;

&lt;p&gt;ドキュメント更新時は、変更があったチャンクだけ再ベクトル化しましょう。&lt;/p&gt;

&lt;p&gt;各チャンクにハッシュ値を保存しておくと便利です：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;content_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ハッシュが変わらなければ再処理不要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. バッチembeddingを活用
&lt;/h3&gt;

&lt;p&gt;1件ずつAPIを呼ぶのは非効率です。Embeddings APIは通常バッチ入力に対応しています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;chunk1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これで高速化＆リクエスト数のコントロールがしやすくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. ハイブリッド検索を組み合わせる
&lt;/h3&gt;

&lt;p&gt;ベクトル検索だけだと、エラーコード・注文番号・関数名などの完全一致ワードを見逃すことがあります。&lt;/p&gt;

&lt;p&gt;より堅牢な方法は：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BM25やキーワード検索&lt;/li&gt;
&lt;li&gt;ベクトル検索&lt;/li&gt;
&lt;li&gt;結果をマージ&lt;/li&gt;
&lt;li&gt;rerankで最終順位付け&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 回答に出典を明記
&lt;/h3&gt;

&lt;p&gt;答えだけでなく、参照元のタイトルやリンクも一緒に出すのがベストです。&lt;/p&gt;

&lt;p&gt;ユーザーの信頼性が上がり、誤った召喚の検証もしやすくなります。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 権限付き検索
&lt;/h3&gt;

&lt;p&gt;企業ナレッジベースでは必須です。&lt;/p&gt;

&lt;p&gt;「検索後にフィルタ」ではなく、「ベクトルDB検索時に権限条件を付与」しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくあるトラブルと対策
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;問題&lt;/th&gt;
&lt;th&gt;主な原因&lt;/th&gt;
&lt;th&gt;解決策&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;正しいドキュメントが見つからない&lt;/td&gt;
&lt;td&gt;チャンクサイズ不適切、クエリが短すぎ&lt;/td&gt;
&lt;td&gt;チャンク調整、クエリリライト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;回答が誤った資料を参照&lt;/td&gt;
&lt;td&gt;top_kが小さい、rerank未導入&lt;/td&gt;
&lt;td&gt;top20＋rerank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レイテンシが高い&lt;/td&gt;
&lt;td&gt;毎回ドキュメントをembedding化&lt;/td&gt;
&lt;td&gt;ドキュメントはオフラインで、クエリのみリアルタイムembedding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コストが急増&lt;/td&gt;
&lt;td&gt;重複インデックス、次元数が高すぎ&lt;/td&gt;
&lt;td&gt;ハッシュで重複排除、次元数テスト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多言語検索が弱い&lt;/td&gt;
&lt;td&gt;モデルが多言語非対応&lt;/td&gt;
&lt;td&gt;largeモデルをテスト、多言語評価セット作成&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large を使わなくてもいいケース
&lt;/h2&gt;

&lt;p&gt;全てのプロジェクトで最高性能embeddingが必要なわけではありません。&lt;/p&gt;

&lt;p&gt;例えば：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;データ量が少なく、キーワード検索で十分な場合&lt;/li&gt;
&lt;li&gt;管理画面など、検索精度にこだわらない用途&lt;/li&gt;
&lt;li&gt;予算が限られていて、FAQなど単一言語が中心&lt;/li&gt;
&lt;li&gt;まだMVP段階で、実際のクエリデータがない&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;現実的には、まずsmall/large両方で実際のクエリを使って召喚率を比較し、必要ならアップグレードするのが良いでしょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ：RAGの成否は「検索」が半分
&lt;/h2&gt;

&lt;p&gt;どんなに強力なチャットモデルでも、間違ったコンテキストを渡せば、真面目に間違った答えを返します。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; の価値は、意味ベースで資料を探せること。キーワードだけに頼る運任せから脱却できます。&lt;/p&gt;

&lt;p&gt;本番RAGを作るなら、以下の順序で進めるのがおすすめです：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;実際のドキュメントを整理&lt;/li&gt;
&lt;li&gt;適切なチャンク分割&lt;/li&gt;
&lt;li&gt;text-embedding-3-largeでベクトルインデックス作成&lt;/li&gt;
&lt;li&gt;実ユーザーの質問でtop5召喚率を評価&lt;/li&gt;
&lt;li&gt;rerankを追加&lt;/li&gt;
&lt;li&gt;プロンプトやチャットモデルを最適化&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OpenAI互換SDKで &lt;a href="https://docs.crazyrouter.com?utm_source=zenn&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;Crazyrouter embeddings API&lt;/a&gt; を使えば、同じ&lt;code&gt;base_url&lt;/code&gt;でembedding・rerank・チャットモデルをまとめて呼び出せるので、RAGパイプラインの構築がスムーズです。&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  RAGナレッジベースには必ずtext-embedding-3-largeが必要ですか？
&lt;/h3&gt;

&lt;p&gt;必須ではありません。高品質・多言語・本番用途ならおすすめですが、小規模ならコスト重視で他のembeddingモデルから始めてもOKです。&lt;/p&gt;

&lt;h3&gt;
  
  
  チャンクサイズはどれくらいが最適？
&lt;/h3&gt;

&lt;p&gt;決まった正解はありません。技術ドキュメントなら400-800トークン、FAQならもっと短めから始めて、実際のクエリで召喚率を見て調整しましょう。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-largeはpgvectorと組み合わせられますか？
&lt;/h3&gt;

&lt;p&gt;はい。生成したベクトルをPostgreSQLのpgvector型に格納し、ベクトル類似度検索が可能です。&lt;/p&gt;

&lt;h3&gt;
  
  
  embeddingで資料を見つけたのに、モデルが誤答するのはなぜ？
&lt;/h3&gt;

&lt;p&gt;召喚内容にノイズが多い、プロンプトが制限されていない、モデルが出典を無視する、複数資料の統合推論が必要などが考えられます。rerankや出典制約を追加しましょう。&lt;/p&gt;

&lt;h3&gt;
  
  
  RAGにrerankは必要？
&lt;/h3&gt;

&lt;p&gt;本番運用なら推奨です。embeddingで高速召喚、rerankで精密順位付け。この組み合わせが最も安定します。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>embeddings</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large は使うべき？small とのコスト・品質・選び方</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:51:10 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-hashi-ubekismall-tonokosutopin-zhi-xuan-bifang-2458</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-hashi-ubekismall-tonokosutopin-zhi-xuan-bifang-2458</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large は使うべき？small とのコスト・品質・選び方
&lt;/h1&gt;

&lt;p&gt;RAG やセマンティック検索を導入する際、多くの開発者が悩むのがこの問題です。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;結局、&lt;code&gt;text-embedding-3-large&lt;/code&gt; を使うべきか、それとも安価な &lt;code&gt;text-embedding-3-small&lt;/code&gt; で十分なのか？&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;答えは「large が常に最良」でも「small で十分」でもありません。&lt;/p&gt;

&lt;p&gt;より正確に言うと、&lt;strong&gt;検索品質がビジネス成果に直結するなら large をテストする価値あり。プロジェクト初期やデータ量が膨大な場合は small から始めるのが堅実です。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" alt="embedding model cost and quality comparison dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;この記事では、実際のプロジェクト視点で embedding モデル選定のポイントを解説します。&lt;/p&gt;

&lt;h2&gt;
  
  
  まず結論：どう選ぶ？
&lt;/h2&gt;

&lt;p&gt;この表を参考にしてください。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;シーン&lt;/th&gt;
&lt;th&gt;推奨スタート&lt;/th&gt;
&lt;th&gt;理由&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;企業ナレッジベースQA&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;検索品質が最重要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多言語RAG&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;非英語・クロス言語検索の精度向上&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;カスタマーサポートBot&lt;/td&gt;
&lt;td&gt;large/smallでA/Bテスト&lt;/td&gt;
&lt;td&gt;誤回答のコスト次第&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;社内ツール検索&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;コスト優先・許容度高め&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MVP / デモ&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;まずは動作確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大規模ドキュメントインデックス&lt;/td&gt;
&lt;td&gt;small または large の次元削減&lt;/td&gt;
&lt;td&gt;ストレージ・検索コスト抑制&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コード/技術ドキュメント検索&lt;/td&gt;
&lt;td&gt;large + rerank&lt;/td&gt;
&lt;td&gt;セマンティック＆精度両立&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;一言でまとめるなら、&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;まず small でベースラインを作り、large で実際のクエリを評価してみましょう。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large の強み
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; は高性能な embedding モデルです。&lt;/p&gt;

&lt;p&gt;OpenAI公式ドキュメントによると、デフォルトで3072次元ベクトルを出力し、最大入力は8192トークン。英語・非英語問わず高精度な埋め込みを狙ったモデルです。&lt;/p&gt;

&lt;p&gt;主な強みは以下の通りです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;より強力なセマンティック表現&lt;/li&gt;
&lt;li&gt;複雑なクエリへの対応力&lt;/li&gt;
&lt;li&gt;多言語・クロス言語検索に強い&lt;/li&gt;
&lt;li&gt;長文ドキュメントにも対応しやすい&lt;/li&gt;
&lt;li&gt;本番RAG用途の有力候補&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ただし、コスト面では&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1トークンあたりのAPIコストが高い&lt;/li&gt;
&lt;li&gt;デフォルトのベクトル次元数が大きい&lt;/li&gt;
&lt;li&gt;ベクトルDBのストレージコスト増&lt;/li&gt;
&lt;li&gt;検索時のメモリ・インデックス負荷増&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;といったデメリットもあります。&lt;/p&gt;

&lt;p&gt;つまり、large を選ぶなら「品質向上が追加コストを上回る」ことが前提です。&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-small が向いているケース
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-small&lt;/code&gt; はコスト効率重視のモデルです。&lt;/p&gt;

&lt;p&gt;向いている用途は&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FAQ検索&lt;/li&gt;
&lt;li&gt;小規模ナレッジベース&lt;/li&gt;
&lt;li&gt;初期MVP&lt;/li&gt;
&lt;li&gt;社内検索ツール&lt;/li&gt;
&lt;li&gt;単一言語のコンテンツ&lt;/li&gt;
&lt;li&gt;検索ミスにある程度寛容な場面&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;多くのプロジェクトは、最初から large を使う必要はありません。&lt;/p&gt;

&lt;p&gt;特に、実際のユーザーの質問や評価データ、フィードバックがまだ無い段階では、「大きい embedding の方が安心」と感じても、その効果を証明できません。&lt;/p&gt;

&lt;h2&gt;
  
  
  コストはAPI料金だけじゃない
&lt;/h2&gt;

&lt;p&gt;Embedding のコストは API の利用料だけではありません。&lt;/p&gt;

&lt;p&gt;他にも以下のコストが発生します。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;コスト項目&lt;/th&gt;
&lt;th&gt;影響要因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API利用料&lt;/td&gt;
&lt;td&gt;入力トークン数・再インデックス頻度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ベクトルDBストレージ&lt;/td&gt;
&lt;td&gt;ドキュメント数・チャンク数・ベクトル次元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;検索レイテンシ&lt;/td&gt;
&lt;td&gt;インデックス規模・次元数・top_k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;メモリ/ディスク&lt;/td&gt;
&lt;td&gt;ベクトル数・精度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;運用コスト&lt;/td&gt;
&lt;td&gt;インデックス再構築・バージョン移行・評価&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;例えば、&lt;/p&gt;

&lt;p&gt;100万チャンク、1ベクトル3072次元、float32で保存した場合、ベクトルデータだけで&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000,000 × 3072 × 4 bytes ≈ 12.3 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;となります。&lt;/p&gt;

&lt;p&gt;1536次元にすれば約半分です。&lt;/p&gt;

&lt;p&gt;これにインデックス構造やメタデータ、DBのオーバーヘッドも加わります。&lt;/p&gt;

&lt;p&gt;大規模運用では &lt;code&gt;dimensions&lt;/code&gt; パラメータとベクトルDBコストに要注意です。&lt;/p&gt;

&lt;h2&gt;
  
  
  dimensions パラメータの使い方
&lt;/h2&gt;

&lt;p&gt;OpenAI 第三世代 embedding モデルは &lt;code&gt;dimensions&lt;/code&gt; で出力ベクトルの次元数を指定できます。&lt;/p&gt;

&lt;p&gt;例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How to reduce AI API cost with model routing?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これは本番環境で非常に役立ちます。&lt;/p&gt;

&lt;p&gt;例えば&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large 3072次元&lt;/li&gt;
&lt;li&gt;large 1536次元&lt;/li&gt;
&lt;li&gt;large 1024次元&lt;/li&gt;
&lt;li&gt;small デフォルト次元&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;などでテストし、top 5 のリコール率・レイテンシ・コストを比較しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  MTEBスコアだけで選ばない
&lt;/h2&gt;

&lt;p&gt;公開ベンチマークは参考になりますが、それが最終判断基準ではありません。&lt;/p&gt;

&lt;p&gt;実際のビジネスデータはベンチマークと大きく異なることが多いです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ユーザーの質問が短い&lt;/li&gt;
&lt;li&gt;ドキュメントが日英混在&lt;/li&gt;
&lt;li&gt;製品名やエラーコードが多い&lt;/li&gt;
&lt;li&gt;表やパラメータ説明が多い&lt;/li&gt;
&lt;li&gt;口語表現が多用される&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;自分のデータで小さな評価セットを作るのがベストです。&lt;/p&gt;

&lt;p&gt;シンプルなフォーマット例：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;クエリ&lt;/th&gt;
&lt;th&gt;正解ドキュメント&lt;/th&gt;
&lt;th&gt;種別&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;残高の確認方法は？&lt;/td&gt;
&lt;td&gt;billing.md&lt;/td&gt;
&lt;td&gt;FAQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;base_url には何を入れる？&lt;/td&gt;
&lt;td&gt;quickstart.md&lt;/td&gt;
&lt;td&gt;technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code の設定方法は？&lt;/td&gt;
&lt;td&gt;claude-code.md&lt;/td&gt;
&lt;td&gt;integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API呼び出しで401エラーが出た場合？&lt;/td&gt;
&lt;td&gt;auth-errors.md&lt;/td&gt;
&lt;td&gt;troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;各モデルで top 3 / top 5 に正解が入るか確認しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  実践的なA/Bテスト手順
&lt;/h2&gt;

&lt;p&gt;おすすめの評価フローは以下です。&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 50〜200件の実クエリを用意
&lt;/h3&gt;

&lt;p&gt;自作ではなく、できるだけ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;サイト内検索ログ&lt;/li&gt;
&lt;li&gt;サポート問い合わせ&lt;/li&gt;
&lt;li&gt;ユーザーコミュニティの質問&lt;/li&gt;
&lt;li&gt;チケットタイトル&lt;/li&gt;
&lt;li&gt;ドキュメントコメント&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;などから収集しましょう。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 正解ドキュメントをアノテーション
&lt;/h3&gt;

&lt;p&gt;各クエリに対し、1〜3件の正解チャンクやドキュメントを紐付けます。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 複数のインデックスを作成
&lt;/h3&gt;

&lt;p&gt;例：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;index_small_default&lt;/li&gt;
&lt;li&gt;index_large_3072&lt;/li&gt;
&lt;li&gt;index_large_1536&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. リコール評価を実施
&lt;/h3&gt;

&lt;p&gt;主な指標：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指標&lt;/th&gt;
&lt;th&gt;意味&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recall@3&lt;/td&gt;
&lt;td&gt;上位3件に正解が含まれるか&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall@5&lt;/td&gt;
&lt;td&gt;上位5件に正解が含まれるか&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;正解が上位ほど高評価&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;latency&lt;/td&gt;
&lt;td&gt;クエリ応答速度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cost&lt;/td&gt;
&lt;td&gt;インデックス・検索コスト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5. large へのアップグレード判断
&lt;/h3&gt;

&lt;p&gt;large で1%しか改善しないのにコストが大幅増なら、無理に使う必要はありません。&lt;/p&gt;

&lt;p&gt;逆に、Recall@5 が78%→90%に上がり、ビジネス的に精度が重要なら、large を選ぶ価値は十分あります。&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG の品質問題＝embedding モデルのせいとは限らない
&lt;/h2&gt;

&lt;p&gt;large に変えても改善しない場合、他に原因があることが多いです。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;問題&lt;/th&gt;
&lt;th&gt;症状&lt;/th&gt;
&lt;th&gt;優先対応&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;chunk 切り方が悪い&lt;/td&gt;
&lt;td&gt;コンテキストが不完全&lt;/td&gt;
&lt;td&gt;再チャンク&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;metadata 不足&lt;/td&gt;
&lt;td&gt;言語・権限・製品で絞れない&lt;/td&gt;
&lt;td&gt;metadata追加&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;クエリが短すぎる&lt;/td&gt;
&lt;td&gt;「課金問題」などで不安定&lt;/td&gt;
&lt;td&gt;クエリリライト&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ドキュメントが古い&lt;/td&gt;
&lt;td&gt;古い情報がヒットする&lt;/td&gt;
&lt;td&gt;更新日・バージョンで絞る&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rerank 未導入&lt;/td&gt;
&lt;td&gt;上位が似てるだけで不正確&lt;/td&gt;
&lt;td&gt;rerank追加&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;プロンプトが緩い&lt;/td&gt;
&lt;td&gt;モデルが常識で回答&lt;/td&gt;
&lt;td&gt;情報ソース限定プロンプト&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;まずは RAG パイプライン全体の品質を見直しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAI互換APIでembeddingモデルを切り替える
&lt;/h2&gt;

&lt;p&gt;OpenAI SDK を使っている場合、モデル切り替えは簡単です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# コスト重視
&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 品質重視
&lt;/span&gt;&lt;span class="n"&gt;large&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crazyrouter のような OpenAI 互換ゲートウェイを使えば、SDKはそのままでモデル名と base URL を変えるだけでOKです。&lt;/p&gt;

&lt;p&gt;まずは &lt;a href="https://crazyrouter.com/playground?utm_source=zenn&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;Crazyrouter Playground&lt;/a&gt; で動作確認し、同じパラメータをサーバー側に適用しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  推奨プロジェクトロードマップ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  フェーズ1：MVP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;text-embedding-3-small を利用&lt;/li&gt;
&lt;li&gt;ローカル or pgvector で保存&lt;/li&gt;
&lt;li&gt;top 5 検索&lt;/li&gt;
&lt;li&gt;rerank など複雑な処理は省略&lt;/li&gt;
&lt;li&gt;まずは動作することが目標&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  フェーズ2：実データ評価
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ユーザークエリを収集&lt;/li&gt;
&lt;li&gt;正解ドキュメントをアノテーション&lt;/li&gt;
&lt;li&gt;small vs large で比較&lt;/li&gt;
&lt;li&gt;chunk戦略を調整&lt;/li&gt;
&lt;li&gt;ボトルネック特定が目標&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  フェーズ3：本番最適化
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;large または large の次元削減版を利用&lt;/li&gt;
&lt;li&gt;ハイブリッド検索導入&lt;/li&gt;
&lt;li&gt;rerank追加&lt;/li&gt;
&lt;li&gt;権限フィルタ追加&lt;/li&gt;
&lt;li&gt;情報ソースの引用表示&lt;/li&gt;
&lt;li&gt;安定性・説明性・コスト制御が目標&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  結論：large はデフォルトではないが、真剣にテストする価値あり
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; の強みは高いセマンティック表現力。高品質RAG、多言語ナレッジベース、複雑な検索には特に有効です。&lt;/p&gt;

&lt;p&gt;ただし、最強モデルを盲目的に選ぶのは避けましょう。&lt;/p&gt;

&lt;p&gt;おすすめの進め方は&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;small でコスト・品質のベースラインを作る&lt;/li&gt;
&lt;li&gt;実クエリで large の効果を評価&lt;/li&gt;
&lt;li&gt;dimensions でベクトル次元を調整&lt;/li&gt;
&lt;li&gt;rerank やハイブリッド検索も活用（モデル変更だけに頼らない）&lt;/li&gt;
&lt;li&gt;ビジネス上の誤答コストでアップグレード判断&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;RAG の結果がユーザー体験や売上に直結するなら、&lt;code&gt;text-embedding-3-large&lt;/code&gt; は十分検討に値します。&lt;/p&gt;

&lt;p&gt;一方、社内ツールや初期検証なら small から始めるのが現実的です。&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large は text-embedding-3-small より必ず優れている？
&lt;/h3&gt;

&lt;p&gt;基本的に性能は上ですが、すべてのプロジェクトでコストに見合うとは限りません。実クエリでのリコール向上がコストを上回るかで判断しましょう。&lt;/p&gt;

&lt;h3&gt;
  
  
  dimensions を下げると品質は落ちる？
&lt;/h3&gt;

&lt;p&gt;影響する可能性があります。次元削減でストレージ・検索コストは下がりますが、リコール精度が下がる場合も。自分の評価セットで検証をおすすめします。&lt;/p&gt;

&lt;h3&gt;
  
  
  RAG プロジェクトはモデル最適化とチャンク戦略、どちらを優先すべき？
&lt;/h3&gt;

&lt;p&gt;まずはチャンク戦略と評価セットの整備を。チャンクが悪いと、どんなに強い embedding でも効果が限定的です。&lt;/p&gt;

&lt;h3&gt;
  
  
  多言語ナレッジベースは text-embedding-3-large が向いている？
&lt;/h3&gt;

&lt;p&gt;優先的にテストする価値があります。公式にも large は英語・非英語両対応とされ、多言語検索ではセマンティック表現力が重要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  Crazyrouter で text-embedding-3-large を使える？
&lt;/h3&gt;

&lt;p&gt;OpenAI互換の &lt;code&gt;/v1/embeddings&lt;/code&gt; エンドポイント経由で利用可能です。コードの base URL を &lt;code&gt;https://crazyrouter.com/v1&lt;/code&gt; に設定してください。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>embeddings</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large или small: стоимость, качество поиска и выбор для RAG</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:49:23 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-ili-small-stoimost-kachiestvo-poiska-i-vybor-dlia-rag-42i6</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-ili-small-stoimost-kachiestvo-poiska-i-vybor-dlia-rag-42i6</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large или small: стоимость, качество поиска и выбор для RAG
&lt;/h1&gt;

&lt;p&gt;При построении RAG или семантического поиска многие сталкиваются с одним и тем же вопросом:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Какой embedding-модель выбрать: &lt;code&gt;text-embedding-3-large&lt;/code&gt; или более дешевую &lt;code&gt;text-embedding-3-small&lt;/code&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ответ не в том, что “large всегда лучше”, и не в том, что “small достаточно”.&lt;/p&gt;

&lt;p&gt;Правильнее сказать: &lt;strong&gt;если качество поиска напрямую влияет на бизнес-результаты, large стоит протестировать; если проект на ранней стадии или данных очень много, small обычно надежнее для старта.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" alt="embedding model cost and quality comparison dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В этой статье разберём, на что реально смотреть при выборе embedding-модели для реальных задач.&lt;/p&gt;

&lt;h2&gt;
  
  
  Сразу к сути: как выбрать?
&lt;/h2&gt;

&lt;p&gt;Можно ориентироваться на эту таблицу:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Сценарий&lt;/th&gt;
&lt;th&gt;Рекомендуемый старт&lt;/th&gt;
&lt;th&gt;Почему&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Корпоративный FAQ/база знаний&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;Качество поиска важнее всего&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Многоязычный RAG&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;Стоит протестировать для неанглийских и кросс-языковых запросов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Чат-бот поддержки&lt;/td&gt;
&lt;td&gt;large или small через A/B тест&lt;/td&gt;
&lt;td&gt;Оценить цену ошибки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Внутренний поиск по инструментам&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;Приоритет — стоимость, допустимы ошибки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MVP / демо&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;Главное — быстро собрать рабочий прототип&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Индексация огромных массивов&lt;/td&gt;
&lt;td&gt;small или large с понижением размерности&lt;/td&gt;
&lt;td&gt;Контроль затрат на хранение и поиск&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Поиск по коду/техдокам&lt;/td&gt;
&lt;td&gt;large + rerank&lt;/td&gt;
&lt;td&gt;Важно и семантическое, и точное совпадение&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Если запомнить только одну фразу:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Сначала small для базовой оценки, потом large — для проверки улучшений на реальных запросах.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Чем силён text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; — это embedding-модель с более высокими возможностями.&lt;/p&gt;

&lt;p&gt;По документации OpenAI, она по умолчанию выдаёт вектор размером 3072, принимает до 8192 токенов, и позиционируется как мощное решение для английских и неанглийских задач.&lt;/p&gt;

&lt;p&gt;Её сильные стороны:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Более глубокое семантическое понимание&lt;/li&gt;
&lt;li&gt;Лучше справляется со сложными запросами&lt;/li&gt;
&lt;li&gt;Эффективнее для многоязычного и кросс-языкового поиска&lt;/li&gt;
&lt;li&gt;Дружелюбнее к длинным документам&lt;/li&gt;
&lt;li&gt;Хороший кандидат для продакшн-RAG&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Но есть и минусы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Дороже за токен&lt;/li&gt;
&lt;li&gt;Вектор больше по размеру&lt;/li&gt;
&lt;li&gt;Дороже хранить векторную базу&lt;/li&gt;
&lt;li&gt;Больше нагрузка на память и индексацию при поиске&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Поэтому large стоит выбирать, только если прирост качества поиска оправдывает дополнительные расходы.&lt;/p&gt;

&lt;h2&gt;
  
  
  Когда подходит text-embedding-3-small?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-small&lt;/code&gt; — это про эффективность и экономию.&lt;/p&gt;

&lt;p&gt;Подходит для:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Поиска по FAQ&lt;/li&gt;
&lt;li&gt;Небольших баз знаний&lt;/li&gt;
&lt;li&gt;MVP и прототипов&lt;/li&gt;
&lt;li&gt;Внутренних инструментов&lt;/li&gt;
&lt;li&gt;Одноязычных коллекций&lt;/li&gt;
&lt;li&gt;Сценариев, где ошибки поиска не критичны&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Во многих случаях нет смысла сразу брать large.&lt;/p&gt;

&lt;p&gt;Особенно если у вас ещё нет реальных пользовательских запросов, тестовой выборки и обратной связи — использование большой модели может казаться “надёжнее”, но вы не сможете доказать, что она реально лучше.&lt;/p&gt;

&lt;h2&gt;
  
  
  Стоимость — это не только цена API
&lt;/h2&gt;

&lt;p&gt;Затраты на embedding — это не только вызовы модели.&lt;/p&gt;

&lt;p&gt;В расчёт стоит брать:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Статья затрат&lt;/th&gt;
&lt;th&gt;От чего зависит&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Стоимость API&lt;/td&gt;
&lt;td&gt;Количество токенов, частота переиндексации&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Хранение векторов&lt;/td&gt;
&lt;td&gt;Количество документов, чанков, размерность вектора&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Задержка поиска&lt;/td&gt;
&lt;td&gt;Размер индекса, размерность, top_k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Память/диск&lt;/td&gt;
&lt;td&gt;Количество и точность векторов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Поддержка&lt;/td&gt;
&lt;td&gt;Переиндексация, миграция версий, тестирование&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Простой пример:&lt;/p&gt;

&lt;p&gt;Если у вас 1 миллион чанков, каждый вектор — 3072 float32, то только на векторах:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000,000 × 3072 × 4 bytes ≈ 12.3 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если уменьшить размерность до 1536 — будет примерно вдвое меньше.&lt;/p&gt;

&lt;p&gt;И это без учёта индекса, метаданных и накладных расходов БД.&lt;/p&gt;

&lt;p&gt;Поэтому для крупных проектов важно следить за параметром &lt;code&gt;dimensions&lt;/code&gt; и стоимостью векторной базы.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как использовать параметр dimensions?
&lt;/h2&gt;

&lt;p&gt;В embedding-моделях третьего поколения OpenAI можно управлять размером выходного вектора через параметр &lt;code&gt;dimensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Пример:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How to reduce AI API cost with model routing?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Это очень полезно в продакшне.&lt;/p&gt;

&lt;p&gt;Можно сравнить:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large 3072&lt;/li&gt;
&lt;li&gt;large 1536&lt;/li&gt;
&lt;li&gt;large 1024&lt;/li&gt;
&lt;li&gt;small (по умолчанию)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;А потом посмотреть на Recall@5, задержку и стоимость.&lt;/p&gt;

&lt;h2&gt;
  
  
  Не ориентируйтесь только на MTEB
&lt;/h2&gt;

&lt;p&gt;Публичные бенчмарки полезны, но не заменяют реальные данные.&lt;/p&gt;

&lt;p&gt;Ваши задачи могут отличаться от тестовых наборов:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Короткие пользовательские запросы&lt;/li&gt;
&lt;li&gt;Документы на смешанном русском и английском&lt;/li&gt;
&lt;li&gt;Много названий продуктов и кодов ошибок&lt;/li&gt;
&lt;li&gt;Таблицы и параметры в тексте&lt;/li&gt;
&lt;li&gt;Пользователи часто пишут разговорно&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Лучше собрать свою небольшую тестовую выборку.&lt;/p&gt;

&lt;p&gt;Простейший формат:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Запрос&lt;/th&gt;
&lt;th&gt;Ожидаемый документ&lt;/th&gt;
&lt;th&gt;Тип&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Как посмотреть баланс?&lt;/td&gt;
&lt;td&gt;billing.md&lt;/td&gt;
&lt;td&gt;FAQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Что указывать в base_url?&lt;/td&gt;
&lt;td&gt;quickstart.md&lt;/td&gt;
&lt;td&gt;technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Как настроить Claude Code?&lt;/td&gt;
&lt;td&gt;claude-code.md&lt;/td&gt;
&lt;td&gt;integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Что делать при ошибке 401?&lt;/td&gt;
&lt;td&gt;auth-errors.md&lt;/td&gt;
&lt;td&gt;troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Прогоните каждый вариант модели и посмотрите, попадает ли нужный документ в топ-3/топ-5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как провести A/B тестирование моделей
&lt;/h2&gt;

&lt;p&gt;Рекомендую такой подход:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Соберите 50-200 реальных запросов
&lt;/h3&gt;

&lt;p&gt;Не придумывайте сами. Лучше взять:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Логи поиска на сайте&lt;/li&gt;
&lt;li&gt;Вопросы в поддержку&lt;/li&gt;
&lt;li&gt;Вопросы из чатов/групп&lt;/li&gt;
&lt;li&gt;Заголовки тикетов&lt;/li&gt;
&lt;li&gt;Комментарии к документации&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Проставьте правильные ответы
&lt;/h3&gt;

&lt;p&gt;Для каждого запроса отметьте 1-3 релевантных чанка или документа.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Постройте несколько индексов
&lt;/h3&gt;

&lt;p&gt;Например:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;index_small_default&lt;/li&gt;
&lt;li&gt;index_large_3072&lt;/li&gt;
&lt;li&gt;index_large_1536&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Прогоните тесты на поиск
&lt;/h3&gt;

&lt;p&gt;Ключевые метрики:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Метрика&lt;/th&gt;
&lt;th&gt;Описание&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recall@3&lt;/td&gt;
&lt;td&gt;Входит ли правильный документ в топ-3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall@5&lt;/td&gt;
&lt;td&gt;Входит ли правильный документ в топ-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;Чем выше позиция правильного документа, тем лучше&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;latency&lt;/td&gt;
&lt;td&gt;Время ответа на запрос&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cost&lt;/td&gt;
&lt;td&gt;Стоимость индекса и поиска&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Решите, стоит ли переходить на large
&lt;/h3&gt;

&lt;p&gt;Если прирост Recall@5 всего 1%, а расходы сильно выше — возможно, не стоит.&lt;/p&gt;

&lt;p&gt;Если же Recall@5 вырос с 78% до 90%, а бизнесу критична точность — переход оправдан.&lt;/p&gt;

&lt;h2&gt;
  
  
  Плохой RAG — не всегда вина embedding-модели
&lt;/h2&gt;

&lt;p&gt;Часто даже переход на large не спасает, если проблемы в другом:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Проблема&lt;/th&gt;
&lt;th&gt;Проявление&lt;/th&gt;
&lt;th&gt;Что делать&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Плохо нарезаны чанки&lt;/td&gt;
&lt;td&gt;Контекст найденного ответа неполный&lt;/td&gt;
&lt;td&gt;Перерезать чанки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Нет метаданных&lt;/td&gt;
&lt;td&gt;Нельзя фильтровать по языку/правам/продукту&lt;/td&gt;
&lt;td&gt;Добавить метаданные&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Слишком короткий запрос&lt;/td&gt;
&lt;td&gt;“Проблема с оплатой” ищет плохо&lt;/td&gt;
&lt;td&gt;Переписывать запросы&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Устаревшие документы&lt;/td&gt;
&lt;td&gt;Находятся старые ответы&lt;/td&gt;
&lt;td&gt;Фильтровать по дате/версии&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Нет rerank&lt;/td&gt;
&lt;td&gt;Топ-результаты похожи, но не точные&lt;/td&gt;
&lt;td&gt;Добавить rerank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Слабый prompt&lt;/td&gt;
&lt;td&gt;Модель отвечает “из головы”&lt;/td&gt;
&lt;td&gt;Жёстко ограничить ответы только по базе&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Перед выбором модели убедитесь, что ваша RAG-пайплайн не слишком “сырая”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как переключаться между embedding-моделями через OpenAI-совместимый API
&lt;/h2&gt;

&lt;p&gt;Если вы используете OpenAI SDK, сменить модель очень просто.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Для экономии
&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Для качества
&lt;/span&gt;&lt;span class="n"&gt;large&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если вы используете OpenAI-совместимый шлюз вроде Crazyrouter, обычно менять нужно только имя модели и base URL.&lt;/p&gt;

&lt;p&gt;Можно сначала проверить вызовы в &lt;a href="https://crazyrouter.com/playground?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;Crazyrouter Playground&lt;/a&gt;, а затем перенести параметры на сервер.&lt;/p&gt;

&lt;h2&gt;
  
  
  Рекомендуемая дорожная карта проекта
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Этап 1: MVP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Используйте text-embedding-3-small&lt;/li&gt;
&lt;li&gt;Храните локально или через pgvector&lt;/li&gt;
&lt;li&gt;Поиск top 5&lt;/li&gt;
&lt;li&gt;Без сложного rerank&lt;/li&gt;
&lt;li&gt;Цель — рабочий прототип&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Этап 2: Реальное тестирование
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Соберите пользовательские запросы&lt;/li&gt;
&lt;li&gt;Проставьте правильные документы&lt;/li&gt;
&lt;li&gt;Сравните small и large&lt;/li&gt;
&lt;li&gt;Подберите стратегию нарезки чанков&lt;/li&gt;
&lt;li&gt;Цель — найти узкие места поиска&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Этап 3: Оптимизация для продакшна
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Используйте large или large с уменьшенной размерностью&lt;/li&gt;
&lt;li&gt;Добавьте гибридный поиск&lt;/li&gt;
&lt;li&gt;Включите rerank&lt;/li&gt;
&lt;li&gt;Фильтрация по правам&lt;/li&gt;
&lt;li&gt;Ссылки на источник&lt;/li&gt;
&lt;li&gt;Цель — стабильность, объяснимость, контроль затрат&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Вывод: large — не всегда ответ, но тестировать стоит
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; даёт более сильное семантическое представление, особенно полезен для сложных RAG, многоязычных баз и продвинутого поиска.&lt;/p&gt;

&lt;p&gt;Но не стоит слепо брать самую мощную модель.&lt;/p&gt;

&lt;p&gt;Лучше действовать так:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Сначала small — для оценки затрат и базового качества&lt;/li&gt;
&lt;li&gt;Потом large — для проверки реального прироста на ваших данных&lt;/li&gt;
&lt;li&gt;Управляйте размерностью через dimensions&lt;/li&gt;
&lt;li&gt;Добавляйте rerank и гибридный поиск, а не только меняйте модель&lt;/li&gt;
&lt;li&gt;Оценивайте, насколько критичны ошибки для бизнеса&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Если RAG влияет на решения пользователей, поддержку или оплату — скорее всего, large оправдан.&lt;/p&gt;

&lt;p&gt;Если это внутренний инструмент или ранний прототип — small практичнее.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large всегда лучше, чем text-embedding-3-small?
&lt;/h3&gt;

&lt;p&gt;Обычно да, но не всегда оправдано. Смотрите, насколько реально растёт качество поиска и окупает ли это затраты.&lt;/p&gt;

&lt;h3&gt;
  
  
  Снижение dimensions ухудшает качество?
&lt;/h3&gt;

&lt;p&gt;Может ухудшить. Меньше размерность — дешевле хранить и искать, но возможна потеря качества. Проверьте на своей тестовой выборке.&lt;/p&gt;

&lt;h3&gt;
  
  
  В RAG-проекте сначала оптимизировать модель или нарезку чанков?
&lt;/h3&gt;

&lt;p&gt;Сначала — нарезку и тестовую выборку. Если чанки плохие, даже сильная embedding-модель мало поможет.&lt;/p&gt;

&lt;h3&gt;
  
  
  Для многоязычных баз лучше large?
&lt;/h3&gt;

&lt;p&gt;Стоит протестировать в первую очередь. Large официально позиционируется для английских и неанглийских задач, а многоязычный поиск особенно зависит от семантики.&lt;/p&gt;

&lt;h3&gt;
  
  
  Можно ли вызывать text-embedding-3-large через Crazyrouter?
&lt;/h3&gt;

&lt;p&gt;Да, через OpenAI-совместимый эндпоинт &lt;code&gt;/v1/embeddings&lt;/code&gt;. Просто укажите &lt;code&gt;https://crazyrouter.com/v1&lt;/code&gt; как base URL в коде.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large — для чего нужен embeddings-модель и как он работает в RAG</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:49:22 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-dlia-chiegho-nuzhien-embeddings-modiel-i-kak-on-rabotaiet-v-rag-35lg</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-dlia-chiegho-nuzhien-embeddings-modiel-i-kak-on-rabotaiet-v-rag-35lg</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large — для чего нужен embeddings-модель и как он работает в RAG
&lt;/h1&gt;

&lt;p&gt;Когда вы используете GPT, Claude, Gemini, чаще всего вы “генерируете ответы”. Но такие модели, как &lt;code&gt;text-embedding-3-large&lt;/code&gt;, не предназначены для чата и не пишут тексты напрямую.&lt;/p&gt;

&lt;p&gt;Их основная задача — &lt;strong&gt;преобразовывать текст в числовой вектор&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Звучит абстрактно, но именно это лежит в основе RAG-решений, семантического поиска, рекомендаций похожих статей, чат-ботов поддержки, поиска по документам и других подобных задач.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" alt="text-embedding-3-large semantic search pipeline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Если вы хотите, чтобы ИИ находил ответы в ваших документах, а не просто “угадывал” из своей памяти, без embeddings не обойтись.&lt;/p&gt;

&lt;h2&gt;
  
  
  Для чего нужен text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; — это мощная модель для получения текстовых векторов от OpenAI. Она читает текст и возвращает вектор большой размерности.&lt;/p&gt;

&lt;p&gt;Вектор — это “семантические координаты” текста.&lt;/p&gt;

&lt;p&gt;Например, возьмём такие фразы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Как снизить стоимость AI API?”&lt;/li&gt;
&lt;li&gt;“Как сэкономить на GPT?”&lt;/li&gt;
&lt;li&gt;“Что делать, если вызовы AI моделей слишком дорогие?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ключевые слова разные, но смысл близок. Embedding-модель спроецирует их в близкие точки пространства.&lt;/p&gt;

&lt;p&gt;Это позволяет делать то, что не под силу обычному поиску по ключевым словам: &lt;strong&gt;искать по смыслу&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Типичные применения:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Сценарий&lt;/th&gt;
&lt;th&gt;Роль embeddings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Семантический поиск&lt;/td&gt;
&lt;td&gt;Преобразует вопросы и документы в векторы, ищет наиболее похожие&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG (знаниевая база)&lt;/td&gt;
&lt;td&gt;Сначала ищет релевантные документы, затем передаёт их генеративной модели&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Рекомендации&lt;/td&gt;
&lt;td&gt;Рекомендует контент по смысловой близости описаний&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Кластеризация&lt;/td&gt;
&lt;td&gt;Автоматически группирует похожие документы&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Классификация&lt;/td&gt;
&lt;td&gt;Определяет принадлежность текста к категории по схожести&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Детектирование аномалий&lt;/td&gt;
&lt;td&gt;Находит “выбивающиеся” по смыслу данные&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;В официальной документации OpenAI embeddings используются для поиска, кластеризации, рекомендаций, обнаружения аномалий, оценки разнообразия и классификации.&lt;/p&gt;

&lt;h2&gt;
  
  
  Почему RAG особенно нуждается в text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;RAG (Retrieval-Augmented Generation) — это “генерация с усилением за счёт поиска”.&lt;/p&gt;

&lt;p&gt;Типовой процесс:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Разбиваем документы на небольшие фрагменты&lt;/li&gt;
&lt;li&gt;Преобразуем каждый фрагмент в вектор через embedding-модель&lt;/li&gt;
&lt;li&gt;Сохраняем в векторную базу данных&lt;/li&gt;
&lt;li&gt;При вопросе пользователя тоже получаем вектор&lt;/li&gt;
&lt;li&gt;Находим наиболее релевантные фрагменты&lt;/li&gt;
&lt;li&gt;Передаём их генеративной модели для ответа&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Без embeddings система может только искать по ключевым словам.&lt;/p&gt;

&lt;p&gt;Например, пользователь спрашивает:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Почему баланс быстро уменьшается?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;А в документации написано:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Модели с большим контекстом используют больше tokens, стоимость считается по количеству входных и выходных tokens.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ключевые слова не совпадают, но смысл связан. Embedding решает именно такие задачи.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" alt="RAG workflow with embeddings and vector database" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Чем отличается text-embedding-3-large от чат-моделей?
&lt;/h2&gt;

&lt;p&gt;Многие разработчики поначалу думают, что embedding — это тоже “модель для вопросов-ответов”. Это не так.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Возможности&lt;/th&gt;
&lt;th&gt;Чат-модель&lt;/th&gt;
&lt;th&gt;Embedding-модель&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Входные данные&lt;/td&gt;
&lt;td&gt;Вопросы, контекст&lt;/td&gt;
&lt;td&gt;Текстовые фрагменты&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Выходные данные&lt;/td&gt;
&lt;td&gt;Ответ на естественном языке&lt;/td&gt;
&lt;td&gt;Числовой вектор&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Основные задачи&lt;/td&gt;
&lt;td&gt;Генерация, суммирование, рассуждение, диалог&lt;/td&gt;
&lt;td&gt;Поиск, схожесть, кластеризация, классификация&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Отвечает ли напрямую на вопросы&lt;/td&gt;
&lt;td&gt;Да&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Роль в RAG&lt;/td&gt;
&lt;td&gt;Генерирует финальный ответ&lt;/td&gt;
&lt;td&gt;Находит релевантные данные&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Можно представить их так:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;embedding-модель — библиотекарь, ищет нужные материалы&lt;/li&gt;
&lt;li&gt;чат-модель — автор, формулирует ответ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В полноценной системе поиска по знаниям нужны обе.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ключевые параметры text-embedding-3-large
&lt;/h2&gt;

&lt;p&gt;Согласно документации OpenAI, &lt;code&gt;text-embedding-3-large&lt;/code&gt; по умолчанию выдаёт вектор размером 3072, максимальный размер входа — 8192 токенов.&lt;/p&gt;

&lt;p&gt;Поддерживается параметр &lt;code&gt;dimensions&lt;/code&gt; — можно уменьшить размерность вектора, сохранив основную смысловую нагрузку.&lt;/p&gt;

&lt;p&gt;Это важно, потому что размерность влияет на:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;стоимость хранения в векторной базе&lt;/li&gt;
&lt;li&gt;скорость поиска&lt;/li&gt;
&lt;li&gt;размер индекса&lt;/li&gt;
&lt;li&gt;использование памяти&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для небольших FAQ или базы поддержки не всегда нужен полный вектор на 3072 измерения. Можно попробовать 1024 или 1536 и сравнить качество поиска.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как вызвать text-embedding-3-large через OpenAI-совместимый API?
&lt;/h2&gt;

&lt;p&gt;Пример на Python. В API-адресе не добавляйте UTM-параметры.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API gateway helps developers connect to many models with one key.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если вы уже используете OpenAI SDK, просто поменяйте &lt;code&gt;base_url&lt;/code&gt; на адрес совместимого шлюза.&lt;/p&gt;

&lt;p&gt;Подробнее о подключении через OpenAI-совместимый API читайте в &lt;a href="https://docs.crazyrouter.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;документации Crazyrouter&lt;/a&gt;, а сравнить стоимость разных моделей можно на &lt;a href="https://crazyrouter.com/pricing?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;странице цен&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Минимальный пример семантического поиска
&lt;/h2&gt;

&lt;p&gt;Ниже — простейшая реализация cosine similarity для embeddings. В продакшене используйте векторные базы данных: Qdrant, Milvus, Pinecone, pgvector и др.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="n"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API costs are calculated by input and output tokens.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RAG systems retrieve relevant documents before generating answers.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vector databases store embeddings for semantic search.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How does retrieval augmented generation find context?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;query_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doc_vecs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc_vecs&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Этот пример прост, но отражает суть семантического поиска: текст → вектор → сортировка по схожести.&lt;/p&gt;

&lt;h2&gt;
  
  
  Когда стоит использовать text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;Рекомендации по выбору:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Задача&lt;/th&gt;
&lt;th&gt;Совет&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Качественный RAG, мультиязычный поиск, большие базы&lt;/td&gt;
&lt;td&gt;Сначала пробуйте text-embedding-3-large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQ, небольшой поиск, чувствительность к цене&lt;/td&gt;
&lt;td&gt;Можно начать с text-embedding-3-small&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Мультиязычный поиск&lt;/td&gt;
&lt;td&gt;large предпочтительнее&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Только фильтрация по ключевым словам&lt;/td&gt;
&lt;td&gt;Embedding не обязателен&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Очень большой объём данных, ограниченный бюджет&lt;/td&gt;
&lt;td&gt;Оцените уменьшение размерности и многоуровневый поиск&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Если качество поиска критично для пользователей — &lt;code&gt;text-embedding-3-large&lt;/code&gt; стоит тестировать в первую очередь.&lt;/p&gt;

&lt;p&gt;Для внутренних инструментов или MVP можно начать с более дешёвых моделей.&lt;/p&gt;

&lt;h2&gt;
  
  
  Лучшие практики для RAG-проектов
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Не делайте слишком крупные чанки
&lt;/h3&gt;

&lt;p&gt;Не загружайте целиком большие документы. Лучше разбивать по смысловым абзацам.&lt;/p&gt;

&lt;p&gt;Рекомендации:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;300–800 токенов на один чанк&lt;/li&gt;
&lt;li&gt;50–100 токенов overlap между чанками&lt;/li&gt;
&lt;li&gt;Метаданные (заголовок, путь, дата) хранить отдельно&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Предобработка запросов
&lt;/h3&gt;

&lt;p&gt;Вопросы пользователей часто короткие и разговорные. Можно сначала переформулировать их через чат-модель, а потом делать embedding.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Не ограничивайтесь только top 1
&lt;/h3&gt;

&lt;p&gt;Обычно в RAG берут top 3–10 фрагментов, затем передают их генеративной модели.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Используйте rerank для точности
&lt;/h3&gt;

&lt;p&gt;Embedding — это грубый отбор, rerank — точная сортировка. Для поддержки, юридических, финансовых и технических документов rerank заметно снижает число нерелевантных ответов.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Анализируйте реальные запросы
&lt;/h3&gt;

&lt;p&gt;Не ограничивайтесь тестовыми данными. Анонимизируйте и анализируйте настоящие вопросы пользователей — только так можно оценить качество поиска.&lt;/p&gt;

&lt;h2&gt;
  
  
  Частые заблуждения
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Миф 1: чем выше размерность embedding, тем лучше
&lt;/h3&gt;

&lt;p&gt;Не всегда. Большая размерность — выше выразительность, но и выше затраты на хранение и вычисления. Важно балансировать качество, задержку и стоимость.&lt;/p&gt;

&lt;h3&gt;
  
  
  Миф 2: если есть embedding, RAG не будет “галлюцинировать”
&lt;/h3&gt;

&lt;p&gt;Это не так. Embedding только ищет материалы. Надёжность ответа зависит от prompt'а, качества контекста, возможностей модели и ограничений на цитирование.&lt;/p&gt;

&lt;h3&gt;
  
  
  Миф 3: любой документ можно просто векторизовать
&lt;/h3&gt;

&lt;p&gt;Таблицы, код, логи, сканы PDF требуют особой обработки. Для таблиц лучше сохранять структуру.&lt;/p&gt;

&lt;h2&gt;
  
  
  Вывод: text-embedding-3-large — “поисковый фундамент” AI-приложений
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; — это не чат-модель, а инструмент для оценки смысловой близости текстов.&lt;/p&gt;

&lt;p&gt;Он идеально подходит для:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG-знаниевых баз&lt;/li&gt;
&lt;li&gt;семантического поиска&lt;/li&gt;
&lt;li&gt;мультиязычного поиска&lt;/li&gt;
&lt;li&gt;рекомендательных систем&lt;/li&gt;
&lt;li&gt;кластеризации документов&lt;/li&gt;
&lt;li&gt;классификации текстов&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если вы делаете AI-поддержку, корпоративную базу знаний, поиск по документам, коду или рекомендации — embedding-модель будет основой системы.&lt;/p&gt;

&lt;p&gt;Подключиться к embeddings API можно через OpenAI-совместимый интерфейс. Если вы уже используете OpenAI SDK, переход прост: поменяйте &lt;code&gt;base_url&lt;/code&gt;, используйте новый API-ключ — и всё работает по-прежнему.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Может ли text-embedding-3-large напрямую отвечать на вопросы?
&lt;/h3&gt;

&lt;p&gt;Нет. Она возвращает только вектор, а не текстовый ответ. Для генерации ответа нужен GPT, Claude, Gemini или другая чат-модель.&lt;/p&gt;

&lt;h3&gt;
  
  
  Подходит ли text-embedding-3-large для RAG?
&lt;/h3&gt;

&lt;p&gt;Да. Обычно её используют на этапе поиска: вопрос и документы преобразуются в векторы, затем ищутся наиболее релевантные.&lt;/p&gt;

&lt;h3&gt;
  
  
  Какая размерность по умолчанию у text-embedding-3-large?
&lt;/h3&gt;

&lt;p&gt;В официальной документации — 3072. Можно уменьшить через параметр &lt;code&gt;dimensions&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Как выбрать между text-embedding-3-large и text-embedding-3-small?
&lt;/h3&gt;

&lt;p&gt;Если важны качество поиска, мультиязычность или продакшн-RAG — пробуйте large. Если важна цена или объём данных огромный — small подойдёт для базовой версии.&lt;/p&gt;

&lt;h3&gt;
  
  
  Обязательна ли векторная база данных?
&lt;/h3&gt;

&lt;p&gt;Для небольших демо можно обойтись массивами и cosine similarity. В продакшене лучше использовать специализированные базы: pgvector, Qdrant, Milvus, Pinecone.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Как построить RAG-базу знаний на text-embedding-3-large: chunking, embeddings и rerank</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:48:53 +0000</pubDate>
      <link>https://dev.to/xujfcn/kak-postroit-rag-bazu-znanii-na-text-embedding-3-large-chunking-embeddings-i-rerank-316e</link>
      <guid>https://dev.to/xujfcn/kak-postroit-rag-bazu-znanii-na-text-embedding-3-large-chunking-embeddings-i-rerank-316e</guid>
      <description>&lt;h1&gt;
  
  
  Как построить RAG-базу знаний на text-embedding-3-large: chunking, embeddings и rerank
&lt;/h1&gt;

&lt;p&gt;Многие демо RAG выглядят просто: загрузил PDF, задал вопрос — AI ответил.&lt;/p&gt;

&lt;p&gt;Но когда доходит до реального продакшна, сразу появляются проблемы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Документ слишком длинный — не помещается в контекст&lt;/li&gt;
&lt;li&gt;Поиск по ключевым словам не находит похожие по смыслу фрагменты&lt;/li&gt;
&lt;li&gt;Пользователь спрашивает разговорно, а документация написана официально&lt;/li&gt;
&lt;li&gt;Найденные куски не по теме — модель начинает “галлюцинировать”&lt;/li&gt;
&lt;li&gt;Чем больше данных, тем выше задержки и стоимость поиска&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; решает одну из ключевых задач: &lt;strong&gt;преобразует вопросы и документы в сравнимые семантические векторы&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnk2qn51gfxp6feeavno.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnk2qn51gfxp6feeavno.webp" alt="RAG knowledge base architecture with embeddings" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В этой статье — никакой воды, только практический разбор рабочего RAG-процесса с инженерной точки зрения.&lt;/p&gt;

&lt;h2&gt;
  
  
  Базовая архитектура RAG-системы
&lt;/h2&gt;

&lt;p&gt;Типовая база знаний на RAG делится на два основных контура.&lt;/p&gt;

&lt;p&gt;Первый — оффлайн-индексация:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Сбор документов&lt;/li&gt;
&lt;li&gt;Очистка текста&lt;/li&gt;
&lt;li&gt;Разделение на чанки (chunking)&lt;/li&gt;
&lt;li&gt;Генерация векторов через embedding-модель&lt;/li&gt;
&lt;li&gt;Сохранение в векторную базу данных&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Второй — онлайн-ответы на вопросы:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Пользователь задаёт вопрос&lt;/li&gt;
&lt;li&gt;Преобразование вопроса в embedding&lt;/li&gt;
&lt;li&gt;Поиск похожих чанков в векторной базе&lt;/li&gt;
&lt;li&gt;(Опционально) rerank — уточняющая сортировка&lt;/li&gt;
&lt;li&gt;Сборка контекста&lt;/li&gt;
&lt;li&gt;Генерация ответа через чат-модель&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; используется на шаге 4 (оффлайн) и шаге 2 (онлайн).&lt;/p&gt;

&lt;p&gt;Он не отвечает на вопросы напрямую, но определяет, получит ли модель нужную информацию.&lt;/p&gt;

&lt;h2&gt;
  
  
  Шаг 1: Подготовка документов и разбиение на чанки
&lt;/h2&gt;

&lt;p&gt;Качество RAG во многом зависит от того, как вы режете текст на чанки.&lt;/p&gt;

&lt;p&gt;Слишком крупные чанки — много “шума”, модель видит лишнее.&lt;/p&gt;

&lt;p&gt;Слишком мелкие — не хватает контекста, информации мало.&lt;/p&gt;

&lt;p&gt;Рекомендации для старта:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Тип документа&lt;/th&gt;
&lt;th&gt;Рекомендуемый размер чанка&lt;/th&gt;
&lt;th&gt;overlap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FAQ / Справка&lt;/td&gt;
&lt;td&gt;200-500 токенов&lt;/td&gt;
&lt;td&gt;30-80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Техническая дока&lt;/td&gt;
&lt;td&gt;400-800 токенов&lt;/td&gt;
&lt;td&gt;80-120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Длинные отчёты&lt;/td&gt;
&lt;td&gt;600-1000 токенов&lt;/td&gt;
&lt;td&gt;100-150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Документация кода&lt;/td&gt;
&lt;td&gt;По функции/классу/заголовку&lt;/td&gt;
&lt;td&gt;По ситуации&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Пример кода для разбиения:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chunk_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;
        &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;В продакшне не режьте только по пробелам. Лучше разбивать по заголовкам, абзацам, спискам, границам кода.&lt;/p&gt;

&lt;h2&gt;
  
  
  Шаг 2: Генерация векторов через text-embedding-3-large
&lt;/h2&gt;

&lt;p&gt;Пример на OpenAI-совместимом API. Можно использовать тот же SDK для вызова &lt;code&gt;/v1/embeddings&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если нужно контролировать размерность вектора, добавьте параметр &lt;code&gt;dimensions&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Чем меньше размерность, тем дешевле хранение и поиск, но качество может упасть. Тестируйте на реальных вопросах.&lt;/p&gt;

&lt;h2&gt;
  
  
  Шаг 3: Сохранение в векторную базу данных
&lt;/h2&gt;

&lt;p&gt;Для прототипа можно использовать файлы или SQLite, но для продакшна лучше выбрать специализированную векторную БД.&lt;/p&gt;

&lt;p&gt;Популярные варианты:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Инструмент&lt;/th&gt;
&lt;th&gt;Когда использовать&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pgvector&lt;/td&gt;
&lt;td&gt;Уже используете PostgreSQL, не хотите новых сервисов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qdrant&lt;/td&gt;
&lt;td&gt;Отдельная векторная БД, простая установка, мощная фильтрация&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Milvus&lt;/td&gt;
&lt;td&gt;Масштабируемый поиск по большим данным&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinecone&lt;/td&gt;
&lt;td&gt;Облачный сервис, не требует поддержки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weaviate&lt;/td&gt;
&lt;td&gt;Есть схема и гибридный поиск&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;В любом случае, для каждого чанка сохраняйте минимум такие поля:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"doc_001_chunk_003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chunk content here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"embedding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-0.0456&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing-guide.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Billing Guide"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Token pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-18"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Метаданные важны — они позволяют фильтровать по продукту, языку, времени, правам доступа.&lt;/p&gt;

&lt;h2&gt;
  
  
  Шаг 4: Семантический поиск при запросе
&lt;/h2&gt;

&lt;p&gt;Когда пользователь задаёт вопрос, сначала превращаем его в вектор, затем ищем похожие чанки в базе.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;query_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;language&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ru&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если нет векторной базы, можно показать cosine similarity на numpy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Но если данных больше нескольких тысяч, переходите на специализированную векторную БД.&lt;/p&gt;

&lt;h2&gt;
  
  
  Шаг 5: Добавляем rerank — меньше “мимо кассы”
&lt;/h2&gt;

&lt;p&gt;Embedding-поиск — это “грубый” отбор: быстро, но не всегда точно.&lt;/p&gt;

&lt;p&gt;Rerank — “точная” сортировка: оценивает релевантность вопроса и каждого кандидата.&lt;/p&gt;

&lt;p&gt;Рекомендованный пайплайн:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Embedding-поиск — top 20 кандидатов&lt;/li&gt;
&lt;li&gt;Rerank — сортировка по релевантности&lt;/li&gt;
&lt;li&gt;В чат-модель идут top 5&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Это надёжнее, чем просто брать top 5 по embedding, особенно если:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Много технической документации&lt;/li&gt;
&lt;li&gt;База знаний для поддержки&lt;/li&gt;
&lt;li&gt;Юридические/финансовые документы&lt;/li&gt;
&lt;li&gt;Мультиязычные базы&lt;/li&gt;
&lt;li&gt;Много похожих по названию документов&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crazyrouter поддерживает endpoint &lt;code&gt;/v1/rerank&lt;/code&gt; — его можно встроить в RAG-процесс для точной сортировки после поиска.&lt;/p&gt;

&lt;h2&gt;
  
  
  Шаг 6: Передаём найденные чанки в чат-модель
&lt;/h2&gt;

&lt;p&gt;После поиска собираем prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Source: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Вы — строгий помощник базы знаний.
Отвечайте только на основе приведённых материалов.
Если ответа нет — скажите “В предоставленных данных ответа нет”.

Материалы:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

Вопрос: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Далее вызываем чат-модель:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;build_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Embedding-модель и чат-модель работают вместе:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;text-embedding-3-large&lt;/code&gt;: ищет релевантные материалы&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-5-mini&lt;/code&gt; / Claude / Gemini: формирует ответ на основе найденного&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Преимущества text-embedding-3-large для мультиязычного RAG
&lt;/h2&gt;

&lt;p&gt;Во многих компаниях документация на разных языках:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Английская API-дока&lt;/li&gt;
&lt;li&gt;Русский справочный центр&lt;/li&gt;
&lt;li&gt;Японские мануалы&lt;/li&gt;
&lt;li&gt;Корейские статьи сообщества&lt;/li&gt;
&lt;li&gt;Вьетнамские туториалы&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Проблема мультиязычного RAG: пользователь спрашивает на одном языке, а ответ — в документации на другом.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; официально позиционируется как embedding-модель высокого качества для английского и других языков. Для кросс-языкового поиска стоит протестировать её в первую очередь.&lt;/p&gt;

&lt;p&gt;Но не полагайтесь только на официальные метрики — соберите свой набор тестовых запросов:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Вопрос&lt;/th&gt;
&lt;th&gt;Верный документ&lt;/th&gt;
&lt;th&gt;Язык&lt;/th&gt;
&lt;th&gt;Найден?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Почему быстро списываются средства?&lt;/td&gt;
&lt;td&gt;billing-token-cost.md&lt;/td&gt;
&lt;td&gt;ru&lt;/td&gt;
&lt;td&gt;да/нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;how to set API base URL&lt;/td&gt;
&lt;td&gt;quickstart.md&lt;/td&gt;
&lt;td&gt;en&lt;/td&gt;
&lt;td&gt;да/нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Как настроить Claude Code?&lt;/td&gt;
&lt;td&gt;integrations/claude-code.md&lt;/td&gt;
&lt;td&gt;ru&lt;/td&gt;
&lt;td&gt;да/нет&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Оценивайте recall в top 3 / top 5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Рекомендации для продакшна
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Индексируйте только изменённые чанки
&lt;/h3&gt;

&lt;p&gt;При обновлении документа пересчитывайте embedding только для новых/изменённых чанков.&lt;/p&gt;

&lt;p&gt;Сохраняйте hash каждого чанка:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;content_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если hash не изменился — пропускайте.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Используйте batch-embedding
&lt;/h3&gt;

&lt;p&gt;Не вызывайте API по одному чанку. Обычно Embeddings API поддерживает пакетную обработку.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;chunk1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Так быстрее и проще контролировать лимиты.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Гибридный поиск
&lt;/h3&gt;

&lt;p&gt;Чисто векторный поиск может пропустить точные совпадения по ключевым словам: коды ошибок, номера заказов, имена функций.&lt;/p&gt;

&lt;p&gt;Надёжнее комбинировать:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BM25 / поиск по ключевым словам&lt;/li&gt;
&lt;li&gt;Векторный поиск&lt;/li&gt;
&lt;li&gt;Объединение результатов&lt;/li&gt;
&lt;li&gt;Rerank&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Добавляйте ссылки на источник в ответах
&lt;/h3&gt;

&lt;p&gt;Не ограничивайтесь только текстом ответа. Лучше указывать заголовок и ссылку на документ.&lt;/p&gt;

&lt;p&gt;Это повышает доверие пользователя и облегчает отладку.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Фильтрация по правам доступа
&lt;/h3&gt;

&lt;p&gt;В корпоративных базах знаний обязательно фильтруйте по правам.&lt;/p&gt;

&lt;p&gt;Не фильтруйте после поиска — добавляйте условия доступа прямо в запрос к векторной базе.&lt;/p&gt;

&lt;h2&gt;
  
  
  Частые проблемы и их решения
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Проблема&lt;/th&gt;
&lt;th&gt;Причина&lt;/th&gt;
&lt;th&gt;Как исправить&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Не находится нужный документ&lt;/td&gt;
&lt;td&gt;Чанк слишком большой/маленький, короткий запрос&lt;/td&gt;
&lt;td&gt;Подберите размер чанка, перепишите запрос&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ответ ссылается не на тот документ&lt;/td&gt;
&lt;td&gt;Мало кандидатов, нет rerank&lt;/td&gt;
&lt;td&gt;Брать top 20 + rerank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Высокая задержка&lt;/td&gt;
&lt;td&gt;Каждый раз пересчитывается embedding документа&lt;/td&gt;
&lt;td&gt;Индексируйте документы оффлайн, запросы embedding — онлайн&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Растёт стоимость&lt;/td&gt;
&lt;td&gt;Дублирующая индексация, слишком большая размерность&lt;/td&gt;
&lt;td&gt;Удаляйте дубли по hash, тестируйте меньшую размерность&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Плохо ищет по разным языкам&lt;/td&gt;
&lt;td&gt;Модель не подходит для мультиязыка&lt;/td&gt;
&lt;td&gt;Тестируйте large, соберите мультиязычный тестовый набор&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Когда НЕ стоит использовать text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;Не всегда нужен embedding максимального качества.&lt;/p&gt;

&lt;p&gt;Можно обойтись без него, если:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Данных мало, хватает поиска по ключевым словам&lt;/li&gt;
&lt;li&gt;Это внутренний инструмент, требования к качеству невысокие&lt;/li&gt;
&lt;li&gt;Очень ограниченный бюджет, а база — одноязычный FAQ&lt;/li&gt;
&lt;li&gt;Проект на стадии MVP, нет реальных пользовательских запросов&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Лучше сначала протестировать small и large на реальных вопросах и только потом решать, стоит ли переходить на более дорогую модель.&lt;/p&gt;

&lt;h2&gt;
  
  
  Вывод: успех RAG наполовину зависит от поиска
&lt;/h2&gt;

&lt;p&gt;Какой бы ни был мощный чат-модель, если в контексте не те данные — ответ будет ошибочным.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; позволяет находить информацию по смыслу, а не только по ключевым словам.&lt;/p&gt;

&lt;p&gt;Если строите продакшн RAG, рекомендую такой порядок:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Соберите реальные документы&lt;/li&gt;
&lt;li&gt;Разбейте их на адекватные чанки&lt;/li&gt;
&lt;li&gt;Постройте векторный индекс на text-embedding-3-large&lt;/li&gt;
&lt;li&gt;Оцените recall top 5 на реальных вопросах&lt;/li&gt;
&lt;li&gt;Добавьте rerank&lt;/li&gt;
&lt;li&gt;Оптимизируйте prompt и чат-модель&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Вы можете подключить &lt;a href="https://docs.crazyrouter.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;Crazyrouter embeddings API&lt;/a&gt; через OpenAI-совместимый SDK и использовать один &lt;code&gt;base_url&lt;/code&gt; для embedding, rerank и чат-модели — удобно для построения полного RAG-процесса.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Обязательно ли использовать text-embedding-3-large для RAG-базы знаний?
&lt;/h3&gt;

&lt;p&gt;Нет. Он оптимален для продакшн, мультиязыка и задач с высокими требованиями к качеству. Для небольших проектов можно начать с более дешёвых embedding-моделей.&lt;/p&gt;

&lt;h3&gt;
  
  
  Какой размер чанка оптимален?
&lt;/h3&gt;

&lt;p&gt;Нет универсального ответа. Для технической документации — 400-800 токенов, для FAQ — короче. Ориентируйтесь на качество поиска по реальным вопросам.&lt;/p&gt;

&lt;h3&gt;
  
  
  Можно ли использовать text-embedding-3-large с pgvector?
&lt;/h3&gt;

&lt;p&gt;Да. Вектор можно сохранять в поле pgvector в PostgreSQL и искать по схожести.&lt;/p&gt;

&lt;h3&gt;
  
  
  Почему embedding находит нужный материал, а модель всё равно ошибается?
&lt;/h3&gt;

&lt;p&gt;Возможно, среди найденных чанков есть “шум”, prompt не ограничивает модель, нет ссылок на источник или вопрос требует объединения нескольких документов. Добавьте rerank и контроль ссылок.&lt;/p&gt;

&lt;h3&gt;
  
  
  Нужно ли добавлять rerank в RAG?
&lt;/h3&gt;

&lt;p&gt;В продакшне — да. Embedding быстро отбирает кандидатов, rerank точно сортирует. Вместе — надёжнее.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large の用途：Embeddings 入門と RAG での使い方</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:48:52 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-noyong-tu-embeddings-ru-men-to-rag-denoshi-ifang-4hb4</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-noyong-tu-embeddings-ru-men-to-rag-denoshi-ifang-4hb4</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large の用途：Embeddings 入門と RAG での使い方
&lt;/h1&gt;

&lt;p&gt;普段 GPT、Claude、Gemini などを使うとき、多くは「答えを生成する」用途ですよね。しかし &lt;code&gt;text-embedding-3-large&lt;/code&gt; のようなモデルは、チャットや文章生成はしません。&lt;/p&gt;

&lt;p&gt;このモデルの主な役割は、&lt;strong&gt;テキストを数値ベクトルに変換すること&lt;/strong&gt; です。&lt;/p&gt;

&lt;p&gt;少し抽象的に聞こえるかもしれませんが、RAG（知識拡張生成）、セマンティック検索、類似記事推薦、FAQボット、ドキュメント検索などの基盤となる技術です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" alt="text-embedding-3-large semantic search pipeline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI に「自分のドキュメントから答えを探してほしい」と思ったら、embedding は避けて通れません。&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large の主な用途
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; は OpenAI の高性能テキストベクトル化モデルです。テキストを読み込み、高次元ベクトルを出力します。&lt;/p&gt;

&lt;p&gt;このベクトルは、テキストの「意味的な座標」と考えるとイメージしやすいです。&lt;/p&gt;

&lt;p&gt;例えば、以下のような文があります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;「AI API コストを下げる方法は？」&lt;/li&gt;
&lt;li&gt;「GPT の利用料金を節約するには？」&lt;/li&gt;
&lt;li&gt;「AI モデルの利用料が高すぎる場合は？」&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;キーワードは完全一致しませんが、意味は近いですよね。Embedding モデルは、これらを近い位置にマッピングします。&lt;/p&gt;

&lt;p&gt;これにより、従来のキーワード検索では難しかった「意味で探す」が可能になります。&lt;/p&gt;

&lt;p&gt;主な用途例：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;シーン&lt;/th&gt;
&lt;th&gt;embedding の役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;セマンティック検索&lt;/td&gt;
&lt;td&gt;ユーザーの質問とドキュメントをベクトル化し、最も近い内容を探す&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG 知識ベース&lt;/td&gt;
&lt;td&gt;関連ドキュメントを検索し、大規模言語モデルに渡して回答生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;レコメンドシステム&lt;/td&gt;
&lt;td&gt;記事・商品・ユーザー説明の意味的な類似度で推薦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ドキュメントクラスタリング&lt;/td&gt;
&lt;td&gt;類似ドキュメントを自動でグループ化&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;テキスト分類&lt;/td&gt;
&lt;td&gt;類似度でどのラベルに属するか判定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;異常検知&lt;/td&gt;
&lt;td&gt;他と大きく意味が離れたデータを検出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OpenAI の公式ドキュメントでも、embeddings は search、clustering、recommendations、anomaly detection、diversity measurement、classification などに使われています。&lt;/p&gt;

&lt;h2&gt;
  
  
  なぜ RAG で text-embedding-3-large が重要なのか？
&lt;/h2&gt;

&lt;p&gt;RAG（Retrieval-Augmented Generation、検索拡張生成）は、以下のような流れで動きます。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ドキュメントを小さなチャンクに分割&lt;/li&gt;
&lt;li&gt;embedding モデルで各チャンクをベクトル化&lt;/li&gt;
&lt;li&gt;ベクトルをベクトルデータベースに保存&lt;/li&gt;
&lt;li&gt;ユーザーの質問もベクトル化&lt;/li&gt;
&lt;li&gt;最も関連性の高いチャンクを検索&lt;/li&gt;
&lt;li&gt;その内容を大規模言語モデルに渡して回答生成&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;embedding がなければ、単なるキーワードマッチしかできません。&lt;/p&gt;

&lt;p&gt;例えば、ユーザーが&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;「なぜ残高がすぐ減るの？」&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;と質問したとします。ドキュメントには&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;「高コンテキストモデルはより多くのトークンを消費し、料金は入力・出力トークン数で計算されます。」&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;と書かれていた場合、キーワードは一致しませんが、意味は関連しています。Embedding はこうした「意味の橋渡し」をしてくれます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" alt="RAG workflow with embeddings and vector database" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large とチャットモデルの違い
&lt;/h2&gt;

&lt;p&gt;初めて embedding を触ると「これも Q&amp;amp;A モデル？」と思いがちですが、実際は違います。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;機能&lt;/th&gt;
&lt;th&gt;チャットモデル&lt;/th&gt;
&lt;th&gt;embedding モデル&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;入力&lt;/td&gt;
&lt;td&gt;ユーザーの質問や文脈&lt;/td&gt;
&lt;td&gt;テキスト断片&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;出力&lt;/td&gt;
&lt;td&gt;自然言語の答え&lt;/td&gt;
&lt;td&gt;数値ベクトル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主な用途&lt;/td&gt;
&lt;td&gt;生成・要約・推論・対話&lt;/td&gt;
&lt;td&gt;検索・類似度計算・クラスタリング・分類&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;直接質問に答えるか&lt;/td&gt;
&lt;td&gt;はい&lt;/td&gt;
&lt;td&gt;いいえ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG での役割&lt;/td&gt;
&lt;td&gt;最終回答を生成&lt;/td&gt;
&lt;td&gt;情報検索を担当&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;役割分担で例えると、&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;embedding モデル：図書館の司書（資料を探す）&lt;/li&gt;
&lt;li&gt;チャットモデル：ライター（答えをまとめる）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;知識ベースQAシステムでは、両方を組み合わせて使うのが一般的です。&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large の主なパラメータ
&lt;/h2&gt;

&lt;p&gt;OpenAI 公式ドキュメントによると、&lt;code&gt;text-embedding-3-large&lt;/code&gt; はデフォルトで 3072 次元のベクトルを出力し、最大入力は 8192 トークンです。&lt;/p&gt;

&lt;p&gt;また &lt;code&gt;dimensions&lt;/code&gt; パラメータで、主要な意味情報を保ったまま次元数を減らすことも可能です。&lt;/p&gt;

&lt;p&gt;これは非常に重要で、ベクトルの次元数は&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ベクトルDBのストレージコスト&lt;/li&gt;
&lt;li&gt;検索速度&lt;/li&gt;
&lt;li&gt;インデックスサイズ&lt;/li&gt;
&lt;li&gt;メモリ消費&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;に大きく影響します。&lt;/p&gt;

&lt;p&gt;中小規模のFAQやカスタマーサポート用途なら、必ずしも 3072 次元フルで使う必要はありません。まずは 1024 や 1536 次元で試して、検索品質を確認しましょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  OpenAI 互換APIで text-embedding-3-large を使う方法
&lt;/h2&gt;

&lt;p&gt;以下は Python の例です。API の base_url には UTM パラメータを付けないでください。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API gateway helps developers connect to many models with one key.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;既に OpenAI SDK を使っている場合は、&lt;code&gt;base_url&lt;/code&gt; を互換ゲートウェイのURLに変更するだけでOKです。&lt;/p&gt;

&lt;p&gt;OpenAI 互換の接続方法は &lt;a href="https://docs.crazyrouter.com?utm_source=zenn&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;Crazyrouter ドキュメント&lt;/a&gt; を参照してください。コスト比較は &lt;a href="https://crazyrouter.com/pricing?utm_source=zenn&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;価格ページ&lt;/a&gt; も便利です。&lt;/p&gt;

&lt;h2&gt;
  
  
  最小構成のセマンティック検索サンプル
&lt;/h2&gt;

&lt;p&gt;ここでは cosine similarity を使ったシンプルな例を紹介します。実運用では Qdrant、Milvus、Pinecone、pgvector などのベクトルDB利用を推奨します。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="n"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API costs are calculated by input and output tokens.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RAG systems retrieve relevant documents before generating answers.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vector databases store embeddings for semantic search.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How does retrieval augmented generation find context?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;query_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doc_vecs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc_vecs&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;この例はシンプルですが、テキストをベクトル化し、類似度でソートするというセマンティック検索の基本ロジックが詰まっています。&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large を使うべきタイミング
&lt;/h2&gt;

&lt;p&gt;判断の目安は以下の通りです。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ニーズ&lt;/th&gt;
&lt;th&gt;推奨&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;高品質なRAG、クロス言語検索、長文知識ベース&lt;/td&gt;
&lt;td&gt;まず text-embedding-3-large を試す&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQや小規模検索、コスト重視&lt;/td&gt;
&lt;td&gt;まず text-embedding-3-small を検討&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多言語ドキュメント検索&lt;/td&gt;
&lt;td&gt;large のテスト価値が高い&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;キーワードフィルタのみ&lt;/td&gt;
&lt;td&gt;embedding は不要な場合も&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;データ量が膨大・予算厳しい&lt;/td&gt;
&lt;td&gt;次元削減や階層検索を検討&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;要するに、「検索品質がユーザー体験に直結する」なら &lt;code&gt;text-embedding-3-large&lt;/code&gt; を優先的に試す価値があります。&lt;/p&gt;

&lt;p&gt;社内ツールやMVP段階なら、より安価な embedding モデルから始めても良いでしょう。&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG プロジェクトのベストプラクティス
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. ドキュメントのチャンクは細かく
&lt;/h3&gt;

&lt;p&gt;1文書を丸ごとembeddingせず、意味段落ごとに分割しましょう。&lt;/p&gt;

&lt;p&gt;目安：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1チャンク 300～800トークン&lt;/li&gt;
&lt;li&gt;50～100トークン程度のオーバーラップを持たせる&lt;/li&gt;
&lt;li&gt;タイトル・パス・日時などのメタデータは別管理&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. クエリも前処理する
&lt;/h3&gt;

&lt;p&gt;ユーザーの質問は短く口語的なことが多いです。チャットモデルで検索向きクエリに書き換えてから embedding するのも有効です。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. top 1 だけでなく top 3～10 を見る
&lt;/h3&gt;

&lt;p&gt;RAG では通常、関連度上位3～10件のチャンクを抽出し、大規模言語モデルに渡します。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. rerank（再ランキング）を組み合わせる
&lt;/h3&gt;

&lt;p&gt;embedding で粗く絞り込み、rerank で精密に順位付け。カスタマーサポートや法務・財務・技術文書では rerank で誤答を大幅に減らせます。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 実際のクエリログを記録・評価
&lt;/h3&gt;

&lt;p&gt;デモ用データだけでなく、実際のユーザー質問（匿名化済み）で評価しましょう。本当に使えるかどうかは現場データでしか分かりません。&lt;/p&gt;

&lt;h2&gt;
  
  
  よくある勘違い
&lt;/h2&gt;

&lt;h3&gt;
  
  
  勘違い1：embedding の次元数は高いほど良い
&lt;/h3&gt;

&lt;p&gt;必ずしもそうではありません。高次元ほど表現力は上がりますが、ストレージや計算コストも増えます。実際のプロジェクトでは検索精度・遅延・コストのバランスが重要です。&lt;/p&gt;

&lt;h3&gt;
  
  
  勘違い2：RAG で embedding を使えば絶対に誤答しない
&lt;/h3&gt;

&lt;p&gt;これも誤りです。embedding は資料検索の役割だけ。最終的な回答の信頼性は、プロンプト設計・文脈品質・モデル能力・引用制御などにも依存します。&lt;/p&gt;

&lt;h3&gt;
  
  
  勘違い3：全てのドキュメントはそのままベクトル化できる
&lt;/h3&gt;

&lt;p&gt;表・コード・ログ・PDFスキャンなどは特別な処理が必要です。特に表は構造化情報を残すのがベストです。&lt;/p&gt;

&lt;h2&gt;
  
  
  結論：text-embedding-3-large はAIアプリの「検索基盤」
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; はチャット用ではなく、テキストの意味的類似度を理解するためのモデルです。&lt;/p&gt;

&lt;p&gt;特に以下の用途に最適です。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG 知識ベース&lt;/li&gt;
&lt;li&gt;セマンティック検索&lt;/li&gt;
&lt;li&gt;多言語検索&lt;/li&gt;
&lt;li&gt;レコメンドシステム&lt;/li&gt;
&lt;li&gt;ドキュメントクラスタリング&lt;/li&gt;
&lt;li&gt;テキスト分類&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AIカスタマーサポート、企業ナレッジベース、ドキュメントQA、コード検索、コンテンツ推薦などを作るなら、embedding モデルはシステムの基盤となります。&lt;/p&gt;

&lt;p&gt;OpenAI 互換APIで簡単に導入でき、既存の OpenAI SDK プロジェクトなら &lt;code&gt;base_url&lt;/code&gt; と API key を変えるだけで移行可能です。&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large は直接質問に答えられますか？
&lt;/h3&gt;

&lt;p&gt;いいえ。出力はベクトルであり、自然言語の答えではありません。質問への回答には GPT、Claude、Gemini などのチャットモデルと組み合わせる必要があります。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large は RAG に向いていますか？
&lt;/h3&gt;

&lt;p&gt;はい。RAG の検索フェーズでよく使われます。ユーザーの質問や知識ベースの文書をベクトル化し、関連性の高い内容を抽出します。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large のデフォルト次元数は？
&lt;/h3&gt;

&lt;p&gt;公式ドキュメントによるとデフォルトは 3072 次元です。&lt;code&gt;dimensions&lt;/code&gt; パラメータで次元数を下げることも可能です。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large と text-embedding-3-small の選び方は？
&lt;/h3&gt;

&lt;p&gt;検索品質や多言語対応、プロダクション品質のRAGを重視するなら large を優先的にテストしましょう。コスト重視や大規模データの場合は small でベースラインを作るのもおすすめです。&lt;/p&gt;

&lt;h3&gt;
  
  
  ベクトルデータベースは必須ですか？
&lt;/h3&gt;

&lt;p&gt;小規模なデモなら配列＋cosine similarity でも動きますが、実運用では pgvector、Qdrant、Milvus、Pinecone などのベクトルDB利用を推奨します。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>embeddings</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large или small: стоимость, качество поиска и выбор для RAG</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:37:33 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-ili-small-stoimost-kachiestvo-poiska-i-vybor-dlia-rag-dpo</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-ili-small-stoimost-kachiestvo-poiska-i-vybor-dlia-rag-dpo</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large или small: стоимость, качество поиска и выбор для RAG
&lt;/h1&gt;

&lt;p&gt;При построении RAG или семантического поиска многие сталкиваются с одним и тем же вопросом:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Какой embedding-модель выбрать: &lt;code&gt;text-embedding-3-large&lt;/code&gt; или более дешевую &lt;code&gt;text-embedding-3-small&lt;/code&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ответ не в том, что “large всегда лучше”, и не в том, что “small достаточно”.&lt;/p&gt;

&lt;p&gt;Правильнее сказать: &lt;strong&gt;если качество поиска напрямую влияет на бизнес-результаты, large стоит протестировать; если проект на ранней стадии или данных очень много, small обычно надежнее для старта.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" alt="embedding model cost and quality comparison dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В этой статье разберём, на что реально смотреть при выборе embedding-модели для реальных задач.&lt;/p&gt;

&lt;h2&gt;
  
  
  Сразу к сути: как выбрать?
&lt;/h2&gt;

&lt;p&gt;Можно ориентироваться на эту таблицу:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Сценарий&lt;/th&gt;
&lt;th&gt;Рекомендуемый старт&lt;/th&gt;
&lt;th&gt;Почему&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Корпоративный FAQ/база знаний&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;Качество поиска важнее всего&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Многоязычный RAG&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;Стоит протестировать для неанглийских и кросс-языковых запросов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Чат-бот поддержки&lt;/td&gt;
&lt;td&gt;large или small через A/B тест&lt;/td&gt;
&lt;td&gt;Оценить цену ошибки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Внутренний поиск по инструментам&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;Приоритет — стоимость, допустимы ошибки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MVP / демо&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;Главное — быстро собрать рабочий прототип&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Индексация огромных массивов&lt;/td&gt;
&lt;td&gt;small или large с понижением размерности&lt;/td&gt;
&lt;td&gt;Контроль затрат на хранение и поиск&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Поиск по коду/техдокам&lt;/td&gt;
&lt;td&gt;large + rerank&lt;/td&gt;
&lt;td&gt;Важно и семантическое, и точное совпадение&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Если запомнить только одну фразу:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Сначала small для базовой оценки, потом large — для проверки улучшений на реальных запросах.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Чем силён text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; — это embedding-модель с более высокими возможностями.&lt;/p&gt;

&lt;p&gt;По документации OpenAI, она по умолчанию выдаёт вектор размером 3072, принимает до 8192 токенов, и позиционируется как мощное решение для английских и неанглийских задач.&lt;/p&gt;

&lt;p&gt;Её сильные стороны:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Более глубокое семантическое понимание&lt;/li&gt;
&lt;li&gt;Лучше справляется со сложными запросами&lt;/li&gt;
&lt;li&gt;Эффективнее для многоязычного и кросс-языкового поиска&lt;/li&gt;
&lt;li&gt;Дружелюбнее к длинным документам&lt;/li&gt;
&lt;li&gt;Хороший кандидат для продакшн-RAG&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Но есть и минусы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Дороже за токен&lt;/li&gt;
&lt;li&gt;Вектор больше по размеру&lt;/li&gt;
&lt;li&gt;Дороже хранить векторную базу&lt;/li&gt;
&lt;li&gt;Больше нагрузка на память и индексацию при поиске&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Поэтому large стоит выбирать, только если прирост качества поиска оправдывает дополнительные расходы.&lt;/p&gt;

&lt;h2&gt;
  
  
  Когда подходит text-embedding-3-small?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-small&lt;/code&gt; — это про эффективность и экономию.&lt;/p&gt;

&lt;p&gt;Подходит для:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Поиска по FAQ&lt;/li&gt;
&lt;li&gt;Небольших баз знаний&lt;/li&gt;
&lt;li&gt;MVP и прототипов&lt;/li&gt;
&lt;li&gt;Внутренних инструментов&lt;/li&gt;
&lt;li&gt;Одноязычных коллекций&lt;/li&gt;
&lt;li&gt;Сценариев, где ошибки поиска не критичны&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Во многих случаях нет смысла сразу брать large.&lt;/p&gt;

&lt;p&gt;Особенно если у вас ещё нет реальных пользовательских запросов, тестовой выборки и обратной связи — использование большой модели может казаться “надёжнее”, но вы не сможете доказать, что она реально лучше.&lt;/p&gt;

&lt;h2&gt;
  
  
  Стоимость — это не только цена API
&lt;/h2&gt;

&lt;p&gt;Затраты на embedding — это не только вызовы модели.&lt;/p&gt;

&lt;p&gt;В расчёт стоит брать:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Статья затрат&lt;/th&gt;
&lt;th&gt;От чего зависит&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Стоимость API&lt;/td&gt;
&lt;td&gt;Количество токенов, частота переиндексации&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Хранение векторов&lt;/td&gt;
&lt;td&gt;Количество документов, чанков, размерность вектора&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Задержка поиска&lt;/td&gt;
&lt;td&gt;Размер индекса, размерность, top_k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Память/диск&lt;/td&gt;
&lt;td&gt;Количество и точность векторов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Поддержка&lt;/td&gt;
&lt;td&gt;Переиндексация, миграция версий, тестирование&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Простой пример:&lt;/p&gt;

&lt;p&gt;Если у вас 1 миллион чанков, каждый вектор — 3072 float32, то только на векторах:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000,000 × 3072 × 4 bytes ≈ 12.3 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если уменьшить размерность до 1536 — будет примерно вдвое меньше.&lt;/p&gt;

&lt;p&gt;И это без учёта индекса, метаданных и накладных расходов БД.&lt;/p&gt;

&lt;p&gt;Поэтому для крупных проектов важно следить за параметром &lt;code&gt;dimensions&lt;/code&gt; и стоимостью векторной базы.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как использовать параметр dimensions?
&lt;/h2&gt;

&lt;p&gt;В embedding-моделях третьего поколения OpenAI можно управлять размером выходного вектора через параметр &lt;code&gt;dimensions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Пример:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How to reduce AI API cost with model routing?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Это очень полезно в продакшне.&lt;/p&gt;

&lt;p&gt;Можно сравнить:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large 3072&lt;/li&gt;
&lt;li&gt;large 1536&lt;/li&gt;
&lt;li&gt;large 1024&lt;/li&gt;
&lt;li&gt;small (по умолчанию)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;А потом посмотреть на Recall@5, задержку и стоимость.&lt;/p&gt;

&lt;h2&gt;
  
  
  Не ориентируйтесь только на MTEB
&lt;/h2&gt;

&lt;p&gt;Публичные бенчмарки полезны, но не заменяют реальные данные.&lt;/p&gt;

&lt;p&gt;Ваши задачи могут отличаться от тестовых наборов:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Короткие пользовательские запросы&lt;/li&gt;
&lt;li&gt;Документы на смешанном русском и английском&lt;/li&gt;
&lt;li&gt;Много названий продуктов и кодов ошибок&lt;/li&gt;
&lt;li&gt;Таблицы и параметры в тексте&lt;/li&gt;
&lt;li&gt;Пользователи часто пишут разговорно&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Лучше собрать свою небольшую тестовую выборку.&lt;/p&gt;

&lt;p&gt;Простейший формат:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Запрос&lt;/th&gt;
&lt;th&gt;Ожидаемый документ&lt;/th&gt;
&lt;th&gt;Тип&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Как посмотреть баланс?&lt;/td&gt;
&lt;td&gt;billing.md&lt;/td&gt;
&lt;td&gt;FAQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Что указывать в base_url?&lt;/td&gt;
&lt;td&gt;quickstart.md&lt;/td&gt;
&lt;td&gt;technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Как настроить Claude Code?&lt;/td&gt;
&lt;td&gt;claude-code.md&lt;/td&gt;
&lt;td&gt;integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Что делать при ошибке 401?&lt;/td&gt;
&lt;td&gt;auth-errors.md&lt;/td&gt;
&lt;td&gt;troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Прогоните каждый вариант модели и посмотрите, попадает ли нужный документ в топ-3/топ-5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как провести A/B тестирование моделей
&lt;/h2&gt;

&lt;p&gt;Рекомендую такой подход:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Соберите 50-200 реальных запросов
&lt;/h3&gt;

&lt;p&gt;Не придумывайте сами. Лучше взять:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Логи поиска на сайте&lt;/li&gt;
&lt;li&gt;Вопросы в поддержку&lt;/li&gt;
&lt;li&gt;Вопросы из чатов/групп&lt;/li&gt;
&lt;li&gt;Заголовки тикетов&lt;/li&gt;
&lt;li&gt;Комментарии к документации&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Проставьте правильные ответы
&lt;/h3&gt;

&lt;p&gt;Для каждого запроса отметьте 1-3 релевантных чанка или документа.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Постройте несколько индексов
&lt;/h3&gt;

&lt;p&gt;Например:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;index_small_default&lt;/li&gt;
&lt;li&gt;index_large_3072&lt;/li&gt;
&lt;li&gt;index_large_1536&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Прогоните тесты на поиск
&lt;/h3&gt;

&lt;p&gt;Ключевые метрики:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Метрика&lt;/th&gt;
&lt;th&gt;Описание&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recall@3&lt;/td&gt;
&lt;td&gt;Входит ли правильный документ в топ-3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall@5&lt;/td&gt;
&lt;td&gt;Входит ли правильный документ в топ-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;Чем выше позиция правильного документа, тем лучше&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;latency&lt;/td&gt;
&lt;td&gt;Время ответа на запрос&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cost&lt;/td&gt;
&lt;td&gt;Стоимость индекса и поиска&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5. Решите, стоит ли переходить на large
&lt;/h3&gt;

&lt;p&gt;Если прирост Recall@5 всего 1%, а расходы сильно выше — возможно, не стоит.&lt;/p&gt;

&lt;p&gt;Если же Recall@5 вырос с 78% до 90%, а бизнесу критична точность — переход оправдан.&lt;/p&gt;

&lt;h2&gt;
  
  
  Плохой RAG — не всегда вина embedding-модели
&lt;/h2&gt;

&lt;p&gt;Часто даже переход на large не спасает, если проблемы в другом:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Проблема&lt;/th&gt;
&lt;th&gt;Проявление&lt;/th&gt;
&lt;th&gt;Что делать&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Плохо нарезаны чанки&lt;/td&gt;
&lt;td&gt;Контекст найденного ответа неполный&lt;/td&gt;
&lt;td&gt;Перерезать чанки&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Нет метаданных&lt;/td&gt;
&lt;td&gt;Нельзя фильтровать по языку/правам/продукту&lt;/td&gt;
&lt;td&gt;Добавить метаданные&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Слишком короткий запрос&lt;/td&gt;
&lt;td&gt;“Проблема с оплатой” ищет плохо&lt;/td&gt;
&lt;td&gt;Переписывать запросы&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Устаревшие документы&lt;/td&gt;
&lt;td&gt;Находятся старые ответы&lt;/td&gt;
&lt;td&gt;Фильтровать по дате/версии&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Нет rerank&lt;/td&gt;
&lt;td&gt;Топ-результаты похожи, но не точные&lt;/td&gt;
&lt;td&gt;Добавить rerank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Слабый prompt&lt;/td&gt;
&lt;td&gt;Модель отвечает “из головы”&lt;/td&gt;
&lt;td&gt;Жёстко ограничить ответы только по базе&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Перед выбором модели убедитесь, что ваша RAG-пайплайн не слишком “сырая”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как переключаться между embedding-моделями через OpenAI-совместимый API
&lt;/h2&gt;

&lt;p&gt;Если вы используете OpenAI SDK, сменить модель очень просто.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Для экономии
&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Для качества
&lt;/span&gt;&lt;span class="n"&gt;large&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если вы используете OpenAI-совместимый шлюз вроде Crazyrouter, обычно менять нужно только имя модели и base URL.&lt;/p&gt;

&lt;p&gt;Можно сначала проверить вызовы в &lt;a href="https://crazyrouter.com/playground?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;Crazyrouter Playground&lt;/a&gt;, а затем перенести параметры на сервер.&lt;/p&gt;

&lt;h2&gt;
  
  
  Рекомендуемая дорожная карта проекта
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Этап 1: MVP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Используйте text-embedding-3-small&lt;/li&gt;
&lt;li&gt;Храните локально или через pgvector&lt;/li&gt;
&lt;li&gt;Поиск top 5&lt;/li&gt;
&lt;li&gt;Без сложного rerank&lt;/li&gt;
&lt;li&gt;Цель — рабочий прототип&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Этап 2: Реальное тестирование
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Соберите пользовательские запросы&lt;/li&gt;
&lt;li&gt;Проставьте правильные документы&lt;/li&gt;
&lt;li&gt;Сравните small и large&lt;/li&gt;
&lt;li&gt;Подберите стратегию нарезки чанков&lt;/li&gt;
&lt;li&gt;Цель — найти узкие места поиска&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Этап 3: Оптимизация для продакшна
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Используйте large или large с уменьшенной размерностью&lt;/li&gt;
&lt;li&gt;Добавьте гибридный поиск&lt;/li&gt;
&lt;li&gt;Включите rerank&lt;/li&gt;
&lt;li&gt;Фильтрация по правам&lt;/li&gt;
&lt;li&gt;Ссылки на источник&lt;/li&gt;
&lt;li&gt;Цель — стабильность, объяснимость, контроль затрат&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Вывод: large — не всегда ответ, но тестировать стоит
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; даёт более сильное семантическое представление, особенно полезен для сложных RAG, многоязычных баз и продвинутого поиска.&lt;/p&gt;

&lt;p&gt;Но не стоит слепо брать самую мощную модель.&lt;/p&gt;

&lt;p&gt;Лучше действовать так:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Сначала small — для оценки затрат и базового качества&lt;/li&gt;
&lt;li&gt;Потом large — для проверки реального прироста на ваших данных&lt;/li&gt;
&lt;li&gt;Управляйте размерностью через dimensions&lt;/li&gt;
&lt;li&gt;Добавляйте rerank и гибридный поиск, а не только меняйте модель&lt;/li&gt;
&lt;li&gt;Оценивайте, насколько критичны ошибки для бизнеса&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Если RAG влияет на решения пользователей, поддержку или оплату — скорее всего, large оправдан.&lt;/p&gt;

&lt;p&gt;Если это внутренний инструмент или ранний прототип — small практичнее.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large всегда лучше, чем text-embedding-3-small?
&lt;/h3&gt;

&lt;p&gt;Обычно да, но не всегда оправдано. Смотрите, насколько реально растёт качество поиска и окупает ли это затраты.&lt;/p&gt;

&lt;h3&gt;
  
  
  Снижение dimensions ухудшает качество?
&lt;/h3&gt;

&lt;p&gt;Может ухудшить. Меньше размерность — дешевле хранить и искать, но возможна потеря качества. Проверьте на своей тестовой выборке.&lt;/p&gt;

&lt;h3&gt;
  
  
  В RAG-проекте сначала оптимизировать модель или нарезку чанков?
&lt;/h3&gt;

&lt;p&gt;Сначала — нарезку и тестовую выборку. Если чанки плохие, даже сильная embedding-модель мало поможет.&lt;/p&gt;

&lt;h3&gt;
  
  
  Для многоязычных баз лучше large?
&lt;/h3&gt;

&lt;p&gt;Стоит протестировать в первую очередь. Large официально позиционируется для английских и неанглийских задач, а многоязычный поиск особенно зависит от семантики.&lt;/p&gt;

&lt;h3&gt;
  
  
  Можно ли вызывать text-embedding-3-large через Crazyrouter?
&lt;/h3&gt;

&lt;p&gt;Да, через OpenAI-совместимый эндпоинт &lt;code&gt;/v1/embeddings&lt;/code&gt;. Просто укажите &lt;code&gt;https://crazyrouter.com/v1&lt;/code&gt; как base URL в коде.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large — для чего нужен embeddings-модель и как он работает в RAG</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:37:32 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-dlia-chiegho-nuzhien-embeddings-modiel-i-kak-on-rabotaiet-v-rag-1dka</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-dlia-chiegho-nuzhien-embeddings-modiel-i-kak-on-rabotaiet-v-rag-1dka</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large — для чего нужен embeddings-модель и как он работает в RAG
&lt;/h1&gt;

&lt;p&gt;Когда вы используете GPT, Claude, Gemini, чаще всего вы “генерируете ответы”. Но такие модели, как &lt;code&gt;text-embedding-3-large&lt;/code&gt;, не предназначены для чата и не пишут тексты напрямую.&lt;/p&gt;

&lt;p&gt;Их основная задача — &lt;strong&gt;преобразовывать текст в числовой вектор&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Звучит абстрактно, но именно это лежит в основе RAG-решений, семантического поиска, рекомендаций похожих статей, чат-ботов поддержки, поиска по документам и других подобных задач.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" alt="text-embedding-3-large semantic search pipeline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Если вы хотите, чтобы ИИ находил ответы в ваших документах, а не просто “угадывал” из своей памяти, без embeddings не обойтись.&lt;/p&gt;

&lt;h2&gt;
  
  
  Для чего нужен text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; — это мощная модель для получения текстовых векторов от OpenAI. Она читает текст и возвращает вектор большой размерности.&lt;/p&gt;

&lt;p&gt;Вектор — это “семантические координаты” текста.&lt;/p&gt;

&lt;p&gt;Например, возьмём такие фразы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Как снизить стоимость AI API?”&lt;/li&gt;
&lt;li&gt;“Как сэкономить на GPT?”&lt;/li&gt;
&lt;li&gt;“Что делать, если вызовы AI моделей слишком дорогие?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ключевые слова разные, но смысл близок. Embedding-модель спроецирует их в близкие точки пространства.&lt;/p&gt;

&lt;p&gt;Это позволяет делать то, что не под силу обычному поиску по ключевым словам: &lt;strong&gt;искать по смыслу&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Типичные применения:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Сценарий&lt;/th&gt;
&lt;th&gt;Роль embeddings&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Семантический поиск&lt;/td&gt;
&lt;td&gt;Преобразует вопросы и документы в векторы, ищет наиболее похожие&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG (знаниевая база)&lt;/td&gt;
&lt;td&gt;Сначала ищет релевантные документы, затем передаёт их генеративной модели&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Рекомендации&lt;/td&gt;
&lt;td&gt;Рекомендует контент по смысловой близости описаний&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Кластеризация&lt;/td&gt;
&lt;td&gt;Автоматически группирует похожие документы&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Классификация&lt;/td&gt;
&lt;td&gt;Определяет принадлежность текста к категории по схожести&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Детектирование аномалий&lt;/td&gt;
&lt;td&gt;Находит “выбивающиеся” по смыслу данные&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;В официальной документации OpenAI embeddings используются для поиска, кластеризации, рекомендаций, обнаружения аномалий, оценки разнообразия и классификации.&lt;/p&gt;

&lt;h2&gt;
  
  
  Почему RAG особенно нуждается в text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;RAG (Retrieval-Augmented Generation) — это “генерация с усилением за счёт поиска”.&lt;/p&gt;

&lt;p&gt;Типовой процесс:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Разбиваем документы на небольшие фрагменты&lt;/li&gt;
&lt;li&gt;Преобразуем каждый фрагмент в вектор через embedding-модель&lt;/li&gt;
&lt;li&gt;Сохраняем в векторную базу данных&lt;/li&gt;
&lt;li&gt;При вопросе пользователя тоже получаем вектор&lt;/li&gt;
&lt;li&gt;Находим наиболее релевантные фрагменты&lt;/li&gt;
&lt;li&gt;Передаём их генеративной модели для ответа&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Без embeddings система может только искать по ключевым словам.&lt;/p&gt;

&lt;p&gt;Например, пользователь спрашивает:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Почему баланс быстро уменьшается?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;А в документации написано:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Модели с большим контекстом используют больше tokens, стоимость считается по количеству входных и выходных tokens.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ключевые слова не совпадают, но смысл связан. Embedding решает именно такие задачи.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" alt="RAG workflow with embeddings and vector database" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Чем отличается text-embedding-3-large от чат-моделей?
&lt;/h2&gt;

&lt;p&gt;Многие разработчики поначалу думают, что embedding — это тоже “модель для вопросов-ответов”. Это не так.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Возможности&lt;/th&gt;
&lt;th&gt;Чат-модель&lt;/th&gt;
&lt;th&gt;Embedding-модель&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Входные данные&lt;/td&gt;
&lt;td&gt;Вопросы, контекст&lt;/td&gt;
&lt;td&gt;Текстовые фрагменты&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Выходные данные&lt;/td&gt;
&lt;td&gt;Ответ на естественном языке&lt;/td&gt;
&lt;td&gt;Числовой вектор&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Основные задачи&lt;/td&gt;
&lt;td&gt;Генерация, суммирование, рассуждение, диалог&lt;/td&gt;
&lt;td&gt;Поиск, схожесть, кластеризация, классификация&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Отвечает ли напрямую на вопросы&lt;/td&gt;
&lt;td&gt;Да&lt;/td&gt;
&lt;td&gt;Нет&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Роль в RAG&lt;/td&gt;
&lt;td&gt;Генерирует финальный ответ&lt;/td&gt;
&lt;td&gt;Находит релевантные данные&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Можно представить их так:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;embedding-модель — библиотекарь, ищет нужные материалы&lt;/li&gt;
&lt;li&gt;чат-модель — автор, формулирует ответ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;В полноценной системе поиска по знаниям нужны обе.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ключевые параметры text-embedding-3-large
&lt;/h2&gt;

&lt;p&gt;Согласно документации OpenAI, &lt;code&gt;text-embedding-3-large&lt;/code&gt; по умолчанию выдаёт вектор размером 3072, максимальный размер входа — 8192 токенов.&lt;/p&gt;

&lt;p&gt;Поддерживается параметр &lt;code&gt;dimensions&lt;/code&gt; — можно уменьшить размерность вектора, сохранив основную смысловую нагрузку.&lt;/p&gt;

&lt;p&gt;Это важно, потому что размерность влияет на:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;стоимость хранения в векторной базе&lt;/li&gt;
&lt;li&gt;скорость поиска&lt;/li&gt;
&lt;li&gt;размер индекса&lt;/li&gt;
&lt;li&gt;использование памяти&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для небольших FAQ или базы поддержки не всегда нужен полный вектор на 3072 измерения. Можно попробовать 1024 или 1536 и сравнить качество поиска.&lt;/p&gt;

&lt;h2&gt;
  
  
  Как вызвать text-embedding-3-large через OpenAI-совместимый API?
&lt;/h2&gt;

&lt;p&gt;Пример на Python. В API-адресе не добавляйте UTM-параметры.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API gateway helps developers connect to many models with one key.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Если вы уже используете OpenAI SDK, просто поменяйте &lt;code&gt;base_url&lt;/code&gt; на адрес совместимого шлюза.&lt;/p&gt;

&lt;p&gt;Подробнее о подключении через OpenAI-совместимый API читайте в &lt;a href="https://docs.crazyrouter.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;документации Crazyrouter&lt;/a&gt;, а сравнить стоимость разных моделей можно на &lt;a href="https://crazyrouter.com/pricing?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;странице цен&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Минимальный пример семантического поиска
&lt;/h2&gt;

&lt;p&gt;Ниже — простейшая реализация cosine similarity для embeddings. В продакшене используйте векторные базы данных: Qdrant, Milvus, Pinecone, pgvector и др.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="n"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API costs are calculated by input and output tokens.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RAG systems retrieve relevant documents before generating answers.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vector databases store embeddings for semantic search.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How does retrieval augmented generation find context?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;query_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doc_vecs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc_vecs&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Этот пример прост, но отражает суть семантического поиска: текст → вектор → сортировка по схожести.&lt;/p&gt;

&lt;h2&gt;
  
  
  Когда стоит использовать text-embedding-3-large?
&lt;/h2&gt;

&lt;p&gt;Рекомендации по выбору:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Задача&lt;/th&gt;
&lt;th&gt;Совет&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Качественный RAG, мультиязычный поиск, большие базы&lt;/td&gt;
&lt;td&gt;Сначала пробуйте text-embedding-3-large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQ, небольшой поиск, чувствительность к цене&lt;/td&gt;
&lt;td&gt;Можно начать с text-embedding-3-small&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Мультиязычный поиск&lt;/td&gt;
&lt;td&gt;large предпочтительнее&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Только фильтрация по ключевым словам&lt;/td&gt;
&lt;td&gt;Embedding не обязателен&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Очень большой объём данных, ограниченный бюджет&lt;/td&gt;
&lt;td&gt;Оцените уменьшение размерности и многоуровневый поиск&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Если качество поиска критично для пользователей — &lt;code&gt;text-embedding-3-large&lt;/code&gt; стоит тестировать в первую очередь.&lt;/p&gt;

&lt;p&gt;Для внутренних инструментов или MVP можно начать с более дешёвых моделей.&lt;/p&gt;

&lt;h2&gt;
  
  
  Лучшие практики для RAG-проектов
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Не делайте слишком крупные чанки
&lt;/h3&gt;

&lt;p&gt;Не загружайте целиком большие документы. Лучше разбивать по смысловым абзацам.&lt;/p&gt;

&lt;p&gt;Рекомендации:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;300–800 токенов на один чанк&lt;/li&gt;
&lt;li&gt;50–100 токенов overlap между чанками&lt;/li&gt;
&lt;li&gt;Метаданные (заголовок, путь, дата) хранить отдельно&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Предобработка запросов
&lt;/h3&gt;

&lt;p&gt;Вопросы пользователей часто короткие и разговорные. Можно сначала переформулировать их через чат-модель, а потом делать embedding.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Не ограничивайтесь только top 1
&lt;/h3&gt;

&lt;p&gt;Обычно в RAG берут top 3–10 фрагментов, затем передают их генеративной модели.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Используйте rerank для точности
&lt;/h3&gt;

&lt;p&gt;Embedding — это грубый отбор, rerank — точная сортировка. Для поддержки, юридических, финансовых и технических документов rerank заметно снижает число нерелевантных ответов.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Анализируйте реальные запросы
&lt;/h3&gt;

&lt;p&gt;Не ограничивайтесь тестовыми данными. Анонимизируйте и анализируйте настоящие вопросы пользователей — только так можно оценить качество поиска.&lt;/p&gt;

&lt;h2&gt;
  
  
  Частые заблуждения
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Миф 1: чем выше размерность embedding, тем лучше
&lt;/h3&gt;

&lt;p&gt;Не всегда. Большая размерность — выше выразительность, но и выше затраты на хранение и вычисления. Важно балансировать качество, задержку и стоимость.&lt;/p&gt;

&lt;h3&gt;
  
  
  Миф 2: если есть embedding, RAG не будет “галлюцинировать”
&lt;/h3&gt;

&lt;p&gt;Это не так. Embedding только ищет материалы. Надёжность ответа зависит от prompt'а, качества контекста, возможностей модели и ограничений на цитирование.&lt;/p&gt;

&lt;h3&gt;
  
  
  Миф 3: любой документ можно просто векторизовать
&lt;/h3&gt;

&lt;p&gt;Таблицы, код, логи, сканы PDF требуют особой обработки. Для таблиц лучше сохранять структуру.&lt;/p&gt;

&lt;h2&gt;
  
  
  Вывод: text-embedding-3-large — “поисковый фундамент” AI-приложений
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; — это не чат-модель, а инструмент для оценки смысловой близости текстов.&lt;/p&gt;

&lt;p&gt;Он идеально подходит для:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG-знаниевых баз&lt;/li&gt;
&lt;li&gt;семантического поиска&lt;/li&gt;
&lt;li&gt;мультиязычного поиска&lt;/li&gt;
&lt;li&gt;рекомендательных систем&lt;/li&gt;
&lt;li&gt;кластеризации документов&lt;/li&gt;
&lt;li&gt;классификации текстов&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если вы делаете AI-поддержку, корпоративную базу знаний, поиск по документам, коду или рекомендации — embedding-модель будет основой системы.&lt;/p&gt;

&lt;p&gt;Подключиться к embeddings API можно через OpenAI-совместимый интерфейс. Если вы уже используете OpenAI SDK, переход прост: поменяйте &lt;code&gt;base_url&lt;/code&gt;, используйте новый API-ключ — и всё работает по-прежнему.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Может ли text-embedding-3-large напрямую отвечать на вопросы?
&lt;/h3&gt;

&lt;p&gt;Нет. Она возвращает только вектор, а не текстовый ответ. Для генерации ответа нужен GPT, Claude, Gemini или другая чат-модель.&lt;/p&gt;

&lt;h3&gt;
  
  
  Подходит ли text-embedding-3-large для RAG?
&lt;/h3&gt;

&lt;p&gt;Да. Обычно её используют на этапе поиска: вопрос и документы преобразуются в векторы, затем ищутся наиболее релевантные.&lt;/p&gt;

&lt;h3&gt;
  
  
  Какая размерность по умолчанию у text-embedding-3-large?
&lt;/h3&gt;

&lt;p&gt;В официальной документации — 3072. Можно уменьшить через параметр &lt;code&gt;dimensions&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Как выбрать между text-embedding-3-large и text-embedding-3-small?
&lt;/h3&gt;

&lt;p&gt;Если важны качество поиска, мультиязычность или продакшн-RAG — пробуйте large. Если важна цена или объём данных огромный — small подойдёт для базовой версии.&lt;/p&gt;

&lt;h3&gt;
  
  
  Обязательна ли векторная база данных?
&lt;/h3&gt;

&lt;p&gt;Для небольших демо можно обойтись массивами и cosine similarity. В продакшене лучше использовать специализированные базы: pgvector, Qdrant, Milvus, Pinecone.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large или small: стоимость, качество поиска и выбор для RAG</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:31:04 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-ili-small-stoimost-kachiestvo-poiska-i-vybor-dlia-rag-275i</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-ili-small-stoimost-kachiestvo-poiska-i-vybor-dlia-rag-275i</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large или small: стоимость, качество поиска и выбор для RAG
&lt;/h1&gt;

&lt;p&gt;При разработке RAG или семантического поиска почти все упираются в один вопрос:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;我到底该用 &lt;code&gt;text-embedding-3-large&lt;/code&gt;，还是用更便宜的 &lt;code&gt;text-embedding-3-small&lt;/code&gt;？&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ответ не сводится к «large всегда лучше» или «small всегда достаточно».&lt;/p&gt;

&lt;p&gt;更准确的说法是：&lt;strong&gt;如果检索质量直接影响业务结果，large 值得测试；如果项目还在早期或数据量特别大，small 往往是更稳的起点。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhzh8lm3zuxiar8jlg4dy.webp" alt="embedding model cost and quality comparison dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Разберём выбор embedding-модели с точки зрения реального проекта.&lt;/p&gt;

&lt;h2&gt;
  
  
  先说结论：怎么选？
&lt;/h2&gt;

&lt;p&gt;可以直接按这个表判断：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;推荐起点&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;企业知识库问答&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;召回质量更重要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多语言 RAG&lt;/td&gt;
&lt;td&gt;text-embedding-3-large&lt;/td&gt;
&lt;td&gt;非英文和跨语言检索更值得测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;客服机器人&lt;/td&gt;
&lt;td&gt;large 或 small A/B 测试&lt;/td&gt;
&lt;td&gt;看错误回答成本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内部工具搜索&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;成本优先，容错较高&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MVP / demo&lt;/td&gt;
&lt;td&gt;text-embedding-3-small&lt;/td&gt;
&lt;td&gt;先跑通链路&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;海量文档索引&lt;/td&gt;
&lt;td&gt;small 或 large 降维&lt;/td&gt;
&lt;td&gt;控制存储和检索成本&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码/技术文档搜索&lt;/td&gt;
&lt;td&gt;large + rerank&lt;/td&gt;
&lt;td&gt;语义和精确匹配都重要&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;如果你只能记一句话：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;先用 small 建基线，再用 large 在真实 query 上评测提升。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large 强在哪里？
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; 是更高能力的 embedding 模型。&lt;/p&gt;

&lt;p&gt;根据 OpenAI 官方文档，它默认输出 3072 维向量，最大输入 8192 tokens，定位是英文和非英文任务上的高能力 embedding 模型。&lt;/p&gt;

&lt;p&gt;它的优势主要体现在：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;更强的语义表达能力&lt;/li&gt;
&lt;li&gt;更适合复杂查询&lt;/li&gt;
&lt;li&gt;更适合多语言或跨语言检索&lt;/li&gt;
&lt;li&gt;对长文档知识库更友好&lt;/li&gt;
&lt;li&gt;更适合作为生产级 RAG 的候选模型&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;但它也有代价：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;单位 token 成本更高&lt;/li&gt;
&lt;li&gt;默认向量维度更大&lt;/li&gt;
&lt;li&gt;向量库存储成本更高&lt;/li&gt;
&lt;li&gt;检索时内存和索引压力更大&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以，选 large 的前提应该是：它带来的召回提升能覆盖额外成本。&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-small 适合什么？
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-small&lt;/code&gt; 的定位更偏成本效率。&lt;/p&gt;

&lt;p&gt;它适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FAQ 搜索&lt;/li&gt;
&lt;li&gt;小型知识库&lt;/li&gt;
&lt;li&gt;早期 MVP&lt;/li&gt;
&lt;li&gt;内部检索工具&lt;/li&gt;
&lt;li&gt;单语言内容库&lt;/li&gt;
&lt;li&gt;对错误召回容忍度较高的场景&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;很多项目没必要一开始就上 large。&lt;/p&gt;

&lt;p&gt;尤其当你还没有真实用户问题、没有评测集、没有线上反馈时，上大模型向量可能只是“感觉更稳”，但你无法证明它真的更好。&lt;/p&gt;

&lt;h2&gt;
  
  
  成本不只看 API 价格
&lt;/h2&gt;

&lt;p&gt;Embedding 成本不只是调用模型那一项。&lt;/p&gt;

&lt;p&gt;你还要算：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;成本项&lt;/th&gt;
&lt;th&gt;受什么影响&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API 调用成本&lt;/td&gt;
&lt;td&gt;输入 tokens 数量、重复索引次数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;向量库存储&lt;/td&gt;
&lt;td&gt;文档数量、chunk 数、向量维度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;检索延迟&lt;/td&gt;
&lt;td&gt;索引规模、维度、top_k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存/磁盘&lt;/td&gt;
&lt;td&gt;向量数量和精度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;维护成本&lt;/td&gt;
&lt;td&gt;重建索引、版本迁移、评测&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;举个简单例子：&lt;/p&gt;

&lt;p&gt;如果你有 100 万个 chunk，每个向量 3072 维，使用 float32 存储，单纯向量数据大约是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000,000 × 3072 × 4 bytes ≈ 12.3 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果降到 1536 维，大约就是一半。&lt;/p&gt;

&lt;p&gt;这还不包括索引结构、metadata、数据库额外开销。&lt;/p&gt;

&lt;p&gt;所以大规模项目一定要关注 &lt;code&gt;dimensions&lt;/code&gt; 参数和向量数据库成本。&lt;/p&gt;

&lt;h2&gt;
  
  
  dimensions 参数怎么用？
&lt;/h2&gt;

&lt;p&gt;OpenAI 第三代 embedding 模型支持通过 &lt;code&gt;dimensions&lt;/code&gt; 控制输出向量大小。&lt;/p&gt;

&lt;p&gt;示例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How to reduce AI API cost with model routing?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这对生产环境很有用。&lt;/p&gt;

&lt;p&gt;你可以测试：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large 3072 维&lt;/li&gt;
&lt;li&gt;large 1536 维&lt;/li&gt;
&lt;li&gt;large 1024 维&lt;/li&gt;
&lt;li&gt;small 默认维度&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;然后比较 top 5 召回率、延迟和成本。&lt;/p&gt;

&lt;h2&gt;
  
  
  选型不要只看 MTEB 分数
&lt;/h2&gt;

&lt;p&gt;公开 benchmark 有参考价值，但不要把它当最终答案。&lt;/p&gt;

&lt;p&gt;你的业务数据可能和 benchmark 完全不同：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;用户问题很短&lt;/li&gt;
&lt;li&gt;文档是中英混合&lt;/li&gt;
&lt;li&gt;内容里有很多产品名和错误码&lt;/li&gt;
&lt;li&gt;有大量表格和参数说明&lt;/li&gt;
&lt;li&gt;用户经常用口语表达&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以最好建立自己的小评测集。&lt;/p&gt;

&lt;p&gt;最简单的格式：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;query&lt;/th&gt;
&lt;th&gt;应召回文档&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;怎么查看余额？&lt;/td&gt;
&lt;td&gt;billing.md&lt;/td&gt;
&lt;td&gt;FAQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;base_url 应该填什么？&lt;/td&gt;
&lt;td&gt;quickstart.md&lt;/td&gt;
&lt;td&gt;technical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code 怎么配置？&lt;/td&gt;
&lt;td&gt;claude-code.md&lt;/td&gt;
&lt;td&gt;integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API 调用失败 401 怎么办？&lt;/td&gt;
&lt;td&gt;auth-errors.md&lt;/td&gt;
&lt;td&gt;troubleshooting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;每个模型跑一遍，看 top 3 / top 5 是否命中。&lt;/p&gt;

&lt;h2&gt;
  
  
  一个可执行的 A/B 测试流程
&lt;/h2&gt;

&lt;p&gt;推荐你这样测：&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 准备 50-200 个真实 query
&lt;/h3&gt;

&lt;p&gt;不要自己拍脑袋写。优先用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;站内搜索日志&lt;/li&gt;
&lt;li&gt;客服问题&lt;/li&gt;
&lt;li&gt;用户群问题&lt;/li&gt;
&lt;li&gt;工单标题&lt;/li&gt;
&lt;li&gt;文档评论&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 标注正确答案文档
&lt;/h3&gt;

&lt;p&gt;每个 query 标 1-3 个正确 chunk 或文档。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 建立多个索引
&lt;/h3&gt;

&lt;p&gt;例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;index_small_default&lt;/li&gt;
&lt;li&gt;index_large_3072&lt;/li&gt;
&lt;li&gt;index_large_1536&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 跑召回评测
&lt;/h3&gt;

&lt;p&gt;核心指标：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;指标&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Recall@3&lt;/td&gt;
&lt;td&gt;前 3 个结果是否包含正确文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall@5&lt;/td&gt;
&lt;td&gt;前 5 个结果是否包含正确文档&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRR&lt;/td&gt;
&lt;td&gt;正确文档排得越靠前越好&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;latency&lt;/td&gt;
&lt;td&gt;查询耗时&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cost&lt;/td&gt;
&lt;td&gt;索引和查询成本&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5. 决定是否升级 large
&lt;/h3&gt;

&lt;p&gt;如果 large 只提升 1%，但成本高很多，未必值得。&lt;/p&gt;

&lt;p&gt;如果 large 把 Recall@5 从 78% 提到 90%，而业务又很依赖准确检索，那就很值得。&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG 质量差，未必是 embedding 模型的问题
&lt;/h2&gt;

&lt;p&gt;很多时候，换成 large 也救不了系统。&lt;/p&gt;

&lt;p&gt;因为问题可能在别处：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;表现&lt;/th&gt;
&lt;th&gt;优先修复&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;chunk 切坏了&lt;/td&gt;
&lt;td&gt;找到的内容上下文不完整&lt;/td&gt;
&lt;td&gt;重新切块&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;metadata 缺失&lt;/td&gt;
&lt;td&gt;无法按语言/权限/产品过滤&lt;/td&gt;
&lt;td&gt;补 metadata&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;query 太短&lt;/td&gt;
&lt;td&gt;“扣费问题”召回不稳定&lt;/td&gt;
&lt;td&gt;query rewrite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文档过期&lt;/td&gt;
&lt;td&gt;找到了旧答案&lt;/td&gt;
&lt;td&gt;加更新时间和版本过滤&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;没有 rerank&lt;/td&gt;
&lt;td&gt;top 结果相似但不精确&lt;/td&gt;
&lt;td&gt;加 rerank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;prompt 太松&lt;/td&gt;
&lt;td&gt;模型根据常识乱答&lt;/td&gt;
&lt;td&gt;强制只根据资料回答&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;所以选模型前，先保证 RAG 管线别太粗糙。&lt;/p&gt;

&lt;h2&gt;
  
  
  在 OpenAI 兼容接口中切换 embedding 模型
&lt;/h2&gt;

&lt;p&gt;如果你通过 OpenAI SDK 接入，切换模型很简单。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 成本效率优先
&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 质量优先
&lt;/span&gt;&lt;span class="n"&gt;large&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;semantic search for AI documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果你用 Crazyrouter 这类 OpenAI 兼容网关，通常不用改 SDK，只改模型名和 base URL。&lt;/p&gt;

&lt;p&gt;你可以先在 &lt;a href="https://crazyrouter.com/playground?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=dev_community" rel="noopener noreferrer"&gt;Crazyrouter Playground&lt;/a&gt; 验证调用，再把同样参数放进服务端。&lt;/p&gt;

&lt;h2&gt;
  
  
  推荐的项目路线图
&lt;/h2&gt;

&lt;h3&gt;
  
  
  阶段 1：MVP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;用 text-embedding-3-small&lt;/li&gt;
&lt;li&gt;本地或 pgvector 存储&lt;/li&gt;
&lt;li&gt;top 5 检索&lt;/li&gt;
&lt;li&gt;不加复杂 rerank&lt;/li&gt;
&lt;li&gt;目标：跑通链路&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  阶段 2：真实评测
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;收集用户 query&lt;/li&gt;
&lt;li&gt;标注正确文档&lt;/li&gt;
&lt;li&gt;测 small vs large&lt;/li&gt;
&lt;li&gt;调整 chunk 策略&lt;/li&gt;
&lt;li&gt;目标：找到召回瓶颈&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  阶段 3：生产优化
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;使用 large 或 large 降维版本&lt;/li&gt;
&lt;li&gt;加 hybrid search&lt;/li&gt;
&lt;li&gt;加 rerank&lt;/li&gt;
&lt;li&gt;加权限过滤&lt;/li&gt;
&lt;li&gt;加引用来源&lt;/li&gt;
&lt;li&gt;目标：稳定、可解释、可控成本&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  结论：large 不是默认答案，但值得认真测试
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; 的价值在于更强的语义表达能力，尤其适合高质量 RAG、多语言知识库和复杂语义搜索。&lt;/p&gt;

&lt;p&gt;但工程上不要盲目上最强模型。&lt;/p&gt;

&lt;p&gt;更好的策略是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;用 small 建立成本和效果基线&lt;/li&gt;
&lt;li&gt;用真实 query 测 large 的提升&lt;/li&gt;
&lt;li&gt;用 dimensions 控制向量大小&lt;/li&gt;
&lt;li&gt;加 rerank 和 hybrid search，而不是只靠换模型&lt;/li&gt;
&lt;li&gt;根据业务错误成本决定是否升级&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;如果 RAG 结果直接影响用户决策、客服体验或付费转化，&lt;code&gt;text-embedding-3-large&lt;/code&gt; 很可能值得。&lt;/p&gt;

&lt;p&gt;如果只是内部工具或早期验证，先从 small 开始更务实。&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large 一定比 text-embedding-3-small 好吗？
&lt;/h3&gt;

&lt;p&gt;通常能力更强，但不代表每个项目都值得用。要看真实 query 的召回提升是否覆盖成本。&lt;/p&gt;

&lt;h3&gt;
  
  
  dimensions 降低后会不会影响效果？
&lt;/h3&gt;

&lt;p&gt;可能会。降维能减少存储和检索成本，但可能降低召回质量。建议用自己的评测集测试。&lt;/p&gt;

&lt;h3&gt;
  
  
  RAG 项目应该先优化模型还是切块？
&lt;/h3&gt;

&lt;p&gt;先优化切块和评测。chunk 策略很差时，换更强 embedding 模型也可能效果有限。&lt;/p&gt;

&lt;h3&gt;
  
  
  多语言知识库更适合 text-embedding-3-large 吗？
&lt;/h3&gt;

&lt;p&gt;值得优先测试。官方定位里 large 适合英文和非英文任务，多语言检索通常更依赖语义表达能力。&lt;/p&gt;

&lt;h3&gt;
  
  
  可以用 Crazyrouter 调用 text-embedding-3-large 吗？
&lt;/h3&gt;

&lt;p&gt;可以通过 OpenAI 兼容的 &lt;code&gt;/v1/embeddings&lt;/code&gt; 端点调用。代码里使用 &lt;code&gt;https://crazyrouter.com/v1&lt;/code&gt; 作为 base URL 即可。&lt;/p&gt;

&lt;h2&gt;
  
  
  Быстрый старт с Crazyrouter
&lt;/h2&gt;

&lt;p&gt;Если вам нужен OpenAI-compatible API для embeddings, RAG и нескольких AI-моделей через один ключ, попробуйте &lt;a href="https://crazyrouter.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=embedding_i18n" rel="noopener noreferrer"&gt;Crazyrouter&lt;/a&gt;. Базовый URL для SDK: &lt;code&gt;https://crazyrouter.com/v1&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Как построить RAG-базу знаний на text-embedding-3-large: chunking, embeddings и rerank</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:31:02 +0000</pubDate>
      <link>https://dev.to/xujfcn/kak-postroit-rag-bazu-znanii-na-text-embedding-3-large-chunking-embeddings-i-rerank-a20</link>
      <guid>https://dev.to/xujfcn/kak-postroit-rag-bazu-znanii-na-text-embedding-3-large-chunking-embeddings-i-rerank-a20</guid>
      <description>&lt;h1&gt;
  
  
  Как построить RAG-базу знаний на text-embedding-3-large: chunking, embeddings и rerank
&lt;/h1&gt;

&lt;p&gt;Многие RAG-демо выглядят просто: загрузили PDF, задали вопрос, получили ответ.&lt;/p&gt;

&lt;p&gt;Но в production проблемы появляются сразу:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;文档太长，直接塞不进上下文&lt;/li&gt;
&lt;li&gt;关键词搜索找不到语义相近内容&lt;/li&gt;
&lt;li&gt;用户问法很口语，文档写法很正式&lt;/li&gt;
&lt;li&gt;搜出来的内容不准，模型就开始编&lt;/li&gt;
&lt;li&gt;数据一多，检索速度和成本都上来了&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; 解决的是其中最关键的一环：&lt;strong&gt;把问题和文档变成可比较的语义向量&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnk2qn51gfxp6feeavno.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnk2qn51gfxp6feeavno.webp" alt="RAG knowledge base architecture with embeddings" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;В этой статье без лишней теории разберём инженерный RAG-пайплайн, который можно довести до production.&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG 系统的基本架构
&lt;/h2&gt;

&lt;p&gt;一个最常见的 RAG 知识库通常分成两条链路。&lt;/p&gt;

&lt;p&gt;第一条是离线索引链路：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;收集文档&lt;/li&gt;
&lt;li&gt;清洗文本&lt;/li&gt;
&lt;li&gt;切块 chunking&lt;/li&gt;
&lt;li&gt;调用 embedding 模型生成向量&lt;/li&gt;
&lt;li&gt;存入向量数据库&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;第二条是在线问答链路：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;用户提问&lt;/li&gt;
&lt;li&gt;把问题转成 embedding&lt;/li&gt;
&lt;li&gt;在向量库里检索相似文档块&lt;/li&gt;
&lt;li&gt;可选：rerank 重新排序&lt;/li&gt;
&lt;li&gt;拼接上下文&lt;/li&gt;
&lt;li&gt;调用聊天模型生成答案&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这个流程里，&lt;code&gt;text-embedding-3-large&lt;/code&gt; 主要出现在第 4 步和在线链路第 2 步。&lt;/p&gt;

&lt;p&gt;它不负责最终回答，但它决定了模型能不能拿到正确资料。&lt;/p&gt;

&lt;h2&gt;
  
  
  第一步：准备文档和切块
&lt;/h2&gt;

&lt;p&gt;RAG 质量很大程度取决于 chunk。&lt;/p&gt;

&lt;p&gt;切得太大：召回结果噪声多，模型读到很多无关内容。&lt;/p&gt;

&lt;p&gt;切得太小：上下文不完整，模型拿不到足够信息。&lt;/p&gt;

&lt;p&gt;一个常用起点：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;文档类型&lt;/th&gt;
&lt;th&gt;建议 chunk 大小&lt;/th&gt;
&lt;th&gt;overlap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FAQ / 帮助中心&lt;/td&gt;
&lt;td&gt;200-500 tokens&lt;/td&gt;
&lt;td&gt;30-80 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;技术文档&lt;/td&gt;
&lt;td&gt;400-800 tokens&lt;/td&gt;
&lt;td&gt;80-120 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;长篇报告&lt;/td&gt;
&lt;td&gt;600-1000 tokens&lt;/td&gt;
&lt;td&gt;100-150 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码文档&lt;/td&gt;
&lt;td&gt;按函数/类/标题切&lt;/td&gt;
&lt;td&gt;视情况&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;示例切块代码：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;chunk_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunk_size&lt;/span&gt;
        &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;overlap&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;生产环境不要只按空格切。更好的方式是按标题、段落、列表、代码块边界切。&lt;/p&gt;

&lt;h2&gt;
  
  
  第二步：用 text-embedding-3-large 生成向量
&lt;/h2&gt;

&lt;p&gt;下面代码使用 OpenAI 兼容接口。你可以用同一个 SDK 调用 &lt;code&gt;/v1/embeddings&lt;/code&gt;。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果你要控制向量维度，可以加 &lt;code&gt;dimensions&lt;/code&gt; 参数：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dimensions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;维度越低，存储和检索成本通常越低；但召回质量可能下降。建议用真实问题集做 A/B 测试。&lt;/p&gt;

&lt;h2&gt;
  
  
  第三步：存入向量数据库
&lt;/h2&gt;

&lt;p&gt;小项目可以用本地文件或 SQLite 做 demo，但生产环境建议使用专门的向量数据库。&lt;/p&gt;

&lt;p&gt;常见选择：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;工具&lt;/th&gt;
&lt;th&gt;适合场景&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pgvector&lt;/td&gt;
&lt;td&gt;已经使用 PostgreSQL，希望少引入组件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qdrant&lt;/td&gt;
&lt;td&gt;独立向量数据库，部署简单，过滤能力强&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Milvus&lt;/td&gt;
&lt;td&gt;大规模向量检索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinecone&lt;/td&gt;
&lt;td&gt;托管服务，省运维&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weaviate&lt;/td&gt;
&lt;td&gt;带 schema 和 hybrid search&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;无论用哪个库，建议每个 chunk 至少保存这些字段：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"doc_001_chunk_003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chunk content here"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"embedding"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.0123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;-0.0456&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"billing-guide.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Billing Guide"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"section"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Token pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-05-18"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Metadata 很重要。它能让你按产品、语言、时间、权限过滤检索结果。&lt;/p&gt;

&lt;h2&gt;
  
  
  第四步：查询时做语义检索
&lt;/h2&gt;

&lt;p&gt;当用户提问时，先把问题转成向量，然后在数据库里找相似 chunk。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;query_vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query_vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;language&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果不用向量数据库，也可以用 numpy 演示 cosine similarity：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;但数据量到几万条以后，就应该换向量数据库了。&lt;/p&gt;

&lt;h2&gt;
  
  
  第五步：加入 rerank，减少答非所问
&lt;/h2&gt;

&lt;p&gt;Embedding 检索是“粗召回”。它很快，但不总是最精确。&lt;/p&gt;

&lt;p&gt;Rerank 是“精排序”。它会重新判断 query 和候选文档之间的相关性。&lt;/p&gt;

&lt;p&gt;推荐流程：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;embedding 先取 top 20&lt;/li&gt;
&lt;li&gt;rerank 排序&lt;/li&gt;
&lt;li&gt;最终取 top 5 给聊天模型&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这样比直接取 embedding top 5 更稳，尤其适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;技术文档问答&lt;/li&gt;
&lt;li&gt;客服知识库&lt;/li&gt;
&lt;li&gt;法务/财务资料&lt;/li&gt;
&lt;li&gt;多语言内容库&lt;/li&gt;
&lt;li&gt;文档很多、标题相似的场景&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Crazyrouter 支持 &lt;code&gt;/v1/rerank&lt;/code&gt; 这类重排序端点，你可以把它放在 RAG 检索链路里，作为召回后的精排步骤。&lt;/p&gt;

&lt;h2&gt;
  
  
  第六步：把检索结果交给聊天模型
&lt;/h2&gt;

&lt;p&gt;检索到 chunk 后，拼成 prompt：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Source: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;source&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
你是一个严谨的知识库助手。
只根据下面的资料回答问题。
如果资料里没有答案，就说“资料中没有找到”。

资料：
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;

问题：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后调用聊天模型生成答案。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-5-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;build_prompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;)}]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这里 embedding 模型和聊天模型各司其职：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;text-embedding-3-large&lt;/code&gt;：找相关资料&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gpt-5-mini&lt;/code&gt; / Claude / Gemini：根据资料组织答案&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large 在多语言 RAG 里的优势
&lt;/h2&gt;

&lt;p&gt;很多团队的文档不是单一语言。&lt;/p&gt;

&lt;p&gt;可能有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;英文 API 文档&lt;/li&gt;
&lt;li&gt;中文帮助中心&lt;/li&gt;
&lt;li&gt;日文用户手册&lt;/li&gt;
&lt;li&gt;韩文社区文章&lt;/li&gt;
&lt;li&gt;越南语教程&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;多语言 RAG 的难点是：用户用一种语言提问，答案可能藏在另一种语言的文档里。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; 官方定位是适合英文和非英文任务的高能力 embedding 模型。做跨语言检索时，建议优先把它作为候选模型测试。&lt;/p&gt;

&lt;p&gt;但不要只看官方分数。你应该建立自己的评测集：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;query&lt;/th&gt;
&lt;th&gt;正确文档&lt;/th&gt;
&lt;th&gt;语言&lt;/th&gt;
&lt;th&gt;是否召回&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;余额为什么扣费快？&lt;/td&gt;
&lt;td&gt;billing-token-cost.md&lt;/td&gt;
&lt;td&gt;zh&lt;/td&gt;
&lt;td&gt;yes/no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;how to set API base URL&lt;/td&gt;
&lt;td&gt;quickstart.md&lt;/td&gt;
&lt;td&gt;en&lt;/td&gt;
&lt;td&gt;yes/no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code 怎么配置？&lt;/td&gt;
&lt;td&gt;integrations/claude-code.md&lt;/td&gt;
&lt;td&gt;zh&lt;/td&gt;
&lt;td&gt;yes/no&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;最终看 top 3 / top 5 召回率。&lt;/p&gt;

&lt;h2&gt;
  
  
  生产环境优化建议
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 增量索引，不要每次全量重建
&lt;/h3&gt;

&lt;p&gt;文档更新后，只重新向量化变化的 chunk。&lt;/p&gt;

&lt;p&gt;给每个 chunk 存 hash：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;content_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;hash 不变就跳过。&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 使用批量 embedding
&lt;/h3&gt;

&lt;p&gt;不要一条一条调用。Embeddings API 通常支持批量输入。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;chunk1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chunk3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这样更快，也更容易控制请求数。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 做 hybrid search
&lt;/h3&gt;

&lt;p&gt;纯向量搜索有时会漏掉精确关键词，例如错误码、订单号、函数名。&lt;/p&gt;

&lt;p&gt;更稳的方式是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BM25 / 关键词搜索&lt;/li&gt;
&lt;li&gt;向量搜索&lt;/li&gt;
&lt;li&gt;合并结果&lt;/li&gt;
&lt;li&gt;rerank&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. 给答案加引用来源
&lt;/h3&gt;

&lt;p&gt;不要只输出答案。最好附上引用文档标题和链接。&lt;/p&gt;

&lt;p&gt;这会显著提升用户信任，也方便排查错误召回。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 分权限检索
&lt;/h3&gt;

&lt;p&gt;企业知识库一定要做权限过滤。&lt;/p&gt;

&lt;p&gt;不要先召回再过滤。应该在向量数据库查询阶段就带上权限条件。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题排查
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;问题&lt;/th&gt;
&lt;th&gt;常见原因&lt;/th&gt;
&lt;th&gt;解决方式&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;找不到正确文档&lt;/td&gt;
&lt;td&gt;chunk 太大/太小，query 太短&lt;/td&gt;
&lt;td&gt;调整切块，query rewrite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;答案引用错文档&lt;/td&gt;
&lt;td&gt;top_k 太小，缺 rerank&lt;/td&gt;
&lt;td&gt;top 20 + rerank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;延迟太高&lt;/td&gt;
&lt;td&gt;每次实时向量化文档&lt;/td&gt;
&lt;td&gt;文档离线索引，查询实时 embedding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;成本上升快&lt;/td&gt;
&lt;td&gt;重复索引、维度过高&lt;/td&gt;
&lt;td&gt;hash 去重，降维测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多语言召回差&lt;/td&gt;
&lt;td&gt;模型不适合跨语言&lt;/td&gt;
&lt;td&gt;测试 large，建立多语言评测集&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  什么时候不该用 text-embedding-3-large？
&lt;/h2&gt;

&lt;p&gt;不是所有项目都需要最高能力 embedding。&lt;/p&gt;

&lt;p&gt;这些情况可以先不用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;数据量很小，关键词搜索够用&lt;/li&gt;
&lt;li&gt;只是后台管理工具，对召回质量要求不高&lt;/li&gt;
&lt;li&gt;预算极紧，且内容主要是单语言 FAQ&lt;/li&gt;
&lt;li&gt;业务还在 MVP 阶段，没有真实 query 数据&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;更务实的做法是：先用一组真实问题测试 small 和 large 的召回差异，再决定是否升级。&lt;/p&gt;

&lt;h2&gt;
  
  
  结论：RAG 的成败，一半在检索
&lt;/h2&gt;

&lt;p&gt;聊天模型再强，如果上下文拿错了，也只能认真地答错。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; 的价值在于让系统能按语义找到资料，而不是只靠关键词碰运气。&lt;/p&gt;

&lt;p&gt;如果你要做生产级 RAG，我建议按这个顺序推进：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;整理真实文档&lt;/li&gt;
&lt;li&gt;做合理切块&lt;/li&gt;
&lt;li&gt;用 text-embedding-3-large 建立向量索引&lt;/li&gt;
&lt;li&gt;用真实用户问题评测 top 5 召回率&lt;/li&gt;
&lt;li&gt;加 rerank&lt;/li&gt;
&lt;li&gt;再优化 prompt 和聊天模型&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;你可以用 OpenAI 兼容 SDK 接入 &lt;a href="https://docs.crazyrouter.com?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=dev_community" rel="noopener noreferrer"&gt;Crazyrouter embeddings API&lt;/a&gt;，同一个 &lt;code&gt;base_url&lt;/code&gt; 下同时调用 embedding、rerank 和聊天模型，方便把 RAG 链路串起来。&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  RAG 知识库一定要用 text-embedding-3-large 吗？
&lt;/h3&gt;

&lt;p&gt;不一定。它适合高质量、多语言、生产级检索。小项目可以先用成本更低的 embedding 模型做基线。&lt;/p&gt;

&lt;h3&gt;
  
  
  文档切块多大最合适？
&lt;/h3&gt;

&lt;p&gt;没有固定答案。技术文档可以从 400-800 tokens 开始，FAQ 可以更短。最终看真实 query 的召回效果。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large 可以和 pgvector 一起用吗？
&lt;/h3&gt;

&lt;p&gt;可以。你可以把生成的向量存到 PostgreSQL 的 pgvector 字段里，再用向量相似度查询。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么 embedding 找到了资料，模型还是回答错？
&lt;/h3&gt;

&lt;p&gt;可能是召回内容有噪声、prompt 没有限制、模型忽略引用，或者问题需要多个文档联合推理。可以加 rerank 和引用约束。&lt;/p&gt;

&lt;h3&gt;
  
  
  RAG 要不要加 rerank？
&lt;/h3&gt;

&lt;p&gt;生产环境建议加。Embedding 负责快速召回，rerank 负责精排，组合效果通常更稳。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>rag</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>text-embedding-3-large の用途：Embeddings 入門と RAG での使い方</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:30:33 +0000</pubDate>
      <link>https://dev.to/xujfcn/text-embedding-3-large-noyong-tu-embeddings-ru-men-to-rag-denoshi-ifang-2mnh</link>
      <guid>https://dev.to/xujfcn/text-embedding-3-large-noyong-tu-embeddings-ru-men-to-rag-denoshi-ifang-2mnh</guid>
      <description>&lt;h1&gt;
  
  
  text-embedding-3-large の用途：Embeddings 入門と RAG での使い方
&lt;/h1&gt;

&lt;p&gt;GPT、Claude、Gemini を呼び出すとき、多くの場合は「回答を生成する」ことを期待します。しかし &lt;code&gt;text-embedding-3-large&lt;/code&gt; のようなモデルはチャットしたり記事を書いたりするためのものではありません。&lt;/p&gt;

&lt;p&gt;中心的な役割は、&lt;strong&gt;テキストを数値ベクトルに変換すること&lt;/strong&gt;です。&lt;/p&gt;

&lt;p&gt;少し抽象的に聞こえますが、RAG ナレッジベース、セマンティック検索、関連記事推薦、FAQ ボット、ドキュメント検索の土台になる技術です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rgufuvj4j934sou8yd4.webp" alt="text-embedding-3-large semantic search pipeline" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI に自社ドキュメントから答えを探させたいなら、モデルの記憶に頼るだけでは足りません。embeddings はほぼ必須です。&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large 的核心用途是什么？
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; 是 OpenAI 的高能力文本向量模型。它会读取一段文本，然后输出一个高维向量。&lt;/p&gt;

&lt;p&gt;向量可以理解成文本的“语义坐标”。&lt;/p&gt;

&lt;p&gt;比如下面几句话：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“如何降低 AI API 成本？”&lt;/li&gt;
&lt;li&gt;“怎么节省 GPT 接口费用？”&lt;/li&gt;
&lt;li&gt;“AI 模型调用太贵怎么办？”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键词不完全一样，但意思接近。Embedding 模型会把它们映射到相近的位置。&lt;/p&gt;

&lt;p&gt;这让系统可以做传统关键词搜索做不好的事情：&lt;strong&gt;按语义找内容&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;常见用途包括：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;embedding 在里面做什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;语义搜索&lt;/td&gt;
&lt;td&gt;把用户问题和文档都转成向量，找最相似内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG 知识库&lt;/td&gt;
&lt;td&gt;先检索相关文档，再交给大模型生成答案&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;推荐系统&lt;/td&gt;
&lt;td&gt;根据文章、商品、用户描述的语义相似度推荐内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文档聚类&lt;/td&gt;
&lt;td&gt;自动把相似文档分组&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;文本分类&lt;/td&gt;
&lt;td&gt;用相似度判断文本属于哪个标签&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;异常检测&lt;/td&gt;
&lt;td&gt;找出和大多数内容语义距离很远的数据&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OpenAI 官方文档也把 embeddings 用于 search、clustering、recommendations、anomaly detection、diversity measurement 和 classification。&lt;/p&gt;

&lt;h2&gt;
  
  
  为什么 RAG 特别需要 text-embedding-3-large？
&lt;/h2&gt;

&lt;p&gt;RAG，全称 Retrieval-Augmented Generation，中文可以理解为“检索增强生成”。&lt;/p&gt;

&lt;p&gt;它的流程通常是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;把文档切成小块&lt;/li&gt;
&lt;li&gt;用 embedding 模型把每个文档块转成向量&lt;/li&gt;
&lt;li&gt;存进向量数据库&lt;/li&gt;
&lt;li&gt;用户提问时，把问题也转成向量&lt;/li&gt;
&lt;li&gt;找出最相关的几个文档块&lt;/li&gt;
&lt;li&gt;把这些内容交给大模型回答&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;如果没有 embedding，系统只能做关键词匹配。&lt;/p&gt;

&lt;p&gt;比如用户问：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“余额为什么扣得这么快？”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;文档里可能写的是：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“高上下文模型会消耗更多 tokens，费用按输入和输出 tokens 计费。”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;关键词几乎对不上，但语义相关。Embedding 就是解决这种问题的。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3ix19wx966z7o0n7ivga.webp" alt="RAG workflow with embeddings and vector database" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large 和聊天模型有什么区别？
&lt;/h2&gt;

&lt;p&gt;很多开发者第一次接触 embedding 会误以为它也是“问答模型”。其实不是。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;能力&lt;/th&gt;
&lt;th&gt;聊天模型&lt;/th&gt;
&lt;th&gt;embedding 模型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;输入&lt;/td&gt;
&lt;td&gt;用户问题、上下文&lt;/td&gt;
&lt;td&gt;文本片段&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;输出&lt;/td&gt;
&lt;td&gt;自然语言答案&lt;/td&gt;
&lt;td&gt;数字向量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;主要用途&lt;/td&gt;
&lt;td&gt;生成、总结、推理、对话&lt;/td&gt;
&lt;td&gt;检索、相似度、聚类、分类&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;是否直接回答问题&lt;/td&gt;
&lt;td&gt;是&lt;/td&gt;
&lt;td&gt;否&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;是否适合 RAG&lt;/td&gt;
&lt;td&gt;负责最终回答&lt;/td&gt;
&lt;td&gt;负责找资料&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;可以把它们分工理解为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;embedding 模型：图书管理员，负责找资料&lt;/li&gt;
&lt;li&gt;聊天模型：写作者，负责组织答案&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一个完整的知识库问答系统，通常两者都要用。&lt;/p&gt;

&lt;h2&gt;
  
  
  text-embedding-3-large 的关键参数
&lt;/h2&gt;

&lt;p&gt;根据 OpenAI 官方文档，&lt;code&gt;text-embedding-3-large&lt;/code&gt; 默认输出 3072 维向量，最大输入上下文为 8192 tokens。&lt;/p&gt;

&lt;p&gt;它也支持 &lt;code&gt;dimensions&lt;/code&gt; 参数。你可以在保留主要语义信息的前提下，把向量维度降下来。&lt;/p&gt;

&lt;p&gt;这很重要，因为向量维度会影响：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;向量数据库存储成本&lt;/li&gt;
&lt;li&gt;检索速度&lt;/li&gt;
&lt;li&gt;索引大小&lt;/li&gt;
&lt;li&gt;内存占用&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你只是做中小型 FAQ、客服知识库，未必一定要 3072 维全量向量。可以先测试 1024 或 1536 维，观察召回质量。&lt;/p&gt;

&lt;h2&gt;
  
  
  如何用 OpenAI 兼容接口调用 text-embedding-3-large？
&lt;/h2&gt;

&lt;p&gt;下面是 Python 示例。代码里的 API 地址不要加 UTM 参数。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API gateway helps developers connect to many models with one key.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果你已经在项目里使用 OpenAI SDK，只需要把 &lt;code&gt;base_url&lt;/code&gt; 换成兼容网关地址即可。&lt;/p&gt;

&lt;p&gt;你可以通过 &lt;a href="https://docs.crazyrouter.com?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=dev_community" rel="noopener noreferrer"&gt;Crazyrouter 文档&lt;/a&gt; 查看 OpenAI 兼容接入方式，也可以在 &lt;a href="https://crazyrouter.com/pricing?utm_source=blog&amp;amp;utm_medium=article&amp;amp;utm_campaign=dev_community" rel="noopener noreferrer"&gt;价格页面&lt;/a&gt; 对比不同模型成本。&lt;/p&gt;

&lt;h2&gt;
  
  
  一个最小可用的语义搜索示例
&lt;/h2&gt;

&lt;p&gt;下面用最简单的 cosine similarity 演示 embedding 的工作方式。生产环境建议换成向量数据库，例如 Qdrant、Milvus、Pinecone、pgvector。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-large&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;encoding_format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;float&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;

&lt;span class="n"&gt;docs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI API costs are calculated by input and output tokens.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RAG systems retrieve relevant documents before generating answers.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vector databases store embeddings for semantic search.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;How does retrieval augmented generation find context?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;query_vec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;doc_vecs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_vec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vec&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;doc_vecs&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这个例子虽然简单，但已经包含了语义搜索的核心逻辑：文本转向量，然后按相似度排序。&lt;/p&gt;

&lt;h2&gt;
  
  
  什么时候该用 text-embedding-3-large？
&lt;/h2&gt;

&lt;p&gt;我建议按下面的方式判断：&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;需求&lt;/th&gt;
&lt;th&gt;建议&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;高质量 RAG、跨语言检索、长文档知识库&lt;/td&gt;
&lt;td&gt;优先测试 text-embedding-3-large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FAQ、小规模搜索、成本敏感项目&lt;/td&gt;
&lt;td&gt;可以先用 text-embedding-3-small&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多语言文档检索&lt;/td&gt;
&lt;td&gt;更值得测试 large&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;只做关键词过滤&lt;/td&gt;
&lt;td&gt;不一定需要 embedding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;数据量极大、预算紧&lt;/td&gt;
&lt;td&gt;先评估降维和分层检索&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;一句话：如果你的搜索质量直接影响用户体验，&lt;code&gt;text-embedding-3-large&lt;/code&gt; 值得优先测试。&lt;/p&gt;

&lt;p&gt;如果只是内部工具或早期 MVP，可以先从更便宜的 embedding 模型开始。&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG 项目里的最佳实践
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 文档切块不要太粗
&lt;/h3&gt;

&lt;p&gt;不要把整篇文档直接塞进去。建议按语义段落切块。&lt;/p&gt;

&lt;p&gt;常见范围：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;300-800 tokens 一个 chunk&lt;/li&gt;
&lt;li&gt;保留 50-100 tokens overlap&lt;/li&gt;
&lt;li&gt;标题、路径、时间等 metadata 单独存储&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 查询也要预处理
&lt;/h3&gt;

&lt;p&gt;用户问题可能很短、很口语。可以先让聊天模型把问题改写成更适合检索的查询，再做 embedding。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 不要只看 top 1
&lt;/h3&gt;

&lt;p&gt;RAG 通常取 top 3 到 top 10 个文档块，再交给大模型判断。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 加 rerank 会更稳
&lt;/h3&gt;

&lt;p&gt;Embedding 负责粗召回，rerank 负责精排。对于客服、法律、财务、技术文档，rerank 能明显减少答非所问。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 记录真实查询日志
&lt;/h3&gt;

&lt;p&gt;不要只用 demo 数据测试。把真实用户问题脱敏后做评测，才知道召回是否靠谱。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见误区
&lt;/h2&gt;

&lt;h3&gt;
  
  
  误区 1：embedding 维度越高一定越好
&lt;/h3&gt;

&lt;p&gt;不一定。高维向量通常表达能力更强，但也更占存储和计算。实际项目要看召回效果、延迟和成本。&lt;/p&gt;

&lt;h3&gt;
  
  
  误区 2：RAG 有了 embedding 就不会胡说
&lt;/h3&gt;

&lt;p&gt;也不对。Embedding 只负责找资料。最终回答是否可靠，还取决于 prompt、上下文质量、模型能力和引用约束。&lt;/p&gt;

&lt;h3&gt;
  
  
  误区 3：所有文档都适合直接向量化
&lt;/h3&gt;

&lt;p&gt;表格、代码、日志、PDF 扫描件都需要特殊处理。尤其是表格，最好保留结构化字段。&lt;/p&gt;

&lt;h2&gt;
  
  
  结论：text-embedding-3-large 是 AI 应用的“检索底座”
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;text-embedding-3-large&lt;/code&gt; 不是用来聊天的模型，而是用来理解文本相似度的模型。&lt;/p&gt;

&lt;p&gt;它最适合这些场景：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG 知识库&lt;/li&gt;
&lt;li&gt;语义搜索&lt;/li&gt;
&lt;li&gt;多语言检索&lt;/li&gt;
&lt;li&gt;推荐系统&lt;/li&gt;
&lt;li&gt;文档聚类&lt;/li&gt;
&lt;li&gt;文本分类&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你正在做 AI 客服、企业知识库、文档问答、代码搜索或内容推荐，embedding 模型就是系统的基础层。&lt;/p&gt;

&lt;p&gt;你可以通过 OpenAI 兼容接口接入 embeddings API。对于已经使用 OpenAI SDK 的项目，迁移成本很低：改 &lt;code&gt;base_url&lt;/code&gt;，换 API key，然后继续使用同样的调用方式。&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large 可以直接回答问题吗？
&lt;/h3&gt;

&lt;p&gt;不可以。它输出的是向量，不是自然语言答案。回答问题通常需要搭配 GPT、Claude、Gemini 等聊天模型。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large 适合做 RAG 吗？
&lt;/h3&gt;

&lt;p&gt;适合。它常用于 RAG 的检索阶段，把用户问题和知识库文档转成向量，再找出最相关内容。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large 默认多少维？
&lt;/h3&gt;

&lt;p&gt;官方文档显示默认是 3072 维，也可以通过 &lt;code&gt;dimensions&lt;/code&gt; 参数降低输出维度。&lt;/p&gt;

&lt;h3&gt;
  
  
  text-embedding-3-large 和 text-embedding-3-small 怎么选？
&lt;/h3&gt;

&lt;p&gt;如果追求检索质量、多语言效果或生产级 RAG，可以优先测试 large。如果成本敏感或数据量很大，可以先用 small 做基线。&lt;/p&gt;

&lt;h3&gt;
  
  
  向量数据库是必须的吗？
&lt;/h3&gt;

&lt;p&gt;小规模 demo 可以直接用数组和 cosine similarity。生产环境建议使用向量数据库，例如 pgvector、Qdrant、Milvus 或 Pinecone。&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>embeddings</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>DeepSeek V4 Complete Guide — 1.6T MoE with 1M Context at 73% Lower Cost</title>
      <dc:creator>Jenny Met</dc:creator>
      <pubDate>Tue, 19 May 2026 09:30:31 +0000</pubDate>
      <link>https://dev.to/xujfcn/deepseek-v4-complete-guide-16t-moe-with-1m-context-at-73-lower-cost-865</link>
      <guid>https://dev.to/xujfcn/deepseek-v4-complete-guide-16t-moe-with-1m-context-at-73-lower-cost-865</guid>
      <description>&lt;h1&gt;
  
  
  DeepSeek V4 Complete Guide — 1.6T MoE with 1M Context at 73% Lower Cost
&lt;/h1&gt;

&lt;p&gt;DeepSeek V4 dropped on April 24, 2026, and it's the most efficient open-weight model family we've seen. A 1.6-trillion-parameter Mixture-of-Experts architecture that only activates 49 billion parameters per token, with a 1-million-token context window and inference costs 73% lower than V3.&lt;/p&gt;

&lt;p&gt;Here's everything developers need to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in the V4 Family
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Total Params&lt;/th&gt;
&lt;th&gt;Active Params&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;V4-Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1.6T&lt;/td&gt;
&lt;td&gt;49B&lt;/td&gt;
&lt;td&gt;1M tokens&lt;/td&gt;
&lt;td&gt;Advanced reasoning, coding, long agent tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;V4-Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;284B&lt;/td&gt;
&lt;td&gt;13B&lt;/td&gt;
&lt;td&gt;1M tokens&lt;/td&gt;
&lt;td&gt;High-speed, cost-efficient workloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;V4&lt;/strong&gt; (base)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;1M tokens&lt;/td&gt;
&lt;td&gt;General-purpose chat and completion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three share the 1M-token context window. The Pro model supports three reasoning modes: Non-think (fast), High (default), and Max (deep reasoning).&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: What Changed from V3
&lt;/h2&gt;

&lt;p&gt;The V4 family introduces two key innovations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Attention&lt;/strong&gt; — Combines Compressed Sparse Attention (CSA) and Heavily Compressed Attention (HCA). At 1M tokens, this reduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per-token inference FLOPs by &lt;strong&gt;73%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;KV cache memory by &lt;strong&gt;90%&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared to DeepSeek V3.2, that's a massive efficiency gain. You can run longer contexts without the cost exploding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Training Scale&lt;/strong&gt; — Trained on 32 trillion tokens using FP4 quantization. Both base and instruct versions are available on Hugging Face under an open license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware Optimization&lt;/strong&gt; — Optimized for NVIDIA Blackwell, achieving 150+ tokens/sec/user on GB200 NVL72.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;V3.2-Base&lt;/th&gt;
&lt;th&gt;V4-Flash-Base&lt;/th&gt;
&lt;th&gt;V4-Pro-Base&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AGIEval (0-shot)&lt;/td&gt;
&lt;td&gt;80.1&lt;/td&gt;
&lt;td&gt;82.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;83.1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU (5-shot)&lt;/td&gt;
&lt;td&gt;87.8&lt;/td&gt;
&lt;td&gt;88.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;90.1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;V4-Pro roughly matches GPT-5.4 and Claude Opus 4.6 on most benchmarks, while being significantly cheaper. GPT-5.5 still leads on Terminal-Bench (82.7%) and FrontierMath, but at 10-50x the price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Direct DeepSeek API (with 75% promo discount through May 2026)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input (per 1M)&lt;/th&gt;
&lt;th&gt;Output (per 1M)&lt;/th&gt;
&lt;th&gt;Cached Input&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;V4-Pro&lt;/td&gt;
&lt;td&gt;$0.435&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;$0.003625&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;$0.28&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;V4 (base)&lt;/td&gt;
&lt;td&gt;$0.30&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Cost Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Output&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Pro (promo)&lt;/td&gt;
&lt;td&gt;$0.435&lt;/td&gt;
&lt;td&gt;$0.87&lt;/td&gt;
&lt;td&gt;Open-weight, 1M context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V4-Flash (promo)&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;$0.28&lt;/td&gt;
&lt;td&gt;Fastest option&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;~$5.00&lt;/td&gt;
&lt;td&gt;~$75.00&lt;/td&gt;
&lt;td&gt;Closed, 400K context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;$2.50&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.6&lt;/td&gt;
&lt;td&gt;$3.00&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;td&gt;Closed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;V4-Pro delivers comparable quality at &lt;strong&gt;5-85x lower cost&lt;/strong&gt; depending on the task and competitor.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Access via Crazyrouter
&lt;/h2&gt;

&lt;p&gt;Access DeepSeek V4 alongside 300+ other models through a single API key. OpenAI SDK compatible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-crazyrouter-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# DeepSeek V4-Pro
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-pro&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analyze this codebase and suggest optimizations...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  V4-Flash for Speed-Critical Tasks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Use V4-Flash when latency matters more than depth
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deepseek-v4-flash&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Summarize this document in 3 bullet points.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js / TypeScript
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;your-crazyrouter-key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://crazyrouter.com/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;deepseek-v4-pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Explain the V4 MoE architecture.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  cURL
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://crazyrouter.com/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer your-crazyrouter-key"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "deepseek-v4-pro",
    "messages": [{"role": "user", "content": "What makes V4 different from V3?"}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When to Use Which Model
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Recommended Model&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Complex reasoning, math, code review&lt;/td&gt;
&lt;td&gt;V4-Pro (Max mode)&lt;/td&gt;
&lt;td&gt;Deepest reasoning, highest accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;General coding, chat, analysis&lt;/td&gt;
&lt;td&gt;V4-Pro (High mode)&lt;/td&gt;
&lt;td&gt;Good balance of speed and quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summarization, classification, routing&lt;/td&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;Fastest, cheapest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long document processing (500K+ tokens)&lt;/td&gt;
&lt;td&gt;V4-Pro or V4-Flash&lt;/td&gt;
&lt;td&gt;1M context, 90% KV cache reduction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time applications&lt;/td&gt;
&lt;td&gt;V4-Flash&lt;/td&gt;
&lt;td&gt;150+ tokens/sec on Blackwell&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  V4 vs R2: Which DeepSeek Model to Choose?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;V4-Pro&lt;/th&gt;
&lt;th&gt;R2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Architecture&lt;/td&gt;
&lt;td&gt;1.6T MoE, 49B active&lt;/td&gt;
&lt;td&gt;32B dense&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strength&lt;/td&gt;
&lt;td&gt;General + long context&lt;/td&gt;
&lt;td&gt;Pure reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;1M tokens&lt;/td&gt;
&lt;td&gt;128K tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Coding, agents, long docs&lt;/td&gt;
&lt;td&gt;Math, logic, step-by-step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosting&lt;/td&gt;
&lt;td&gt;Needs multi-GPU&lt;/td&gt;
&lt;td&gt;Single RTX 4090&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use R2 for pure reasoning tasks. Use V4 for everything else, especially when you need long context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at &lt;a href="https://crazyrouter.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=deepseek_v4" rel="noopener noreferrer"&gt;crazyrouter.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Get your API key from the console&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;base_url&lt;/code&gt; to &lt;code&gt;https://crazyrouter.com/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;deepseek-v4-pro&lt;/code&gt; or &lt;code&gt;deepseek-v4-flash&lt;/code&gt; as the model name&lt;/li&gt;
&lt;li&gt;Start building&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;DeepSeek V4 makes frontier-level AI accessible at a fraction of the cost. Combined with Crazyrouter's unified API, you can switch between V4, GPT-5.5, Claude, and 300+ other models with a single line of code.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deepseek</category>
      <category>llm</category>
      <category>api</category>
    </item>
  </channel>
</rss>
