自訂嵌入
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_query
和 embed_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."""
# ...
讓我們測試一下 🧪
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-*
整合套件中發布您的實作。這將使您能夠適當地管理依賴項和版本化您的套件。請參閱我們的貢獻指南,以獲取此過程的演練。