LangChain是一个框架,用于开发由大型语言模型(LLM)驱动的应用程序。
LangChain 简化了 LLM 应用程序生命周期的每个阶段:
总结: LangChain是一个用于开发由LLM支持的应用程序的框架,通过提供标准化且丰富的模块抽象,构建LLM的输入输出规范,主要是利用其核心概念chains,可以灵活地链接整个应用开发流程。(即,其中的每个模块抽象,都是源于对大模型的深入理解和实践经验,由许多开发者提供出来的标准化流程和解决方案的抽象,再通过灵活的模块化组合,才得到了langchain)
想象一下,如果要组织一个AI应用,开发者一般需要?
由上边的内容,引出LangChain抽象的一些核心模块:
LangChain通过模块化的方式去高级抽象LLM在不同场景下的能力,其中LangChain抽象出的最重要的核心模块如下:‘
LangChain的特点如下:
在使用大模型的过程中,一些行业痛点:
pip install langchain
许多LLM应用程序需要用户特定数据,这些数据不是模型的训练集的一部分. 完成这一任务的主要方法是通过检索增强生成(RAG). 在此过程中,检索外部数据,然后在生成步骤中将其传递给LLM.
文档加载器: 从许多不同来源加载文档. LangChain提供了100多种不同的文档加载器,并与空间中的其他主要提供商(如AirByte和Unstructured)集成. 提供了加载各种类型文档(HTML、PDF、代码)的集成,
TextLoader: TextLoader 是 LangChain 中用于加载文本文件(如 .txt 文件)的加载器。它将文本文件的内容读取为 Document 对象,这些对象包含了文本内容以及相关的元数据。
from langchain.document_loaders import TextLoader
loader = TextLoader("./index.txt")
loader.load()
输出:
Document(metadata={'source': './index.txt'}, page_content='111')
JSONLoader: JSONLoader 是 LangChain 中用于加载 JSON 文件并将其转换为 LangChain 可理解的文档格式的工具。它允许你指定如何从 JSON 结构中提取信息,并将其作为文档内容和元数据。
以下是 JSONLoader 的一些关键特性:
以下为所要读取的json数据以及对应的代码:
{
"messages": [
{
"content": "Hello, how are you?",
"sender_name": "User1",
"timestamp_ms": 1675091462000
},
{
"content": "I am fine, thanks!",
"sender_name": "User2",
"timestamp_ms": 1675091490000
},
{
"content": "That's great to hear!",
"sender_name": "User1",
"timestamp_ms": 1675091515000
}
]
}
from langchain_community.document_loaders import JSONLoader
# 定义一个函数来自定义文档的元数据
def metadata_func(record: dict, metadata: dict) -> dict:
metadata['sender_name'] = record.get('sender_name')
metadata['timestamp_ms'] = record.get('timestamp_ms')
return metadata
# 初始化 JSONLoader 实例
loader = JSONLoader(
file_path='path_to_your_json_file.json',
jq_schema='.messages[]', # 使用 jq 语法指定要提取的数据路径
content_key='content', # 指定内容键
metadata_func=metadata_func, # 自定义元数据函数
json_lines=False # 如果文件是 JSON Lines 格式,设置为 True
)
# 加载 JSON 文件并获取文档列表
documents = loader.load()
# 遍历文档列表并打印内容和元数据
for doc in documents:
print(doc.page_content)
print(doc.metadata)
输出:
Hello, how are you?
{'source': 'C:\Users\tech\Jupyter_Notebook_Project\index.json', 'seq_num': 1, 'sender_name': 'User1', 'timestamp_ms': 1675091462000}
I am fine, thanks!
{'source': 'C:\Users\tech\Jupyter_Notebook_Project\index.json', 'seq_num': 2, 'sender_name': 'User2', 'timestamp_ms': 1675091490000}
That's great to hear!
{'source': 'C:\Users\tech\Jupyter_Notebook_Project\index.json', 'seq_num': 3, 'sender_name': 'User1', 'timestamp_ms': 1675091515000}
CSVLoader 是 LangChain 中用于加载 CSV 文件的组件。CSV 文件是一种常见的数据格式,通常用于存储表格数据,如电子表格或数据库导出的数据。CSVLoader 可以帮助你将这些数据导入到 LangChain 中,进而进行进一步的处理或分析。
以下是 CSVLoader 的一些关键特性:
from langchain.document_loaders.csv_loader import CSVLoader
loader = CSVLoader(file_path='./example_data/mlb_teams_2012.csv', csv_args={
# 指定分隔符。
'delimiter': ',',
# 提供列名,在csv文件没有标题时特别有用。
'fieldnames': ['MLB Team', 'Payroll in millions', 'Wins']
})
data = loader.load()
data
文档转换器: 一旦加载了文档,您通常会希望对其进行转换,以更好地适应您的应用程序。最简单的例子是您可能希望将长文档拆分为更小的块,以适应您模型的上下文窗口。LangChain提供了许多内置的文档转换器,使得拆分、合并、过滤和其他文档操作变得容易。2-2-1、按字符进行拆分
CharacterTextSplitter : 将文本分割成单个字符或者基于字符的小块。这种类型的文本分割器对于某些特定的NLP任务非常有用,比如字符级的语言模型训练、拼写检查、语音识别等。
? 除了separator 参数起到了作用,其他参数好像没用?2-2-2、按代码分割
RecursiveCharacterTextSplitter: 允许进行多种语言的代码分割, 这个文本分割器是用于通用文本的推荐分割器。它通过一个字符列表进行参数化。它会按顺序尝试使用这些字符进行分割,直到块的大小足够小。默认的分割字符列表为:"\n\n", "\n", " ", ""
from langchain.text_splitter import (
RecursiveCharacterTextSplitter,
Language,
)
PYTHON_CODE = """
def hello_world():
print("Hello, World!")
# Call the function
hello_world()
"""
python_splitter = RecursiveCharacterTextSplitter.from_language(
language=Language.PYTHON, chunk_size=50, chunk_overlap=10
)
python_docs = python_splitter.create_documents([PYTHON_CODE])
python_docs
输出:
[Document(page_content='def hello_world():\n print("Hello, World!")'),
Document(page_content='# Call the function\nhello_world()')]
? 这里的chunk_size测试有用,chunk_overlap参数依旧没反应。
其他语言支持:
MarkdownHeaderTextSplitter 是 LangChain 库中的一个类,用于根据指定的 Markdown 标题将 Markdown 文件分割成多个部分。这个工具特别适用于需要保留文档结构的场景,例如在嵌入和向量存储之前对输入文档进行分块。
主要功能
需要拆分的内容如下:
# Foo\n\n
## Bar\n\nHi this is Jim\n\nHi this is Joe\n\n
### Boo \n\n Hi this is Lance \n\n
## Baz\n\n Hi this is Molly"
from langchain.text_splitter import MarkdownHeaderTextSplitter
markdown_document = "# Foo\n\n ## Bar\n\nHi this is Jim\n\nHi this is Joe\n\n ### Boo \n\n Hi this is Lance \n\n ## Baz\n\n Hi this is Molly"
headers_to_split_on = [
("#", "Header 1"),
("##", "Header 2"),
("###", "Header 3"),
]
markdown_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
md_header_splits = markdown_splitter.split_text(markdown_document)
for split in md_header_splits:
print(split)
输出:
page_content='Hi this is Jim
Hi this is Joe' metadata={'Header 1': 'Foo', 'Header 2': 'Bar'}
page_content='Hi this is Lance' metadata={'Header 1': 'Foo', 'Header 2': 'Bar', 'Header 3': 'Boo'}
page_content='Hi this is Molly' metadata={'Header 1': 'Foo', 'Header 2': 'Baz'}
其他分词器
文本嵌入模型: 从许多不同来源加载文档. LangChain提供了100多种不同的文档加载器,并与空间中的其他主要提供商(如AirByte和Unstructured)集成. 我们提供了加载各种类型文档(HTML、PDF、代码)的集成,2-3-1、ModelScopeEmbeddings
ModelScopeEmbeddings: ModelScope提供的词嵌入接口,这里指定使用模型"damo/nlp_corom_sentence-embedding_english-base"。
from langchain.embeddings import ModelScopeEmbeddings
model_id = "damo/nlp_corom_sentence-embedding_english-base"
embeddings = ModelScopeEmbeddings(model_id=model_id)
text = "This is a test document."
query_result = embeddings.embed_query(text)
doc_results = embeddings.embed_documents(["foo"])
输出:
HuggingFaceEmbeddings: HuggingFace提供的词嵌入模型,这里默认使用的是'sentence-transformers/all-mpnet-base-v2'。
依赖包安装:
# 需要开VPN安装
pip install sentence-transformers
# 首次需要开VPN安装模型
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings()
text = "This is a test document."
query_result = embeddings.embed_query(text)
doc_result = embeddings.embed_documents([text])
输出:
向量存储: 随着嵌入的兴起,出现了对支持这些嵌入的数据库的需求. LangChain与50多个不同的向量存储进行集成,从开源本地存储到云托管专有存储
FAISS(Facebook AI Similarity Search)是由 Meta(前 Facebook)开发的一个高效相似性搜索和密集向量聚类库。它主要用于在大规模数据集中进行向量相似性搜索,特别适用于机器学习和自然语言处理中的向量检索任务。FAISS 提供了多种索引类型和算法,可以在 CPU 和 GPU 上运行,以实现高效的向量搜索。
FAISS 的主要特性
安装:
# cpu或者是GPU版本
pip install faiss-cpu
# 或者
pip install faiss-gpu
Demo分析: 使用 LangChain 库来处理一个长文本文件,将其分割成小块,然后使用 Hugging Face 嵌入和 FAISS 向量存储来执行相似性搜索。
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.document_loaders import TextLoader
from langchain.embeddings import HuggingFaceEmbeddings
# This is a long document we can split up.
with open('./index.txt', encoding='utf-8') as f:
state_of_the_union = f.read()
text_splitter = CharacterTextSplitter(
chunk_size = 100,
chunk_overlap = 0,
)
docs = text_splitter.create_documents([state_of_the_union])
embeddings = HuggingFaceEmbeddings()
db = FAISS.from_documents(docs, embeddings)
query = "学生的表现怎么样?"
docs = db.similarity_search(query)
print(docs[0].page_content)
输出:
Notice: 查询分数,这里的分数为L2距离,因此越低越好
Demo2: 使用TextLoader加载器来加载文档。后续文档分割函数与之前内容稍有不同。
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.document_loaders import TextLoader
# 实例化文档加载器
loader = TextLoader("./index.txt", encoding='utf-8')
# 加载文档
documents = loader.load()
# 实例化文本分割器
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
# 分割文本
docs = text_splitter.split_documents(documents)
embeddings = HuggingFaceEmbeddings()
db = FAISS.from_documents(docs, embeddings)
db:代表2-4-1-3的db,已经完成文本分割以及加载embedding等操作。
# 存储
db.save_local("faiss_index")
# 加载
new_db = FAISS.load_local("faiss_index", embeddings)
Milvus Milvus 是一个开源的向量数据库,专门设计用于处理向量搜索任务,尤其是在机器学习和自然语言处理领域中常见的大规模向量搜索场景。Milvus 支持多种类型的向量,包括但不限于浮点数和二进制向量,它可以与各种深度学习和NLP模型无缝集成,以存储和检索模型生成的向量。
以下是 Milvus 的一些关键特性:
依赖包安装:
pip install pymilvus
检索器: 一旦数据在数据库中,您仍然需要检索它. LangChain支持许多不同的检索算法,并且是我们增加最多价值的地方之一. 我们支持易于入门的基本方法-即简单的语义搜索. 但是,我们还添加了一系列算法以提高性能. 这些算法包括:
解决方案:删掉anaconda下的backports文件夹,我这里的目录位置是——C:\ProgramData\anaconda3\Lib\site-packages
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。