統(tǒng)一接口接入多 Provider 文本嵌入模型)
LlamaIndex AutoEmbeddings 集成指南一個(gè)統(tǒng)一接口接入多 Provider 文本嵌入模型【免費(fèi)下載鏈接】llama_indexLlamaIndex is the document processing platform for AI項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ll/llama_index導(dǎo)讀本文將講解 LlamaIndex 生態(tài)中的llama-index-embeddings-autoembeddings集成包它把 Chonkie 的 AutoEmbeddings 模塊封裝為符合 LlamaIndex 規(guī)范的ChonkieAutoEmbedding嵌入器。通過(guò)本文你將掌握如何用一行代碼在 OpenAI、Model2Vec、Cohere、Jina AI、Sentence Transformers 等多個(gè)嵌入服務(wù)之間切換并了解其底層實(shí)現(xiàn)原理、異步調(diào)用方式以及如何將其無(wú)縫嵌入 LlamaIndex 的檢索與索引流程。AutoEmbeddings 是什么llama-index-embeddings-autoembeddings是 LlamaIndex 官方集成目錄中的一個(gè)嵌入模塊其核心價(jià)值在于它基于 Chonkie 提供的AutoEmbeddings模塊將多個(gè)不同的嵌入 Provider 收斂到同一個(gè)統(tǒng)一接口之下。使用方不需要針對(duì)每家服務(wù)編寫(xiě)不同的調(diào)用代碼只需傳入模型名稱(chēng)即可自動(dòng)完成 Provider 識(shí)別與初始化。根據(jù)該模塊的 README它支持以下嵌入 ProviderOpenAI如text-embedding-3-large等云服務(wù)模型Model2Vec輕量級(jí)靜態(tài)嵌入模型Cohere云服務(wù)嵌入模型Jina AI云服務(wù)嵌入模型Sentence Transformers本地開(kāi)源模型從倉(cāng)庫(kù)的 CHANGELOG 可以看到該集成包最早以 0.1.0 版本加入Support for AutoEmbeddings integration from chonkie當(dāng)前倉(cāng)庫(kù)中版本為 0.3.0見(jiàn) pyproject.toml是一個(gè)處于積極維護(hù)狀態(tài)的集成模塊。安裝與其他 LlamaIndex 集成包一樣通過(guò) pip 直接安裝即可pip install llama-index-embeddings-autoembeddings安裝包本身會(huì)自動(dòng)攜帶運(yùn)行時(shí)依賴(lài)。查看 pyproject.toml 可知其依賴(lài)約束為llama-index-core0.13.0,0.15chonkie[all]其中chonkie[all]會(huì)安裝 Chonkie 全量依賴(lài)從而保證 OpenAI、Sentence Transformers、Cohere、Jina AI、Model2Vec 等后端所需的三方庫(kù)齊全。值得注意的是pyproject.toml要求 Python 版本為3.10,4.0。快速上手本地模型嵌入安裝完成后在腳本中導(dǎo)入ChonkieAutoEmbedding并傳入模型名稱(chēng)即可開(kāi)始使用。下面的示例來(lái)自模塊 README使用了 Sentence Transformers 家族中經(jīng)典的本地輕量模型all-MiniLM-L6-v2from llama_index.embeddings.autoembeddings import ChonkieAutoEmbedding embedder ChonkieAutoEmbedding(model_nameall-MiniLM-L6-v2) vector embedder.get_text_embedding( The quick brown fox jumps over the lazy dog. ) print(vector)運(yùn)行后vector是一個(gè)List[float]類(lèi)型的嵌入向量可以直接用于后續(xù)的相似度計(jì)算或?qū)懭胂蛄繑?shù)據(jù)庫(kù)。同步 API 與批量嵌入除了對(duì)單條文本調(diào)用get_text_embeddingChonkieAutoEmbedding還完整支持批量嵌入與查詢(xún)嵌入。從源碼實(shí)現(xiàn)看base.py 中g(shù)et_text_embedding/_get_text_embedding單條文本嵌入內(nèi)部調(diào)用 Chonkie 的embedder.embed(text)并轉(zhuǎn)為L(zhǎng)ist[float]get_text_embedding_batch/_get_text_embeddings批量文本嵌入內(nèi)部調(diào)用embedder.embed_batch(texts)并對(duì)結(jié)果逐條執(zhí)行tolist()轉(zhuǎn)換。例如批量場(chǎng)景可以這樣寫(xiě)embedder ChonkieAutoEmbedding(model_nameall-MiniLM-L6-v2) vectors embedder.get_text_embedding_batch( [First document text., Second document text., Third document text.] )這些公開(kāi)的同步方法get_text_embedding、get_text_embedding_batch、get_query_embedding均來(lái)自BaseEmbedding基類(lèi)在 llama-index-core 的 embeddings 基類(lèi) 中實(shí)現(xiàn)了批處理、緩存、限流與可觀測(cè)事件分發(fā)等通用邏輯。使用非本地 Provider通過(guò)環(huán)境變量提供 API Key當(dāng)模型托管在云端如 OpenAI 的text-embedding-3-large時(shí)需要先聲明對(duì)應(yīng)的 API Key 環(huán)境變量再創(chuàng)建嵌入器from llama_index.embeddings.autoembeddings import ChonkieAutoEmbedding import os os.environ[OPENAI_API_KEY] YOUR-API-KEY embedder ChonkieAutoEmbedding(model_nametext-embedding-3-large) vector embedder.get_text_embedding( The quick brown fox jumps over the lazy dog. ) print(vector)該示例同樣取自 README。實(shí)踐中的要點(diǎn)如下按 Provider 設(shè)置對(duì)應(yīng)環(huán)境變量OpenAI 使用OPENAI_API_KEY使用 Cohere、Jina AI 等 Provider 時(shí)需要設(shè)置各自服務(wù)約定的環(huán)境變量名具體以 Chonkie 對(duì)應(yīng)用戶(hù)端的要求為準(zhǔn)不要在代碼中硬編碼密鑰環(huán)境變量方式既符合安全最佳實(shí)踐也便于在不同環(huán)境中切換模型名決定 Provider 與后端ChonkieAutoEmbedding本身不接收顯式的 Provider 參數(shù)Provider 由model_name自動(dòng)推斷這正是 AutoEmbeddings 自動(dòng)二字的含義。源碼實(shí)現(xiàn)剖析ChonkieAutoEmbedding的實(shí)現(xiàn)非常精簡(jiǎn)全部邏輯位于 base.py核心結(jié)構(gòu)如下class ChonkieAutoEmbedding(BaseEmbedding): model_name: str embedder: Optional[chonkie.BaseEmbeddings] None def __init__(self, model_name: str) - None: super().__init__(model_namemodel_name) self.embedder AutoEmbeddings.get_embeddings(self.model_name)關(guān)鍵設(shè)計(jì)可以歸納為三點(diǎn)繼承BaseEmbeddingChonkieAutoEmbedding直接繼承自 llama_index.core.base.embeddings.base.BaseEmbedding因此天然擁有 LlamaIndex 嵌入器的一切公共能力——批處理、進(jìn)度條、緩存、限流器、callback 事件與 instrumentation 埋點(diǎn)無(wú)需自己重復(fù)實(shí)現(xiàn)延遲到構(gòu)造時(shí)初始化后端AutoEmbeddings.get_embeddings(model_name)在__init__中執(zhí)行根據(jù)模型名自動(dòng)挑選并實(shí)例化對(duì)應(yīng)的 Provider 封裝暴露統(tǒng)一的embed/embed_batch接口以BaseEmbeddings作為字段類(lèi)型embedder字段聲明為Optional[chonkie.BaseEmbeddings]說(shuō)明它接收的是 Chonkie 的通用嵌入器抽象而非某個(gè)具體廠商的客戶(hù)端。同步與異步雙通道實(shí)現(xiàn)中同時(shí)提供了同步與異步兩組方法并且異步方法直接委托給同步實(shí)現(xiàn)_get_embedding(text)同步單條嵌入embedder.embed(text).tolist()_aget_embedding(text)異步單條嵌入直接返回self._get_embedding(text)_get_embeddings(texts)同步批量嵌入embedder.embed_batch(texts)后逐條tolist()_aget_embeddings(texts)異步批量嵌入委托同步批量實(shí)現(xiàn)_get_query_embedding(query)查詢(xún)側(cè)嵌入復(fù)用_get_embedding這意味著在異步場(chǎng)景如await embedder.aget_text_embedding(text)或await embedder.aget_text_embedding_batch(texts)下該集成同樣可用底層通過(guò) Chonkie 的同步調(diào)用完成計(jì)算。缺少 Chonkie 依賴(lài)時(shí)的報(bào)錯(cuò)信息base.py頂部對(duì)chonkie的導(dǎo)入做了保護(hù)性處理如果環(huán)境中沒(méi)有安裝 Chonkie會(huì)拋出帶有明確指引的ImportErrorCould not import Autembeddings from chonkie. Please install it with pip install chonkie[all].因此如果直接pip install llama-index-embeddings-autoembeddings后出現(xiàn)上述報(bào)錯(cuò)說(shuō)明chonkie[all]未能正常安裝例如使用了--no-deps按提示補(bǔ)裝即可。將 AutoEmbeddings 接入索引與檢索流程由于ChonkieAutoEmbedding是標(biāo)準(zhǔn)BaseEmbedding子類(lèi)它可以像任何其他 LlamaIndex 嵌入模型一樣直接作為VectorStoreIndex、Settings.embed_model或文檔處理管線的一部分使用from llama_index.embeddings.autoembeddings import ChonkieAutoEmbedding from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core import Settings Settings.embed_model ChonkieAutoEmbedding(model_nameall-MiniLM-L6-v2) documents SimpleDirectoryReader(./data).load_data() index VectorStoreIndex.from_documents(documents) query_engine index.as_query_engine() response query_engine.query(What is the summary of the documents?) print(response)此時(shí)索引構(gòu)建階段的文檔分塊嵌入會(huì)由ChonkieAutoEmbedding批量完成查詢(xún)階段則通過(guò)get_query_embedding對(duì)問(wèn)題進(jìn)行嵌入。值得一提的是在 BaseEmbedding.call的實(shí)現(xiàn)中嵌入器還可以直接作為T(mén)ransformComponent接收一批BaseNode并就地寫(xiě)入node.embedding這使其可以嵌入到 LlamaIndex 的 ingestion 管線中from llama_index.core.ingestion import IngestionPipeline from llama_index.core.node_parser import SentenceSplitter pipeline IngestionPipeline( transformations[ SentenceSplitter(chunk_size512), ChonkieAutoEmbedding(model_nameall-MiniLM-L6-v2), ] ) nodes pipeline.run(documentsdocuments)這種既是嵌入器、又是 TransformComponent的雙重身份是BaseEmbedding體系帶給所有嵌入集成的統(tǒng)一能力AutoEmbeddings 集成自然繼承。測(cè)試與驗(yàn)證該模塊在倉(cāng)庫(kù)中帶有單元測(cè)試 test_autoembeddings.py驗(yàn)證了最基本的契約def test_class_init() - None: emb ChonkieAutoEmbedding(model_nameall-MiniLM-L6-v2) assert isinstance(emb, BaseEmbedding)測(cè)試確認(rèn)了用all-MiniLM-L6-v2構(gòu)造ChonkieAutoEmbedding后實(shí)例確實(shí)是BaseEmbedding的子類(lèi)即滿(mǎn)足 LlamaIndex 嵌入器的統(tǒng)一協(xié)議。你可以自行運(yùn)行該測(cè)試來(lái)驗(yàn)證本地環(huán)境cd llama-index-integrations/embeddings/llama-index-embeddings-autoembeddings pytest tests/test_autoembeddings.py -v常見(jiàn)問(wèn)題與注意事項(xiàng)模型首次使用需要下載all-MiniLM-L6-v2等 Sentence Transformers / Model2Vec 本地模型在首次運(yùn)行時(shí)需要從模型倉(cāng)庫(kù)下載權(quán)重請(qǐng)確保網(wǎng)絡(luò)可達(dá)之后的調(diào)用會(huì)命中本地緩存。云服務(wù)模型需要網(wǎng)絡(luò)與密鑰使用text-embedding-3-large等 OpenAI 模型時(shí)除 API Key 外還需可訪問(wèn)對(duì)應(yīng)服務(wù)端點(diǎn)的網(wǎng)絡(luò)環(huán)境。異步方法本質(zhì)是同步委托從 base.py 的實(shí)現(xiàn)看_aget_embedding直接調(diào)用同步的_get_embedding因此高并發(fā)異步場(chǎng)景下的實(shí)際吞吐受 Chonkie 底層同步調(diào)用限制如需極致并發(fā)可以考慮外層使用num_workers或進(jìn)程級(jí)并行。依賴(lài)版本約束該包要求llama-index-core0.13.0,0.15如果項(xiàng)目中的 core 版本超出該區(qū)間需先對(duì)齊版本再安裝。小結(jié)llama-index-embeddings-autoembeddings用極少的代碼量核心實(shí)現(xiàn)僅一個(gè)類(lèi)、幾十行為 LlamaIndex 接入了一個(gè)多 Provider 自適應(yīng)的嵌入入口。它把 Chonkie AutoEmbeddings 的模型名自動(dòng)路由能力與 LlamaIndex 的BaseEmbedding生態(tài)深度融合讓開(kāi)發(fā)者可以在本地開(kāi)源模型與多家云端嵌入服務(wù)之間自由切換而無(wú)需改動(dòng)業(yè)務(wù)代碼。對(duì)需要在多個(gè)嵌入服務(wù)間橫向?qū)Ρ取⒒蛳M宰钚〕杀窘尤攵喾N嵌入后端的項(xiàng)目而言這是一個(gè)值得優(yōu)先考慮的統(tǒng)一入口。【免費(fèi)下載鏈接】llama_indexLlamaIndex is the document processing platform for AI項(xiàng)目地址: https://gitcode.com/GitHub_Trending/ll/llama_index創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考