跳到主要內容
Open In ColabOpen on GitHub

自訂嵌入

LangChain 與許多 第三方嵌入模型整合。在本指南中,我們將向您展示如何建立自訂 Embedding 類別,以防現有的內建類別無法滿足需求。嵌入在自然語言處理應用程式中至關重要,因為它們將文本轉換為演算法可以理解的數字形式,從而實現各種應用,例如相似性搜尋、文本分類和聚類。

使用標準 Embeddings 介面實作嵌入,將允許您的嵌入在現有的 LangChain 抽象概念中使用(例如,作為驅動 VectorStore 的嵌入,或使用 CacheBackedEmbeddings 進行快取)。

介面

LangChain 中目前的 Embeddings 抽象概念旨在處理文本資料。在此實作中,輸入可以是單個字串或字串列表,輸出是數值陣列(向量)的列表,其中每個向量表示輸入文本到某個 n 維空間的嵌入。

您的自訂嵌入必須實作以下方法

方法/屬性描述必要/可選
embed_documents(texts)為字串列表生成嵌入。必要
embed_query(text)為單個文本查詢生成嵌入。必要
aembed_documents(texts)異步地為字串列表生成嵌入。可選
aembed_query(text)異步地為單個文本查詢生成嵌入。可選

這些方法確保您的嵌入模型可以無縫地整合到 LangChain 框架中,為可擴展性和效能優化提供同步和異步功能。

注意

Embeddings 目前未實作 Runnable 介面,並且也不是 pydantic BaseModel 的實例。

嵌入查詢與文件

embed_queryembed_documents 方法是必要的。這些方法都在字串輸入上運作。基於傳統原因,Document.page_content 屬性的訪問由向量儲存庫使用嵌入模型處理。

embed_query 接收單個字串,並以浮點數列表的形式返回單個嵌入。如果您的模型對於嵌入查詢與底層文件有不同的模式,您可以實作此方法來處理。

embed_documents 接收字串列表,並以浮點數列表的列表形式返回嵌入列表。

注意

embed_documents 接收純文本列表,而不是 LangChain Document 物件列表。此方法的名稱可能會在 LangChain 的未來版本中更改。

實作

作為範例,我們將實作一個簡單的嵌入模型,該模型返回恆定向量。此模型僅用於說明目的。

from typing import List

from langchain_core.embeddings import Embeddings


class ParrotLinkEmbeddings(Embeddings):
"""ParrotLink embedding model integration.

# TODO: Populate with relevant params.
Key init args — completion params:
model: str
Name of ParrotLink model to use.

See full list of supported init args and their descriptions in the params section.

# TODO: Replace with relevant init params.
Instantiate:
.. code-block:: python

from langchain_parrot_link import ParrotLinkEmbeddings

embed = ParrotLinkEmbeddings(
model="...",
# api_key="...",
# other params...
)

Embed single text:
.. code-block:: python

input_text = "The meaning of life is 42"
embed.embed_query(input_text)

.. code-block:: python

# TODO: Example output.

# TODO: Delete if token-level streaming isn't supported.
Embed multiple text:
.. code-block:: python

input_texts = ["Document 1...", "Document 2..."]
embed.embed_documents(input_texts)

.. code-block:: python

# TODO: Example output.

# TODO: Delete if native async isn't supported.
Async:
.. code-block:: python

await embed.aembed_query(input_text)

# multiple:
# await embed.aembed_documents(input_texts)

.. code-block:: python

# TODO: Example output.

"""

def __init__(self, model: str):
self.model = model

def embed_documents(self, texts: List[str]) -> List[List[float]]:
"""Embed search docs."""
return [[0.5, 0.6, 0.7] for _ in texts]

def embed_query(self, text: str) -> List[float]:
"""Embed query text."""
return self.embed_documents([text])[0]

# optional: add custom async implementations here
# you can also delete these, and the base class will
# use the default implementation, which calls the sync
# version in an async executor:

# async def aembed_documents(self, texts: List[str]) -> List[List[float]]:
# """Asynchronous Embed search docs."""
# ...

# async def aembed_query(self, text: str) -> List[float]:
# """Asynchronous Embed query text."""
# ...
API 參考:Embeddings

讓我們測試一下 🧪

embeddings = ParrotLinkEmbeddings("test-model")
print(embeddings.embed_documents(["Hello", "world"]))
print(embeddings.embed_query("Hello"))
[[0.5, 0.6, 0.7], [0.5, 0.6, 0.7]]
[0.5, 0.6, 0.7]

貢獻

我們歡迎將嵌入模型貢獻到 LangChain 代碼庫。

如果您旨在為新的提供商貢獻嵌入模型(例如,使用一組新的依賴項或 SDK),我們鼓勵您在單獨的 langchain-* 整合套件中發布您的實作。這將使您能夠適當地管理依賴項和版本化您的套件。請參閱我們的貢獻指南,以獲取此過程的演練。


此頁面是否對您有幫助?