LangChain嵌入:从原理到实践

0 阅读4分钟

前言

年底了,有几个项目的客户还在催着一些新提的需求在春节前上线

有几天没学习LangChain框架相关知识了,抽空继续学习研究

嵌入

嵌入(Embedding)可以将文本转换为向量表示,从而实现文本的语义分析和相似度计算

简单来说,就是给每个文本分配一个"数字身份证",相似的文本会有相似的"身份证号码"

应用场景

日常我们接触到的实际的场景应用,比如:

  • 智能搜索:比如在文档库中查找与查询语义相关的内容,而不仅仅是关键词匹配
  • 问答系统:找到与用户问题最相关的文档片段作为答案依据
  • 推荐系统:根据用户兴趣向量推荐相关内容

代码实现

示例提供了两个例子,一个是文本对比,一个是文本搜索


from langchain_huggingface import HuggingFaceEmbeddings
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import os

# 示例 1: 使用 HuggingFace 嵌入模型(无需 API 密钥)
def use_huggingface_embeddings():
    """使用 HuggingFace 提供的预训练模型生成嵌入"""
    print("\n=== 使用 HuggingFace 嵌入模型 ===")
    
    # 创建嵌入模型实例
    embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
    
    # 示例文本
    texts = [
        "猫是一种常见的家养宠物",
        "狗是人类最好的朋友",
        "大象是陆地上最大的动物",
        "家养宠物中猫特别普遍"
    ]
    
    # 生成嵌入向量
    print("生成文本嵌入向量...")
    vectors = embeddings.embed_documents(texts)
    
    # 查看嵌入向量的维度
    print(f"嵌入向量维度: {len(vectors[0])}")
    
    # 计算文本之间的相似度
    print("\n计算文本之间的相似度:")
    similarity_matrix = cosine_similarity(vectors)
    
    for i, text1 in enumerate(texts):
        for j, text2 in enumerate(texts):
            if i < j:  # 避免重复计算
                similarity = similarity_matrix[i][j]
                print(f"'{text1}' 与 '{text2}' 的相似度: {similarity:.4f}")

# 示例 2: 文本搜索功能
def text_search_demo():
    """使用嵌入实现简单的文本搜索功能"""
    print("\n=== 文本搜索功能演示 ===")
    
    # 创建嵌入模型实例
    embeddings = HuggingFaceEmbeddings(model_name="all-MiniLM-L6-v2")
    
    # 文档集合
    documents = [
        "Python 是一种广泛使用的高级编程语言",
        "LangChain 是一个用于构建 LLM 应用的框架",
        "机器学习是人工智能的一个分支",
        "深度学习是机器学习的一个子领域",
        "数据科学涉及数据的分析和可视化"
    ]
    
    # 生成文档嵌入
    doc_vectors = embeddings.embed_documents(documents)
    
    # 用户查询
    query = "什么是 LangChain?"
    print(f"\n查询: {query}")
    
    # 生成查询嵌入
    query_vector = embeddings.embed_query(query)
    
    # 计算查询与每个文档的相似度
    similarities = cosine_similarity([query_vector], doc_vectors)[0]
    
    # 按相似度排序
    sorted_indices = np.argsort(similarities)[::-1]
    
    # 显示搜索结果
    print("\n搜索结果(按相似度排序):")
    for i, idx in enumerate(sorted_indices):
        print(f"{i+1}. 相似度: {similarities[idx]:.4f} - {documents[idx]}")



# 运行示例
if __name__ == "__main__":
    print("LangChain 嵌入示例")
    print("=" * 50)
    
    # 运行 HuggingFace 嵌入示例
    use_huggingface_embeddings()
    
    # 运行文本搜索示例
    text_search_demo()

    print("\n示例运行完成!")

运行结果如下:

HuggingFaceEmbeddings 类

来源:langchain-huggingface 包中的类

功能:封装了 HuggingFace 的预训练嵌入模型,提供统一的接口用于文本向量化

主要方法:

  • embed_documents(texts):批量为多个文本生成嵌入向量
  • embed_query(text):为单个查询文本生成嵌入向量

all-MiniLM-L6-v2 模型

轻量级:

  • 基于 MiniLM 架构(BERT 的轻量级版本)
  • 模型大小约 80MB,适合在资源受限环境中使用

多语言支持:

  • 支持多种语言的文本嵌入

性能平衡:

  • 在速度和嵌入质量之间取得了良好平衡
  • 虽然比大型模型(如 BERT-base)小,但在大多数任务上表现接近

适用场景:

  • 文本相似度计算
  • 语义搜索
  • 文本分类
  • 聚类分析

相关依赖安装

pip install langchain-huggingface sentence-transformers scikit-learn numpy

小结

现在对于嵌入概念有了大概的了解,里面的一些代码技术细节是越看越晕,多看多理解吧,代码多运行看看,现在只是简单的跑通了例子,里面大概用了什么库,大概代码是怎么回事,后面实战项目遇到问题再针对性研究吧

当然,也可能后面实战项目一行代码不写,纯面向AI嘴遁式开发

工作比较忙,断断续续学习研究,收获不大多少有点,慢慢来,加油!

欢迎留言交流,如果觉得有帮助,可以点个赞支持一下

公众号:草帽lufei