【动手学大模型开发】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 文件中。

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

### LangChainEmbedding 的功能与实现 LangChain 是一种用于构建复杂 AI 应用程序的强大框架,其核心之一便是支持多种类型的嵌入(Embedding)。通过这些嵌入技术,可以将文本转换为高维向量表示形式,从而便于后续处理和分析。 #### 什么是 EmbeddingEmbedding 技术是一种将离散数据(如单词、短语或文档)映射到连续向量空间的技术。这种技术能够捕捉词语之间的语义关系并将其转化为数值型特征以便于机器学习算法使用[^2]。 #### LangChain 支持的 Embedding 类型 LangChain 提供了灵活的支持来集成不同的嵌入模型,无论是预训练模型还是自定义模型都可以轻松接入。以下是几种常见的嵌入方法及其应用场景: 1. **Hugging Face Transformers 嵌入** Hugging Face 提供了大量的预训练语言模型,可以直接作为嵌入工具应用于 LangChain 流程之中。例如可以通过加载 `sentence-transformers` 模型来进行高质量的句子级嵌入操作[^1]。 2. **OpenAI API 驱动的嵌入** 如果项目允许调用外部服务,则 OpenAI 所提供的 GPT 系列模型也是一个不错的选择。它们具备强大的泛化能力,在许多自然语言理解任务上表现优异。不过需要注意的是这通常伴随着一定的成本开销以及网络延迟等问题。 3. **本地部署的 FAISS 或 ChromaDB 向量存储方案** 对于希望完全掌控整个系统的开发者来说,还可以考虑利用像 FAISS 这样的库或者更高级别的解决方案比如 Chroma 来管理自己的向量数据库。这样不仅可以减少对外部依赖程度还能提高查询效率。 #### 实现代码示例 下面给出一段简单的 Python 脚本展示如何基于 SentenceTransformer 创建一个基本的嵌入函数并与 LangChain 结合起来工作: ```python from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS # 初始化 huggingface embeddings 使用 sentence-transformer model 'all-MiniLM-L6-v2' embedder = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") texts = ["hello world", "this is a test"] # 将 texts 列表中的每一项都转成对应的 embedding vector 并存放到 faiss index 当中去. docsearch = FAISS.from_texts(texts, embedder) query = "what does the fox say?" docs = docsearch.similarity_search(query) print(docs) ``` 上述脚本展示了怎样借助 HuggingFaceEmbeddings 和 FAISS 构建起一套完整的检索机制。其中我们选择了性能良好且体积较小的 all-Minilm-l6-V2 模型来做示范用途。 ### 总结 综上所述,LangChain 不仅提供了丰富的接口使得我们可以方便快捷地引入各种先进的嵌入技术;同时也给予了足够的自由度让用户可以根据实际需求定制专属的工作流。无论你是初学者还是资深工程师都能从中受益匪浅[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值