基于LangChain的大模型学习手册之Embedding(保姆级)

前言

时至今日,经过2年的“攻城拔寨”,大模型显然吹进了“寻常百姓家”。如果你还不了解ChatGPT,不了解通义、文心、混元等国内任意一款大模型产品,那么请来博主这里坐坐,我们“边看边聊”

在这里插入图片描述

随着ChatGPT的问世,仿佛一夜间,把AI的门槛从金字塔顶端拉至了腰身,甚至脚跟处,神不神奇?当然神奇,这个领域曾经是机器学习擅长的圈子,除非你具备相当的基础、甚至专业能力,否则可以说“与你无关”

如今呢,AIGC遍天下,工具化浪潮代替了原始的生产方式,你不需要懂数学、懂计算机,什么算法、数据都可以抛在脑后。你要做的只需要“懂”它即可。唯有懂它,才能很好的利用它,也就是AI工具的使命和价值。

今天博主带各位,先了解一下如何让大模型“懂”你吧。刚才讲是你要懂它,现在反过来它要懂你,这是为什么? 因为大模型具备一定的“类人思维”,所以懂你是前提。

Q1:什么是RAG

如何理解懂你这件事呢? 这可不像爱一个人,随着时间进程,彼此间会自然发生。大模型可以说是一块“木头”,需要你告诉它才行。比如你想查个什么东东,让它按照你的意志进行回答问题,怎么办?这就不得不提RAG了。

不熟悉机器学习的同学,可能不了解RAG。但是熟悉的同学,一定知道它的作用。以下是博主从百度百科摘录的介绍,可窥一二:

检索增强生成Retrieval-augmented Generation),简称RAG,是当下热门的大模型前沿技术之一。 检索增强生成模型结合了语言模型和信息检索技术。具体来说,当模型需要生成文本或者回答问题时,它会先从一个庞大的文档集合中检索出相关的信息,然后利用这些检索到的信息来指导文本的生成,从而提高预测的质量和准确性。——百度百科

怎么理解它?来看看下面这张图,也许有些帮助:

在这里插入图片描述

一句话总结:用户的问题结合RAG后,把检索结果再次输入到大模型,生成新的结果。
如果觉得难以理解,可以参考下面简化后的流程:

在这里插入图片描述
总之,就是讲了一件事,在让大模型懂你前,必须“喂饱”它。然后让它有意识的懂你并按你的意志运转。通过RAG的过程,博主梳理几个关键词:

序号名称作用
1question用户的问题
2textsplit文本分段,为下一步embedding做准备
3embedding文本嵌入,机器学习领域文本向量化的关键步骤
4retrieval文本检索,结合用户问题和embedding数据检索
5document检索结果,一个标准化的文档对象

其中,embedding是关键的一环。

Q2:如何完成Embedding(嵌入)

通俗的讲,embedding就是把你的数据转换成机器可识别的格式。在机器学习领域,通常以向量的形式存储数据,一是为了方便检索,二是为了提高检索质量。当然embedding可通过多种方式完成,博主选择基于langchain完成以下实践。

提示:在正式完成以下操作前,需安装langchain、langchain-core、langchain-community、langchain-text-splitters、langchain-chroma、chroma、pypdf、dashscope

1. 文档加载

首先需要把文档转换为符合嵌入的标准文档,即Document。

1.1 load pdf

使用PyPDFLoader工具完成:

# 加载PDF文件
from langchain_community.document_loaders import PyPDFLoader
directory_path = "/pdf"
mydata = []
for filename in os.listdir(directory_path):
    # 检查文档格式
    if filename.endswith(".pdf"):
        loader = PyPDFLoader(directory_path+'\\'+filename)
        mydata.append(loader.load_and_split())
1.2 load txt/html

使用UnstructuredHTMLLoader工具完成:

from langchain_community.document_loaders import UnstructuredHTMLLoader
# 加载html文件为document
file_path = "/html"
loader = UnstructuredHTMLLoader(file_path)
mydata = loader.load()
1.3 load word

使用UnstructuredWordDocumentLoader工具完成:

from langchain_community.document_loaders import UnstructuredWordDocumentLoader
# 加载docx/doc文件为document
directory_path = "/word"
mydata = []
for filename in os.listdir(directory_path):
    # 检查所有doc以及docx后缀的文件
    if filename.endswith(".doc") or filename.endswith(".docx"):
        loader = UnstructuredWordDocumentLoader(directory_path+'\\'+filename, mode="elements", strategy="fast")
        mydata.append(loader.load())

2. 文档切割

你可以把第1步加载后的document按一定的chunk切分为一份一份小文档:

from langchain_text_splitters import CharacterTextSplitter
# 创建分割器
text_splitter = CharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=0
)
# 加载文档
docs = []
for document in mydata:
    doc = text_splitter.split_documents(document)
    docs.append(doc)

其中chunk_size是每块文本(即chunk)有序切割的最大长度;chunk_overlap是相邻chunk重叠的token数量。

3. 嵌入模型

嵌入模型实际上是将分割后的文档(chunk)转换为向量的工具。比如阿里的text-embedding-v1或者hugeface的all-MiniLM-L6-v2等。这里以阿里的模型为例,结合langchain可以这样定义一个嵌入模型:

from langchain_community.embeddings import DashScopeEmbeddings
embedding = DashScopeEmbeddings(
    model="text-embedding-v1",
    dashscope_api_key='阿里dashscope api key'
)

4. 向量存储

完成前3步,最后一步就是存储了。怎么存?向量喽~

from langchain_community.vectorstores import Chroma
vector_dir = '/db'
vectordb = Chroma.from_documents(
    documents=docs,
    embedding=embedding,
    persist_directory=vector_dir 
)
# 持久化,支持迁移
vectordb.persist()

至此,你轻松的完成了文本向量的持久化,为下一步大模型RAG的实现,打下了坚实的数据基础。


结语

大模型本质是工具,善者善用。如何利用它的长处以克服它的“劣势”,才是使用它的目的。而RAG为合理、正确的使用它,提供了一个最佳路径,同时embedding又是RAG的必由之路。所以本文可为你提供一些灵感,助你上道~

走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~

精彩回顾

基于DashScope+Streamlit构建你的机器学习助手(入门级)
基于LangChain的大模型学习手册(入门级)
基于Python的大模型学习手册(入门级)


在这里插入图片描述

### 如何在 LangChain 中集成和使用本地 Embedding 模型 LangChain 提供了灵活的方式来处理嵌入模型,允许用户不仅依赖于云端服务(如 OpenAI 的 Embeddings),还可以通过本地部署的方式加载自定义的嵌入模型。以下是关于如何在 LangChain 中集成并使用本地嵌入模型的具体方法。 #### 使用 Hugging Face Transformers 加载本地 Embedding 模型 Hugging Face 提供了大量的预训练嵌入模型,这些模型可以直接下载到本地并通过 Python 接口调用。以下是一个简单的实现方式: 1. **安装必要的库** 需要先确保已安装 `transformers` 和 `sentence-transformers` 库。 ```bash pip install transformers sentence-transformers ``` 2. **编写代码以加载本地模型** 可以利用 `SentenceTransformer` 类来加载本地存储的模型文件夹路径。 ```python from sentence_transformers import SentenceTransformer model_path = "./local_embedding_model" # 替换为实际的模型路径 local_embeddings = SentenceTransformer(model_path) document_texts = ["This is the first document.", "Here comes another one."] # 文档列表 embeddings = local_embeddings.encode(document_texts) # 对文档进行编码得到嵌入向量 print(embeddings.shape) # 输出嵌入矩阵形状 ``` 3. **将本地嵌入模型与 FAISS 结合** 如果希望进一步优化查询性能,可以结合 Facebook 开源的 FAISS 工具构建索引结构。 ```python from langchain.vectorstores import FAISS from langchain.embeddings import HuggingFaceEmbeddings hf_local_embedder = HuggingFaceEmbeddings( model_name=model_path, cache_folder="./cache", model_kwargs={'device': 'cpu'} # 或者指定 GPU 设备 ) faiss_index = FAISS.from_texts(texts=document_texts, embedding=hf_local_embedder) retrieved_docs = faiss_index.similarity_search(query="What's this about?", k=2) for doc in retrieved_docs: print(doc.page_content) ``` 上述过程展示了如何基于 Hugging Face 的工具链完成从加载本地模型到生成嵌入再到建立检索系统的全流程[^5]。 #### 性能考量因素 当数据集规模增大时,响应时间可能会受到影响。为了提高效率,除了采用高效的矢量化算法外,还应考虑以下几个方面: - 数据分片:对于非常庞大的语料库,可将其划分为多个子集合分别处理后再汇总结果; - 并行计算:充分利用多核 CPU/GPU 来加速批量操作; - 缓存机制:预先计算好部分高频访问项的表示形式以便快速返回; 以上策略均有助于缓解因文本长度增加而导致延迟上升的问题[^3]。 #### 具体实践案例分享 如果想尝试完整的端到端解决方案,则可以参考 Thomas Yanxin 在 GitHub 上开源的一个项目实例——LangChain ChatGLM WebUI[^2]。该项目实现了对多种大语言模型的支持,并且提供了友好的图形界面让用户能够轻松测试不同配置下的效果差异。 ---
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值