OpenAI Embeddings 向量怎麼用:text-embedding-3-small 調用、dimensions 縮短、餘弦相似度搜索

想做語義搜尋、相似推薦或文本分類?先用 embeddings 接口把文字變成向量,再比距離。本文按官方文檔講 text-embedding-3-small 的 Python 和 Node 調用、預設向量長度、dimensions 縮短、餘弦相似度、批量計數 token,以及官方 FAQ 裏的幾個坑。

NNathaniel bigo··原創首發·AI 輔助撰寫
7 分鐘讀完
資料核對於 2026-11-05 · 依據官方文檔與公開資料整理 其他 帳號
本文根據 OpenAI 官方《Vector embeddings》整理,資料核對於 2026-11-05。配圖為本站整理的示意圖,不是介面截圖。本站(bigolab.com)不是 OpenAI 官方網站。API 是按用量計費的獨立服務,與 ChatGPT 訂閱分開計算,Key 的獲取見 /guides/openai-api-key。

適用於誰

  • 想給自己的文檔、客服問答、筆記做“按意思搜尋”的開發者;
  • 聽說過 RAG、向量數據庫,但不知道第一步“生成向量”到底怎麼調的人;
  • 想知道向量模型選哪個、向量太長怎麼縮短的人。

結論先說

  1. embedding 就是一串浮點數。 官方說,兩個向量的距離衡量兩段文字的相關度:距離小表示相關度高,距離大表示相關度低。
  2. 調用很簡單:embeddings.create,給模型名和文本,拿回向量。
  3. 官方的兩個第三代模型是 text-embedding-3-small 和 text-embedding-3-large,預設向量長度分別是 1536 和 3072。
  4. 可以用 dimensions 參數縮短向量,省存儲和計算。
  5. 距離函數官方推薦餘弦相似度;OpenAI 的向量已經歸一化到長度 1,所以用點積算餘弦更快,排序結果也和歐氏距離一致。
  6. 按輸入的 token 數計費。 價格以官方價格頁當天為準,見 /guides/openai-api-price-official-table。

用向量做語義搜尋的流程:切段、生成向量、儲存、問題也做向量、按餘弦相似度排序

圖:本站根據 OpenAI 官方《Vector embeddings》 整理的示意圖,流程順序為本站歸納

一、第一次調用

Python(需 pip install openai,密鑰設定見 /guides/openai-api-python-quickstart):

python
from openai import OpenAI

client = OpenAI()

response = client.embeddings.create(
    input="你好,這裏是要變成向量的文字",
    model="text-embedding-3-small",
)

vector = response.data[0].embedding
print(len(vector))   # 預設 1536
print(vector[:5])

Node.js(儲存為 .mjs):

javascript
import OpenAI from "openai";

const openai = new OpenAI();

const embedding = await openai.embeddings.create({
  model: "text-embedding-3-small",
  input: "你好,這裏是要變成向量的文字",
  encoding_format: "float",
});

console.log(embedding.data[0].embedding.length);

響應裏的 data[0].embedding 就是向量,usage 裏有這次消耗的 token 數。你可以把向量存進向量數據庫,之後用於各種用途。input 也可以一次傳一個字符串列表,官方的數據集示例就是這樣一次嵌入多條文字(示例裏先把換行符換成空格再嵌入)。

二、選哪個模型

官方頁面的對照:

模型官方表中的 MTEB 成績最大輸入
text-embedding-3-small62.3%8192
text-embedding-3-large64.6%8192
text-embedding-ada-00261.0%8192

兩個第三代向量模型對照:預設長度、最大輸入、MTEB 成績、dimensions

圖:本站根據 OpenAI 官方《Vector embeddings》 整理的示意圖

官方說它提供兩個第三代向量模型(模型名裏帶 -3)。更大的模型成績更高但更貴,具體費用以官方價格頁當天為準。同一個知識庫裏,文檔和問題必須用同一個模型生成向量,不同模型的向量不能互相比較,這一條是向量搜尋的基本要求,官方示例也都是同模型比較。

三、dimensions:縮短向量

向量越長,存儲、內存和計算越貴。官方說兩個新模型的訓練方式允許你去掉向量末尾的一部分數字,而不丟失它表示概念的能力,做法是在請求裏加 dimensions 參數:

python
response = client.embeddings.create(
    model="text-embedding-3-large",
    input="需要更短的向量",
    dimensions=1024,
)
print(len(response.data[0].embedding))  # 1024

官方給的例子:向量數據庫只支持最多 1024 維時,仍然可以用 text-embedding-3-large,把 dimensions 設為 1024,用一點準確度換更小的向量。官方還說,在 MTEB 評測上,text-embedding-3-large 縮短到 256 維,成績仍高於未縮短的 text-embedding-ada-002(1536 維)。

如果你是生成之後手動截斷,必須再做一次歸一化(L2),官方的示例就是先取前 256 個數,再除以向量長度。能在請求時用 dimensions 就用它,官方說這是推薦做法。

四、一個最小的語義搜尋

下面是本站寫的最小版本,思路對應官方「用 embeddings 做文本搜尋」:先給所有文檔生成向量,再給問題生成向量,按餘弦相似度排序。因為 OpenAI 向量長度已是 1,直接用點積即可:

python
import numpy as np
from openai import OpenAI

client = OpenAI()
MODEL = "text-embedding-3-small"

docs = [
    "怎麼申請 API Key",
    "帳單頁面在哪裏查看用量",
    "請求太頻繁會返回 429 錯誤",
]

def embed(texts):
    res = client.embeddings.create(model=MODEL, input=texts)
    return np.array([d.embedding for d in res.data])

doc_vecs = embed(docs)                  # 形狀:(3, 1536)
query_vec = embed(["為什麼提示請求太多"])[0]

scores = doc_vecs @ query_vec           # 點積 = 餘弦相似度
best = int(np.argmax(scores))
print(docs[best], float(scores[best]))

文檔很多時,別每次都全部重新算。官方 FAQ 的建議是:要快速找最近的 K 個向量,用向量數據庫。官方的 Cookbook 裏有與各種向量數據庫配合的例子。向量搜尋只是幫你找出相關的文字,最後的回答通常還要交給聊天模型,寫法見 /guides/openai-responses-api。

五、數 token 和費用

官方 FAQ 提供了用 tiktoken 數 token 的方法,三代向量模型用 cl100k_base 編碼:

python
import tiktoken

def num_tokens(text, encoding_name="cl100k_base"):
    return len(tiktoken.get_encoding(encoding_name).encode(text))

print(num_tokens("tiktoken is great!"))

這樣能在發請求前估算輸入多長、大約花多少,也能避免超過模型的最大輸入。數量巨大的文檔集,可以考慮用 Batch API 做,寫法見 /guides/openai-api-batch,該文件的端點要填 /v1/embeddings。

常見問題

Q:向量模型知道最近的事嗎?

官方說,text-embedding-3-large 和 text-embedding-3-small 不了解 2021 年 9 月之後發生的事件。對大多數搜尋場景影響不大,個別情況下會降低效果。

Q:我能把向量公開分享嗎?

官方 FAQ 的回答是可以:客戶擁有自己輸入和模型輸出的內容,包括向量。但你要自己保證輸入的內容不違反適用法律和使用條款。

Q:用餘弦相似度還是歐氏距離?

官方推薦餘弦相似度,並說距離函數的選擇通常影響不大。因為向量已歸一化,兩者排序結果相同。

Q:請求報 429?

見 /guides/openai-api-429-error。

參考資料

  • OpenAI 官方:Vector embeddings — https://developers.openai.com/api/docs/guides/embeddings

Nathaniel 的更多內容

  1. 01

    Claude Code 在 Windows 上的常見坑:Git Bash 還是 PowerShell、路徑反斜槓、假報錯、WSL 怎麼選

    Windows 上用 Claude Code,裝好之後最容易踩的是:用哪個 shell、路徑寫法不一致、grep 沒匹配就報錯、鉤子沒生效、WSL 和原生怎麼選。本文逐條按官方文檔整理原因和處理辦法,附三段提示詞和一張對照表。

    Claude0
  2. 02

    Claude Code Hooks 實戰「提交前自動跑測試」:PreToolUse 攔住 git commit,測試不過就退出碼 2,附 Windows 注意點

    只寫一個完整例子:讓 Claude Code 每次要執行 git commit 之前,先自動跑項目測試,沒通過就攔下並把輸出交給它修。本文按官方 Hooks 文檔給出腳本、settings.json 配置、測試方法、排錯和 Windows 的兩處坑。

    Claude0
  3. 03

    Claude Code 自定義斜槓命令與 Skill 實戰:從零寫一個「生成更新日誌」的 /release-notes,含傳參、預執行命令和調試

    概念看過了,還是不知道從哪下手?本文按 Claude Code 官方「Extend Claude with skills」寫一個完整可用的例子:用 /release-notes 根據 git 記錄生成更新日誌,覆蓋目錄、frontmatter、傳參、預執行命令、預授權和調試。

    Claude0
  4. 04

    Claude Code 部署網站:先寫 Dockerfile 和 compose 在本機跑通,再按清單上雲伺服器,別讓它直接改線上

    想讓 Claude Code 幫你把網站部署到雲伺服器。本文只寫通用做法,按 Docker 官方文檔講:讓它寫 Dockerfile、.dockerignore 和 compose,在本機跑通,端口和數據卷怎麼設,再給出上線清單,並說明為什麼不要讓它直接動線上機器。

    Claude0
  5. 05

    Claude Code 寫爬蟲與數據清洗:先查 robots.txt 和網站條款,控制頻率,原始數據留一份再清洗

    想讓 Claude Code 寫爬蟲抓數據再清洗。本文先講合規:robots.txt 不是授權也不是安全措施、網站條款要自己讀;再講怎麼用 Python 標準庫檢查規則、小樣本先試、儲存原始數據,以及用 pandas 清洗,附四段提示詞。

    Claude0
  6. 06

    Claude Code 寫 Chrome 擴展:按 Manifest V3 起步,加載未打包的擴展,改了哪些文件要重新加載

    想讓 Claude Code 幫你寫一個 Chrome 擴展。本文按 Chrome 官方擴展文檔講:manifest.json 的最小寫法、在 chrome://extensions 加載未打包的擴展、哪些改動要刷新、怎麼看控制檯和報錯,再給四段提示詞,以及權限要盡量少。

    Claude0

同產品的其他教學

  1. 01

    OpenAI API 的 token 怎麼算、怎麼估算費用:input_tokens 計數接口、tiktoken 和隱藏的輸出 token

    發請求前想知道會用多少 token?官方有 Responses 的 input_tokens 計數接口,能把文字、圖片、文件、工具定義一起算準;本地 tiktoken 只適合純文本。本文給 Python 和 Node 示例,講輸出 token 為什麼可能比看到的多,以及怎麼估算費用。

    ChatGPT0
  2. 02

    OpenAI API Node.js / TypeScript 快速上手:npm install openai、example.mjs 第一個請求,到流式、函數調用、聯網搜尋

    用 Node.js 調 OpenAI API:設定 OPENAI_API_KEY 環境變量,npm install openai,新建 example.mjs,用 client.responses.create 發出第一個請求。並列出圖片、文件、流式、函數調用、聯網搜尋和錯誤捕獲的 Node 寫法。

    ChatGPT0
  3. 03

    OpenAI API 用量層級(usage tiers)與速率限制怎麼提升:Free、Build、Launch、Grow 和後台 Limits 頁

    OpenAI API 的限速不是固定的:官方按累計購買額度把組織分成 Free、Build、Launch、Grow 四個層級,達到門檻自動升級。本文講 RPM、TPM 等指標、怎麼在後台查自己的限額、響應頭怎麼讀、花費上限和限速的區別,以及怎麼讓限額變得夠用。

    ChatGPT0
  4. 04

    OpenAI API 報錯 400、401、403、404、429、500、503 怎麼排查:按官方錯誤碼頁逐個看原因和解決辦法

    調用 OpenAI API 返回 400、401、403、404、429、500、503,各自什麼意思?本文按官方 Error codes 頁,每個狀態碼一節,寫清官方給的原因和解決辦法,並說明 404 在官方頁面裏的位置、429 的六種情形,附 Python 和 Node 的錯誤捕獲寫法。

    ChatGPT0
  5. 05

    OpenAI Realtime API 是什麼:語音到語音會話、WebRTC 與 WebSocket、臨時密鑰和事件機制

    Realtime API 讓模型直接處理音頻,做可以隨時打斷的語音助手。本文按官方文檔講它是什麼、什麼時候用、瀏覽器接入的流程、session 與事件、可用聲音、60 分鐘會話上限、安全標識,以及它和轉寫、文字轉語音的分工。

    ChatGPT0
  6. 06

    OpenAI 圖像生成 API 怎麼用:gpt-image 系列、images.generate 與 Responses 工具、尺寸質素和遮罩編輯

    用 OpenAI API 生成或編輯圖片,有 Image API 和 Responses 裏的 image_generation 工具兩條路。本文按官方文檔給 Python 和 Node 示例,講 gpt-image 模型選擇、尺寸質素格式參數、遮罩編輯、被攔截時的錯誤處理,以及需要組織驗證的提醒。

    ChatGPT0

0 條評論

登入 後參與評論

還沒有評論,來搶沙發~