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 osfrom langchain.embeddings.openai import OpenAIEmbeddingsfrom langchain.vectorstores import Chromafrom langchain.text_splitter import CharacterTextSplitterfrom langchain.document_loaders import DirectoryLoader# 提供OpenAI的Token,可以在https://platform.openai.com/获取os.environ["OPENAI_API_KEY"] = "xxxx"# 加载文件夹中的所有txt类型的文件loader = DirectoryLoader('./data/', glob='**/*.txt')# 将数据转成 document 对象,每个文件会作为一个 documentdocuments = loader.load()# 初始化加载器text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)# 切割加载的 documentsplit_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 osfrom langchain import OpenAIfrom langchain.embeddings.openai import OpenAIEmbeddingsfrom langchain.vectorstores import Chromafrom langchain.chains import RetrievalQAimport 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
