mirror of
https://github.com/hwchase17/langchain
synced 2024-11-06 03:20:49 +00:00
core[patch]: Document embeddings namespace (#23132)
Document embeddings namespace
This commit is contained in:
parent
a3bae56a48
commit
fe4f10047b
@ -6,7 +6,32 @@ from langchain_core.runnables.config import run_in_executor
|
|||||||
|
|
||||||
|
|
||||||
class Embeddings(ABC):
|
class Embeddings(ABC):
|
||||||
"""Interface for embedding models."""
|
"""An interface for embedding models.
|
||||||
|
|
||||||
|
This is an interface meant for implementing text embedding models.
|
||||||
|
|
||||||
|
Text embedding models are used to map text to a vector (a point in n-dimensional
|
||||||
|
space).
|
||||||
|
|
||||||
|
Texts that are similar will usually be mapped to points that are close to each
|
||||||
|
other in this space. The exact details of what's considered "similar" and how
|
||||||
|
"distance" is measured in this space are dependent on the specific embedding model.
|
||||||
|
|
||||||
|
This abstraction contains a method for embedding a list of documents and a method
|
||||||
|
for embedding a query text. The embedding of a query text is expected to be a single
|
||||||
|
vector, while the embedding of a list of documents is expected to be a list of
|
||||||
|
vectors.
|
||||||
|
|
||||||
|
Usually the query embedding is identical to the document embedding, but the
|
||||||
|
abstraction allows treating them independently.
|
||||||
|
|
||||||
|
In addition to the synchronous methods, this interface also provides asynchronous
|
||||||
|
versions of the methods.
|
||||||
|
|
||||||
|
By default, the asynchronous methods are implemented using the synchronous methods;
|
||||||
|
however, implementations may choose to override the asynchronous methods with
|
||||||
|
an async native implementation for performance reasons.
|
||||||
|
"""
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def embed_documents(self, texts: List[str]) -> List[List[float]]:
|
def embed_documents(self, texts: List[str]) -> List[List[float]]:
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
"""Module contains a few fake embedding models for testing purposes."""
|
||||||
|
# Please do not add additional fake embedding model implementations here.
|
||||||
import hashlib
|
import hashlib
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
@ -6,7 +8,21 @@ from langchain_core.pydantic_v1 import BaseModel
|
|||||||
|
|
||||||
|
|
||||||
class FakeEmbeddings(Embeddings, BaseModel):
|
class FakeEmbeddings(Embeddings, BaseModel):
|
||||||
"""Fake embedding model."""
|
"""Fake embedding model for unit testing purposes.
|
||||||
|
|
||||||
|
This embedding model creates embeddings by sampling from a normal distribution.
|
||||||
|
|
||||||
|
Do not use this outside of testing, as it is not a real embedding model.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from langchain_core.embeddings import FakeEmbeddings
|
||||||
|
|
||||||
|
fake_embeddings = FakeEmbeddings(size=100)
|
||||||
|
fake_embeddings.embed_documents(["hello world", "foo bar"])
|
||||||
|
"""
|
||||||
|
|
||||||
size: int
|
size: int
|
||||||
"""The size of the embedding vector."""
|
"""The size of the embedding vector."""
|
||||||
@ -24,9 +40,21 @@ class FakeEmbeddings(Embeddings, BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class DeterministicFakeEmbedding(Embeddings, BaseModel):
|
class DeterministicFakeEmbedding(Embeddings, BaseModel):
|
||||||
"""
|
"""Deterministic fake embedding model for unit testing purposes.
|
||||||
Fake embedding model that always returns
|
|
||||||
the same embedding vector for the same text.
|
This embedding model creates embeddings by sampling from a normal distribution
|
||||||
|
with a seed based on the hash of the text.
|
||||||
|
|
||||||
|
Do not use this outside of testing, as it is not a real embedding model.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
from langchain_core.embeddings import DeterministicFakeEmbedding
|
||||||
|
|
||||||
|
fake_embeddings = DeterministicFakeEmbedding(size=100)
|
||||||
|
fake_embeddings.embed_documents(["hello world", "foo bar"])
|
||||||
"""
|
"""
|
||||||
|
|
||||||
size: int
|
size: int
|
||||||
@ -40,9 +68,7 @@ class DeterministicFakeEmbedding(Embeddings, BaseModel):
|
|||||||
return list(np.random.normal(size=self.size))
|
return list(np.random.normal(size=self.size))
|
||||||
|
|
||||||
def _get_seed(self, text: str) -> int:
|
def _get_seed(self, text: str) -> int:
|
||||||
"""
|
"""Get a seed for the random generator, using the hash of the text."""
|
||||||
Get a seed for the random generator, using the hash of the text.
|
|
||||||
"""
|
|
||||||
return int(hashlib.sha256(text.encode("utf-8")).hexdigest(), 16) % 10**8
|
return int(hashlib.sha256(text.encode("utf-8")).hexdigest(), 16) % 10**8
|
||||||
|
|
||||||
def embed_documents(self, texts: List[str]) -> List[List[float]]:
|
def embed_documents(self, texts: List[str]) -> List[List[float]]:
|
||||||
|
Loading…
Reference in New Issue
Block a user