【动手学大模型开发】LangChain 自定义 Embedding 讲解

🌈 嗨,我是青松,很高兴遇到你!

🌟 希望用我的经验,让每个人的AI学习之路走的更容易些~

🔥 专栏:大模型(LLMs)高频面题全面整理(★2025最新版★)


LangChain 为基于 LLM 开发自定义应用提供了高效的开发框架,便于开发者迅速地激发 LLM 的强大能力,搭建 LLM 应用。LangChain 也同样支持多种大模型的 Embeddings,内置了 OpenAI、LLAMA 等大模型 Embeddings 的调用接口。但是,LangChain 并没有内置所有大模型,它通过允许用户自定义 Embeddings 类型,来提供强大的可扩展性。

在本部分,我们以智谱 AI 为例,讲述如何基于 LangChain 自定义 Embeddings。

本部分涉及相对更多 LangChain、大模型调用的技术细节,有精力同学可以学习部署,如无精力可以直接使用后续代码来支持调用。

要实现自定义 Embeddings,需要定义一个自定义类继承自 LangChain 的 Embeddings 基类,然后定义两个函数:① embed_query 方法,用于对单个字符串(query)进行 embedding;②embed_documents 方法,用于对字符串列表(documents)进行 embedding。

首先我们导入所需的第三方库:

from __future__ import annotations

import logging
from typing import Dict, List, Any

from langchain.embeddings.base import Embeddings
from langchain.pydantic_v1 import BaseModel, root_validator

logger = logging.getLogger(__name__)

这里我们定义一个继承自 Embeddings 类的自定义 Embeddings 类:

class ZhipuAIEmbeddings(BaseModel, Embeddings):
    """`Zhipuai Embeddings` embedding models."""

    client: Any
    """`zhipuai.ZhipuAI"""在 Python 中,root_validator 是 Pydantic 模块中一个用于自定义数据校验的装饰器函数。root_validator 用于在校验整个数据模型之前对整个数据模型进行自定义校验,以确保所有的数据都符合所期望的数据结构。

root_validator 接收一个函数作为参数,该函数包含需要校验的逻辑。函数应该返回一个字典,其中包含经过校验的数据。如果校验失败,则抛出一个 ValueError 异常。

这里我们只需将.env文件中ZHIPUAI_API_KEY配置好即可,zhipuai.ZhipuAI会自动获取ZHIPUAI_API_KEY

@root_validator()
def validate_environment(cls, values: Dict) -> Dict:
    """
    实例化ZhipuAI为values["client"]

    Args:

        values (Dict): 包含配置信息的字典,必须包含 client 的字段.
    Returns:

        values (Dict): 包含配置信息的字典。如果环境中有zhipuai库,则将返回实例化的ZhipuAI类;否则将报错 'ModuleNotFoundError: No module named 'zhipuai''.
    """
    from zhipuai import ZhipuAI
    values["client"] = ZhipuAI()
    return valuesCopy to clipboardErrorCopied

embed_query 是对单个文本(str)计算 embedding 的方法,这里我们重写该方法,调用验证环境时实例化的ZhipuAI来 调用远程 API 并返回 embedding 结果。

def embed_query(self, text: str) -> List[float]:
    """
    生成输入文本的 embedding.

    Args:
        texts (str): 要生成 embedding 的文本.

    Return:
        embeddings (List[float]): 输入文本的 embedding,一个浮点数值列表.
    """
    embeddings = self.client.embeddings.create(
        model="embedding-2",
        input=text
    )
    return embeddings.data[0].embeddingCopy to clipboardErrorCopied

embed_documents 是对字符串列表(List[str])计算embedding 的方法,对于这种类型输入我们采取循环方式挨个计算列表内子字符串的 embedding 并返回。

def embed_documents(self, texts: List[str]) -> List[List[float]]:
    """
    生成输入文本列表的 embedding.
    Args:
        texts (List[str]): 要生成 embedding 的文本列表.

    Returns:
        List[List[float]]: 输入列表中每个文档的 embedding 列表。每个 embedding 都表示为一个浮点值列表。
    """
    return [self.embed_query(text) for text in texts]Copy to clipboardErrorCopied

对于 embed_query 可以加入一些内容处理后再请求 embedding,比如如果文本特别长,我们可以考虑对文本分段,防止超过最大 token 限制,这些都是可以的,靠大家发挥自己的主观能动性完善啦,这里只是给出一个简单的 demo。

通过上述步骤,我们就可以基于 LangChain 与 智谱 AI 定义 embedding 的调用方式了。我们将此代码封装在 zhipuai_embedding.py 文件中。

本文对应源代码在此处,如需复现可下载运行源代码。

### 使用 LangChain 集成 Embedding 服务或模型 LangChain 是一种用于构建语言处理应用程序的框架,它能够轻松集成各种嵌入(embedding)服务或模型。以下是关于如何使用 LangChain 连接到 Embedding 服务或模型的一个教程示例。 #### 安装依赖项 为了实现这一功能,首先需要安装 `langchain` 和所需的嵌入提供者库。例如,如果计划使用 OpenAI 的嵌入服务,则可以运行以下命令来安装必要的包: ```bash pip install langchain openai ``` #### 初始化 LangChain加载 Embedding 模型 下面是一个简单的 Python 脚本,展示如何通过 LangChain 加载并调用一个预定义的嵌入模型: ```python from langchain.embeddings import OpenAIEmbeddings # 设置 API 密钥环境变量或其他认证方式 (此处假设已设置 OPENAI_API_KEY) embeddings = OpenAIEmbeddings() text = "This is an example sentence." query_result = embeddings.embed_query(text) print(f"The embedding vector has {len(query_result)} dimensions.") ``` 上述代码片段展示了如何利用 OpenAI 提供的服务创建文本向量表示[^1]。注意,在实际部署前需确保配置好相应的 API 访问权限。 对于自托管解决方案或者希望减少对外部API依赖的情况,也可以考虑其他本地化选项比如 Hugging Face Transformers 库中的某些预训练模型作为替代方案之一[^3]。 #### 自定义 Embedding 实现 当不适用第三方云平台所提供的在线接口时,还可以基于 PyTorch 或 TensorFlow 构建自己的 embedding 层次结构,并将其封装进 LangChain 流程里去完成相似的任务需求分析过程如下所示: ```python import torch from transformers import AutoTokenizer, AutoModel from langchain.embeddings.base import Embeddings class CustomHFEmbedder(Embeddings): def __init__(self,model_name="sentence-transformers/all-MiniLM-L6-v2"): self.tokenizer = AutoTokenizer.from_pretrained(model_name) self.model = AutoModel.from_pretrained(model_name).eval() @torch.no_grad() def embed_documents(self,texts): inputs=self.tokenizer(list(map(str.strip,texts)),return_tensors='pt',padding=True,truncation=True,max_length=512) outputs=self.model(**inputs)[0][:,0,:].numpy().tolist() return outputs custom_embedder=CustomHFEmbedder() texts=["First document.","Second one."] result=custom_embedder.embed_documents(texts) for r in result[:2]: print(len(r)) ``` 此部分演示了怎样借助 HuggingFace Transformer 创建了一个继承自 LangChain 抽象类 `Embeddings` 的新类型对象——即我们称之为 “CustomHFEmbedder”。该定制版本允许用户灵活指定任意兼容架构下的具体实例名称来进行初始化操作。 #### 结论 无论是选用远程 RESTful Web Service 形式的插件扩展形式还是完全离线模式下依靠开源社区贡献成果自行搭建私有计算资源池的方式都可以很好地满足不同场景下的应用开发诉求[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值