LangChain 三 Data Connections

LangChain学习来到第三篇,如果您是刚入门LangChain,请先查阅前两篇。

LangChain 一 hello LLM - 掘金 (juejin.cn)

LangChain 二 模型 - 掘金 (juejin.cn)

前言

上篇我们学习了LangChain的模型接口。主要分为两类,聊天场景的chat_models和接入各家大模型的langchain.llms,我们可以使用predict方法与模型沟通。

另外, 上篇文章,我们还了解到聊天业务中的langchain.schema.messages中的三个消息类,后期我们在实战中,将与memory模块一起,完成RAG或AI聊天应用开发。现在,让我们进入Data Connections,看看LangChain相比LlamaIndex,是如何做数据连接的。我之前写过LlamaIndex 四 数据连接器 - 掘金 (juejin.cn),总结部分我们会做个对比。

Data Connections

大模型有时并不包含我们需要的知识或数据,这是它有时会"瞎编"的原因。比如某些企业或单位,闭源的数据,或模型数据训练后新的数据,特别是当我们在做RAG应用时,我们可以为大模型连接一些数据,让它基于连接的数据,继续完成Completion或Chat工作。

相应模块

将数据加载到大模型的工作流程,每个阶段LangChain都提供了相应的组件类。

  • 文档加载器

负责加载各种格式的数据。LangChain提供了各种类型的加载器,本地、网络皆可加载。具体可见Document loaders | 🦜️🔗 Langchain

ini 复制代码
from langchain.document_loaders import TextLoader

loader = TextLoader("./sample_data/README.md")
docs = loader.load()

langchain通过document_loaders模块加载文档,这里引入了TextLoader, 加载本地系统的README.md文件,并返回一个loader对象。loader的load方法,加载文档,并返回一个document对象, 和LlamaIndex挺像的。

  • 文档转换器

拆分文档,将文档转换为问答格式,去除冗余文档。接下来,我们做文档拆分:

ini 复制代码
from langchain.text_splitter import CharacterTextSplitter
text_splitter = CharacterTextSplitter(        
    separator = "\n\n",
    chunk_size = 1000,
    chunk_overlap  = 200,
    length_function = len,
)

split_docs = text_splitter.split_documents(docs)

CharacterTextSplitter是最简单的拆分器,它将文档拆分为固定长度的文本块,方便等下做嵌入。这里将上面的Document进行分割,分割符为两个换行符,每1000个字符一份,chunk_overlap 的意思是前后重叠为100个,这样可以更好的弥补因为在分割的周围出错断片影响语音的问题。

RecursiveCharacterTextSplitter还可以根据编程语言的特性,将代码分为合适的文本块。

ini 复制代码
from langchain.text_splitter import Language,RecursiveCharacterTextSplitter

PYTHON_CODE = """
def hello_langchain():
    print("Hello, Langchain!")

# Call the function
hello_langchain()
"""
python_splitter = RecursiveCharacterTextSplitter.from_language(
    language=Language.PYTHON, chunk_size=50, chunk_overlap=0
)
python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs

从上图可以看出在切割的时候做了语言分析,代码分割的很正确,这里使用的是RecursiveCharacterTextSplitter方法

swift 复制代码
from langchain.text_splitter import MarkdownHeaderTextSplitter

markdown_document = "# Chapter 1\n\n    ## Section 1\n\nHi this is the 1st section\n\nWelcome\n\n ### Module 1 \n\n Hi this is the first module \n\n ## Section 2\n\n Hi this is the 2nd section"

headers_to_split_on = [
    ("#", "Header 1"),
    ("##", "Header 2"),
    ("###", "Header 3"),
]

splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
splits = splitter.split_text(markdown_document)

MarkdownHeaderTextSplitter 可以将Markdown文档按照段落结构,基于Markdown语法进行文档分块。

  • 文本嵌入模型

将非结构化文本转换为向量方式,这是适合大模型计算的方式。比如,我们调用OpenAI embedding接口。

  • 向量存储

将上一步转化的向量,存入chromaDB或啥,并支持向量检索

javascript 复制代码
pip install -q chromadb

from langchain.document_loaders import TextLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma

text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(docs)
db = Chroma.from_documents(documents, OpenAIEmbeddings())
  • 检索器

提供数据查询的通用接口。

向量数据库提供的重要接口就是相似性查询。如上述内容提到,文本相似性的衡量,由文本的向量表示的欧几里得距离来衡量。向量数据库提供了该接口,用于查询与给定文本最相似的文本。

ini 复制代码
query = "什么是WTF Langchain?"
docs = db.similarity_search(query)
print(docs[0].page_content)

实战

  • 了解了加载器、分割器
  • 了解了基于OpenAI的embedding 向量数据库存储和检索的方法。

参考资料

相关推荐
成富1 小时前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
程序员X小鹿1 小时前
全部免费!6款AI对口型神器,让照片开口说话唱歌,早晚用得上,建议收藏!(附保姆级教程)
aigc
CSDN云计算1 小时前
如何以开源加速AI企业落地,红帽带来新解法
人工智能·开源·openshift·红帽·instructlab
艾派森1 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
hairenjing11231 小时前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
真忒修斯之船1 小时前
大模型分布式训练并行技术(三)流水线并行
面试·llm·aigc
小蜗子1 小时前
Multi‐modal knowledge graph inference via media convergenceand logic rule
人工智能·知识图谱
SpikeKing2 小时前
LLM - 使用 LLaMA-Factory 微调大模型 环境配置与训练推理 教程 (1)
人工智能·llm·大语言模型·llama·环境配置·llamafactory·训练框架
黄焖鸡能干四碗2 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
2 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习