1、LangChain基本介绍
Langchain是一个用于开发LLM应用的开源框架,它简化了LLM应用开发过程中的数据加载/处理、数据索引和Prompt等环节。
Langchain github:https://github.com/hwchase17/langchain (45.9k star,截止2023.6.8)
Langchain 文档:https://docs.langchain.com/docs/
2、LangChain主要功能
主要功能 | 具体支持 |
---|---|
LLM调用 | - 支持多种模型接口,如OpenAI、HuggingFace等, - 支持多种上下文缓存, in-mem、SQLite、Redis - 支持接口Mock(FakeLLM)、流式消息、用量管理等高级功能 |
文本索引 | - 支持多种文档加载器,本地文件、Email、YouTube等 - 支持多种文档分割器 - 支持多种向量化方式,包括OpenAI Embeding等 - 支持多种向量检索数据库,包括Chroma等 |
Prompt Engineering | - 支持Prompt模板,同时提供常用Prompt模板 - 通过Chain支持Prompt流程处理,同时提供LLMChain等常用流程 |
3、LangChain使用案例 - 个人知识库ChatBot
下面给出一个使用LangChain搭建个人知识库ChatBot的例子,主要由两部分构成:向量检索库构建和知识库ChatBot搭建
(1)向量检索库构建:利用LangChain进行文档加载、文本分割、向量计算、向量数据库生成
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.document_loaders import DirectoryLoader
# 提供OpenAI的Token,可以在https://platform.openai.com/获取
os.environ["OPENAI_API_KEY"] = "xxxx"
# 加载文件夹中的所有txt类型的文件
loader = DirectoryLoader('./data/', glob='**/*.txt')
# 将数据转成 document 对象,每个文件会作为一个 document
documents = loader.load()
# 初始化加载器
text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
# 切割加载的 document
split_docs = text_splitter.split_documents(documents)
# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
docsearch = Chroma.from_documents(split_docs, embeddings, persist_directory='./storage_chroma')
# 对向量数据库进行存储持久化
docsearch.persist()
(2)知识库ChatBot:从向量数据库检索相关信息构造Prompt,实现基于知识库内容的回答
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from langchain import OpenAI
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
import gradio as gr
# 提供OpenAI的Token,可以在https://platform.openai.com/获取
os.environ["OPENAI_API_KEY"] = "xxxxx"
# 初始化 openai 的 embeddings 对象
embeddings = OpenAIEmbeddings()
# 加载Chroma向量检索库
docsearch = Chroma(persist_directory="./storage_chroma", embedding_function=embeddings)
def query(query):
# 创建问答对象
retriever = docsearch.as_retriever()
qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff",
retriever=retriever)
# 进行问答
return qa({"query": query})
# 使用Gradio构建简单问答前端页面
iface = gr.Interface(fn=query, inputs="text", outputs="text")
iface.launch(share=True, server_name='0.0.0.0', server_port=8081)
对LangChain实现上述过程的内部细节感兴趣的,可以先参考下图(和上述代码流程有细微差异,但不影响理解),后续会再详细分析LangChain的代码实现
4、参考文档
https://python.langchain.com/en/latest/
https://github.com/liaokongVFX/LangChain-Chinese-Getting-Started-Guide
https://github.com/imClumsyPanda/langchain-ChatGLM