1,介绍
LangChain是一个用于开发由大语言模型支持的应用程序的框架。它提供了大量组件来帮助我们构建LLM支持的应用程序。
其主要是有六大功能组成。
LLMs(大语言模型(生成式语言模型)),Prompts(提示词),Memory(记忆力),chains,Document Loaders(各种格式文件的加载器),Vector Stores(向量的存储)
LLMs
LLMs,即大型语言模型,是具有数十亿个参数的强大深度学习模型,在各种自然语言处理任务中表现出色。它们可以执行诸如翻译、情感分析和聊天机器人对话等任务,而无需进行特定训练。LLMs由多个神经网络层组成,包括前馈、嵌入和注意力层,共同处理输入文本并生成预测。 虽然LLMs有改变行业的潜力,但应考虑它们的限制和伦理影响。开发人员应优化这些模型,以最大程度地减少偏见并增强其实用性。LLMs可以处理的最大标记数取决于具体的实现。在LangChain中,最大标记数由所使用的底层OpenAI模型确定。为了处理超过标记限制的输入文本,可以将其拆分为较小的块并单独处理,然后再将结果组合起来。
Prompts
是在使用大型语言模型时必须掌握的关键方面。通过精心设计适当的提示,即使使用较弱或开源模型,也可以达到可比较的准确性水平。
角色提示(Role prompting)涉及指示LLM在执行任务时扮演特定的角色或身份。例如,可以要求它扮演一个文案撰稿人的角色。这种方法通过提供上下文或观点来引导模型的回应。为了有效地利用角色提示,可以按照以下迭代步骤进行操作:
1.在提示中明确指定所需的角色,例如:“作为一个文案撰稿人,为AWS服务生成引人注目的口号。”
2.利用提示从LLM生成输出。
3.分析生成的回应,并根据需要改进提示以提升结果的质量。
Memory
第三个重要功能模块就是Memory,实现记忆历史对话内容。大多数LLM应用都具有对话界面。对话的一个重要组成部分是能够引用先前在对话中介绍过的信息。至少,一个对话系统应该能够直接访问一些过去消息的窗口。更复杂的系统将需要拥有一个不断更新的世界模型,使其能够保持关于实体及其关系的信息。大模型本身是概率模型,基于前置条件,即输入和分布,即可得出对应输出。但是整个流程是一次性的,对于初始的且没有经过任何处理的大模型,是不具备记忆存储功能,这个功能模块是需要应用开发者进行开发的。
Chains
处理业务流
Chain 作为 LangChain 的核心模块之一,重要性不言而喻,它相当于是所有复杂逻辑的基础,用来将每个零散的逻辑串联成一整个业务流程,Chain 的设计非常巧妙,可以说是大模型应用的最佳实践之一。
Chains主要包含以下几个模块,接下来的实践演练,会分别演示这几个模块的使用。
Document loader
Document loader(文档加载器),使用文档加载器将数据从数据源加载为 Document 对象的数据。
Document 是 LangChain 提供的一个类,包含一段文本和与文本关联的元数据。我们读取数据后就会转换成 Document 对象。
例如,有一些文档加载器用于加载简单的 .txt 文件、加载任何网页的文本内容,甚至用于加载 YouTube 视频。文档加载器提供了“ load ”方法,用于从配置的源加载数据,转换为 Document。它们还可以选择实现“延迟加载”,以便将数据延迟加载到内存中。
基于 LLM 的应用程序经常需要从数据库或文件(如 PDF)中提取数据,并将其转换为 LLM 可以使用的格式。在LangChain中,这通常涉及创建 Document 对象,这些对象封装了提取的文本(page_content)以及元数据(metadata 包含文档详细信息的字典),例如作者姓名或出版日期。
Document 对象通常被格式化为提示,这些提示被输入到 LLM 中,允许 LLM 使用 Document 中的信息来生成所需的响应(例如,总结文档)。Documents 既可以立即使用,也可以索引到向量存储中,以备将来检索和使用。
Vector Stores
Vector Stores在LangChain框架中是连接语言模型与实际应用数据的关键桥梁,为构建智能化、高效的语言处理应用提供了强大的基础设施支持。
理解向量存储前需了解向量嵌入(Embeddings)。文本向量化是将文本转换成数值向量的过程,这些向量能够在多维空间中捕捉词语或文档之间的语义相似性。常见的嵌入模型如Word2Vec、BERT、Sentence Transformers等,可以被用来生成这样的向量。
Vector Stores 的用途
高效检索:Vector Stores主要用于存储这些嵌入向量,并支持高效的相似性搜索,使得用户能够根据输入的查询(也是一个向量)快速找到最相关的文档、段落或信息。
语义搜索:由于向量能够表达语义关系,Vector Stores使得基于内容而非关键词的搜索成为可能,大大提高了搜索的准确性和相关性。
Vector Stores 实现方式
LangChain支持多种向量存储后端,包括但不限于:
FAISS:Facebook AI Similarity Search,一个高效的相似性搜索库,特别适合大规模的向量数据集。
Pinecone、Qdrant:云原生的向量数据库服务,提供了API接口,便于管理和检索向量数据。(这里插一嘴,我们项目用的就是 Qdrant,好用就完事了~😊)
Weaviate:一个语义搜索引擎,支持向量搜索和知识图谱管理。
Chroma:一个开源的向量数据库,专为机器学习和NLP应用设计。
Vector Stores 功能特性
索引构建:可以为文档集合创建索引,这个过程涉及将文档转换为向量并存储起来,以便后续快速检索。
更新与删除:支持对向量数据的动态管理,包括源文档更新时的向量重计算以及删除不再需要的向量。
检索优化:通过近似最近邻(Approximate Nearest Neighbor, ANN)算法,在保证较高精度的同时,实现了对大规模数据集的高效检索。
Vector Stores 应用场景
问答系统:快速从大量文档中找到与问题最相关的答案。
个性化推荐:基于用户历史行为和偏好生成的向量,来推荐相似或相关的内容。
知识图谱增强:结合向量搜索提高知识图谱节点间链接的发现和查询效率。
文档检索系统:企业内部文档、网页内容的快速语义搜索。
2,实例
import os.path
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_community.embeddings.huggingface import HuggingFaceEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.chat_models import QianfanChatEndpoint
def load_documents():
# 读取文本数据
loader = TextLoader("./book/xiyouji.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=10000,
chunk_overlap=10,
length_function=len,
is_separator_regex=False,
)
texts = text_splitter.split_documents(documents)
print("========---"+texts[99].page_content)
return texts;
def load_embedding_mode(model_names="ernie-tiny"):
return HuggingFaceEmbeddings(model_name='text2vec-base-chinese',
model_kwargs={'device': 'cpu'})
def store_chrome(docs,embeddings):
# 使用FAISS模块将文档转换为向量,并将向量存储到vector_store_local对象中。然后将向量存储保存到本地。
vector_store = FAISS.from_documents(docs, embeddings)
vector_store.save_local('vector_store_local')
return vector_store
embeddings = load_embedding_mode('text2vec3')
chatBot = QianfanChatEndpoint(
streaming=True,
model="ERNIE-Bot",
)
if not os.path.exists('vector_store_local'):
documents = load_documents()
db = store_chrome(documents, embeddings)
else:
new_db = FAISS.load_local("vector_store_local", embeddings)
docs = new_db.similarity_search("唐僧是谁的师傅")
print("结果:"+docs[0].page_content)