开启左侧

LangChain框架-嵌入模型详解

[复制链接]
admin 发表于 2025-9-7 23:02:51 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
嵌入模型

        嵌入模型创建文本片段的向量表示。您可以将向量视为一个数字数组,它捕捉了文本的语义含义。 通过这种方式表示文本,您可以执行数学运算,从而进行诸如搜索其他在意义上最相似的文本等操作。 这些自然语言搜索能力支撑着许多类型的上下文检索, 在这里,我们为大型语言模型提供其有效响应查询所需的相关数据。
Embeddings类

   Embeddings类是一个用于与文本嵌入模型接口的类。存在许多不同的嵌入大模型供应商(OpenAI、Cohere、Hugging Face等)和本地模型,此类旨在为它们提供标准接口。以下是langchain-community  V0.3.21版本提供的Embeddings 实现类的分类简要介绍。

主流云服务提供商

    OpenAIEmbeddings
    OpenAI提供的文本嵌入模型(如text-embedding-ada-002),广泛用于语义搜索和相似性计算。
    AzureOpenAIEmbeddings
    Azure云平台托管的OpenAI嵌入模型,功能与OpenAIEmbeddings相同,但通过Azure接口调用。
    GooglePalmEmbeddings
    Google PaLM模型系列的嵌入服务,适用于多模态和文本任务。
    VertexAIEmbeddings
    Google Vertex AI平台的嵌入模型,集成在GCP生态中。
    CohereEmbeddings
    Cohere公司提供的语义嵌入模型,支持多语言和高性能检索。
    BedrockEmbeddings
    AWS Bedrock服务的嵌入模型,支持多种基础模型(如Claude、Llama等)。
    OCIGenAIEmbeddings
    Oracle Cloud Infrastructure (OCI) 的生成式AI嵌入服务。

开源与本地模型

    HuggingFaceEmbeddings
    支持Hugging Face Hub中的开源嵌入模型(如BERT、RoBERTa)。
    SentenceTransformerEmbeddings
    基于Sentence-Transformers库的嵌入模型(如all-MiniLM-L6-v2)。
    HuggingFaceInstructEmbeddings
    针对指令优化的模型(如hkunlp/instructor-large)。
    FastEmbedEmbeddings
    轻量级、高性能的开源嵌入库(如BGE、FlagEmbedding)。
    LlamaCppEmbeddings
    基于Llama.cpp的本地嵌入模型,支持CPU推理。
    LocalAIEmbeddings
    本地部署的AI模型嵌入,兼容OpenAI API格式。
    OllamaEmbeddings
    通过Ollama工具运行的本地模型嵌入(如Llama 2)。

国产与区域服务

    ErnieEmbeddings
    百度文心大模型的嵌入服务,支持中文场景。
    QianfanEmbeddingsEndpoint
    百度千帆平台的嵌入模型API。
    ZhipuAIEmbeddings
    智谱AI(GLM系列)的嵌入服务。
    BaichuanTextEmbeddings
    百川智能的中文文本嵌入模型。
    HunyuanEmbeddings
    腾讯混元大模型的嵌入服务。
    DashScopeEmbeddings
    阿里云达摩院的模型服务(通义千问)。
    YandexGPTEmbeddings
    Yandex的俄语优化嵌入模型。

行业特定或企业级

    DatabricksEmbeddings
    Databricks平台的MLflow集成嵌入模型。
    SagemakerEndpointEmbeddings
    AWS SageMaker托管的自定义嵌入模型端点。
    MosaicMLInstructorEmbeddings
    MosaicML训练的指令优化嵌入模型。
    SelfHostedEmbeddings
    用户自托管的自定义嵌入模型。
    JavelinAIGatewayEmbeddings
    通过Javelin AI网关访问的嵌入服务。

小众或实验性

    FakeEmbeddings
    用于测试的虚拟嵌入,生成固定值。
    DeterministicFakeEmbedding
    确定性假嵌入,便于调试。
    SpacyEmbeddings
    基于Spacy库的轻量级词向量(如en_core_web_lg)。
    TensorflowHubEmbeddings
    从TensorFlow Hub加载的预训练嵌入。
    LaserEmbeddings
    Facebook的LASER多语言句子嵌入。
    VoyageEmbeddings
    Voyage AI的高效领域专用嵌入。

硬件优化

    OpenVINOBgeEmbeddings
    使用OpenVINO优化的BGE模型,提升Intel硬件性能。
    IpexLLMBgeEmbeddings
    Intel IPEX加速的大语言模型嵌入。

其他

    AlephAlpha*:欧洲Aleph Alpha公司的多模态嵌入。
    AnyscaleEmbeddings:Anyscale平台的Ray集成模型。
    Clova/ClovaX:韩国Naver的嵌入服务。
    SolarEmbeddings:Upstage的Solar模型嵌入。
    JinaEmbeddings:Jina AI的多模态嵌入框架。

LangChain 文本嵌入方法

        LangChain 中的基础 Embeddings 类提供了两个方法:
    嵌入文档:使用 .embed_documents方法,可接受多个文本作为输入。 返回一个浮点数列表的列表。
    嵌入查询:使用.embed_query方法,接受单个文本。返回一个浮点数列表。
代码示例

        接下来,我们以使用开源平台HuggingFace的Embeddings类作为示例,展示LangChain 中的两个文本嵌入方法。
    引入HuggingFaceEmbeddings
  1. from langchain_huggingface import HuggingFaceEmbeddings
  2. embeddings_model = HuggingFaceEmbeddings(model_name="sentence-transformers/all-mpnet-base-v2")
复制代码

  • embed_documents 嵌入文本列表
  1. embeddings = embeddings_model.embed_documents(
  2.     [
  3.         "Hi there!",
  4.         "Oh, hello!",
  5.         "What's your name?",
  6.         "My friends call me World",
  7.         "Hello World!"
  8.     ]
  9. )
  10. len(embeddings), len(embeddings[0])
复制代码
    embed_query 嵌入单个文本
  1. embedded_query = embeddings_model.embed_query("What was the name mentioned in the conversation?")
复制代码
嵌入缓存

        LangChain 的嵌入缓存旨在避免重复计算嵌入向量,提升应用效率,核心依托CacheBackedEmbeddings实现。CacheBackedEmbeddings作为缓存支持的嵌入器,将文本哈希处理后以哈希值为键,在键值存储中缓存嵌入结果,避免对相同文本重复进行嵌入计算,从而提高程序运行效率,降低计算资源消耗 。
    初始化 CacheBackedEmbeddings 的主要支持方式是 from_bytes_store。它接受以下参数:
      underlying_embedder: 用于嵌入的嵌入器。
      document_embedding_cache: 用于缓存文档嵌入的任何 ByteStore。
      batch_size: (可选,默认为 None)在存储更新之间要嵌入的文档数量。
      namespace: (可选,默认为 ``)用于文档缓存的命名空间。此命名空间用于避免与其他缓存的冲突。例如,将其设置为所使用的嵌入模型的名称。
      query_embedding_cache: (可选,默认为 None 或不缓存)用于缓存查询嵌入的 ByteStore,或 True 以使用与 document_embedding_cache 相同的存储。

注意:
    确保设置 namespace 参数,以避免使用不同嵌入模型嵌入相同文本时发生冲突。
    CacheBackedEmbeddings 默认不缓存查询嵌入。要启用查询缓存,需要指定 query_embedding_cache。
代码示例
  1. from langchain.embeddings import CacheBackedEmbeddings
  2. from langchain.storage import LocalFileStore
  3. from langchain_community.document_loaders import TextLoader
  4. from langchain_community.vectorstores import FAISS
  5. from langchain_openai import OpenAIEmbeddings
  6. from langchain_text_splitters import CharacterTextSplitter
  7. underlying_embeddings = OpenAIEmbeddings()
  8. store = LocalFileStore("./cache/")
  9. cached_embedder = CacheBackedEmbeddings.from_bytes_store(
  10.     underlying_embeddings, store, namespace=underlying_embeddings.model
  11. )
  12. raw_documents = TextLoader("state_of_the_union.txt").load()
  13. text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
  14. documents = text_splitter.split_documents(raw_documents)
  15. db = FAISS.from_documents(documents, cached_embedder)
复制代码
缓存方式



AstraDBByteStore

    特性:这是一种非本地存储方案,依托 DataStax 服务,运行于 Cassandra 之上,具备矢量能力与无服务器架构,适用于大型分布式系统,可应对大规模数据存储与高并发访问需求。
    使用方式:使用前需创建 DataStax 账户获取 API 访问凭证,接着安装langchain_astradb包来实现与 AstraDB 的集成,示例代码如下:
  1. from langchain_astradb import AstraDBByteStore
  2. kv_store = AstraDBByteStore(
  3.     api_endpoint="YOUR_API_ENDPOINT",
  4.     api_token="YOUR_API_TOKEN"
  5. )
复制代码
CassandraByteStore

    特性:基于 Apache Cassandra 这一免费开源、分布式宽列存储的 NoSQL 数据库管理系统构建,能处理海量数据,在跨多个普通服务器场景下提供高可用性,无单点故障。从版本 5.0 起,Cassandra 自带向量搜索功能,为数据存储与检索带来更多便利。
    使用方式:属于非本地存储,需安装langchain_community包进行相关操作。
  1. from langchain_community.storage import CassandraByteStore
  2. from cassandra.cluster import Cluster
  3. # 配置 Cassandra 连接
  4. cluster = Cluster(['127.0.0.1'])  # 替换为您的 Cassandra 节点地址
  5. session = cluster.connect('langchain_keyspace')  # 替换为您的 Keyspace 名称
  6. # 初始化 CassandraByteStore
  7. byte_store = CassandraByteStore(
  8.     session=session,
  9.     table_name="byte_store"  # 替换为您的表名
  10. )
复制代码
ElasticsearchEmbeddingsCache

    特性:作为本地存储方式,借助 Elasticsearch 实现嵌入缓存。它不仅能高效存储嵌入数据,还适合需要全文搜索功能的应用场景,方便开发者在大量文本数据中快速定位相关信息。
    使用方式:通过安装langchain_elasticsearch包来使用,示例代码如下:
  1. from langchain_elasticsearch import ElasticsearchEmbeddingsCache
  2. cache = ElasticsearchEmbeddingsCache(
  3.     elasticsearch_url="http://localhost:9200",
  4.     index_name="embedding_cache"
  5. )
复制代码
InMemoryByteStore

    特性:采用内存存储方式,数据直接存储在运行程序的内存中。这种方式速度极快,能在短时间内完成数据的读写操作,不过由于受内存容量限制,数据持久性差,适合存储临时数据,比如在应用运行过程中产生的短暂性缓存数据。
    使用方式:属于 LangChain 核心功能,无需额外安装特定包。使用示例如下:
  1. from langchain_core import InMemoryByteStore
  2. store = InMemoryByteStore()
  3. store.put("key1", "value1")
  4. value = store.get("key1")
复制代码
LocalFileStore

    特性:将数据存储在本地文件系统中,是一种本地存储方案,适合持久化小规模数据。相比内存存储,它不受内存容量限制,数据可长期保存;但读写速度相对内存存储会慢一些。
    使用方式:属于 LangChain 自带功能,示例代码如下:
  1. from langchain import LocalFileStore
  2. store = LocalFileStore("path/to/store")
  3. store.put("key1", "value1")
  4. value = store.get("key1")
复制代码
RedisStore

    特性:基于 Redis 这一高性能的内存数据库实现存储,具备出色的读写性能,非常适合高并发场景。同时,Redis 支持多种数据结构,为数据存储与处理提供了丰富的操作方式,且数据可持久化保存。
    使用方式:安装langchain_community包后使用,示例代码如下:
  1. from langchain_community import RedisStore
  2. store = RedisStore(host='localhost', port=6379)
  3. store.put("key1", "value1")
  4. value = store.get("key1")
复制代码
UpstashRedisByteStore

    特性:这是一种云端 Redis 存储选项,属于非本地存储。它结合了 Redis 的优势与云端服务的便利性,能在云端环境中提供高效的存储服务,适合对数据存储有高可用性和可扩展性需求的应用场景 。
    使用方式:需安装langchain_community包来集成
  1. from langchain_community.storage import UpstashRedisByteStore
  2. from upstash_redis import Redis
  3. # 配置 Upstash Redis 连接
  4. redis_client = Redis(
  5.     url="https://your-upstash-redis-url",
  6.     token="your-upstash-redis-token"
  7. )
  8. # 初始化 UpstashRedisByteStore
  9. byte_store = UpstashRedisByteStore(client=redis_client)
复制代码
参考文献

键值存储 | LangChain中文网
缓存 | LangChain中文网
使用指南 | LangChain中文网
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝0

帖子147

发布主题
阅读排行更多+

Powered by Discuz! X3.4© 2001-2013 Discuz Team.( 京ICP备17022993号-3 )