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进行文档加载、文本分割、向量计算、向量数据库生成

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. from langchain.embeddings.openai import OpenAIEmbeddings
  5. from langchain.vectorstores import Chroma
  6. from langchain.text_splitter import CharacterTextSplitter
  7. from langchain.document_loaders import DirectoryLoader
  8. # 提供OpenAI的Token,可以在https://platform.openai.com/获取
  9. os.environ["OPENAI_API_KEY"] = "xxxx"
  10. # 加载文件夹中的所有txt类型的文件
  11. loader = DirectoryLoader('./data/', glob='**/*.txt')
  12. # 将数据转成 document 对象,每个文件会作为一个 document
  13. documents = loader.load()
  14. # 初始化加载器
  15. text_splitter = CharacterTextSplitter(chunk_size=100, chunk_overlap=0)
  16. # 切割加载的 document
  17. split_docs = text_splitter.split_documents(documents)
  18. # 初始化 openai 的 embeddings 对象
  19. embeddings = OpenAIEmbeddings()
  20. # 将 document 通过 openai 的 embeddings 对象计算 embedding 向量信息并临时存入 Chroma 向量数据库,用于后续匹配查询
  21. docsearch = Chroma.from_documents(split_docs, embeddings, persist_directory='./storage_chroma')
  22. # 对向量数据库进行存储持久化
  23. docsearch.persist()

(2)知识库ChatBot:从向量数据库检索相关信息构造Prompt,实现基于知识库内容的回答

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os
  4. from langchain import OpenAI
  5. from langchain.embeddings.openai import OpenAIEmbeddings
  6. from langchain.vectorstores import Chroma
  7. from langchain.chains import RetrievalQA
  8. import gradio as gr
  9. # 提供OpenAI的Token,可以在https://platform.openai.com/获取
  10. os.environ["OPENAI_API_KEY"] = "xxxxx"
  11. # 初始化 openai 的 embeddings 对象
  12. embeddings = OpenAIEmbeddings()
  13. # 加载Chroma向量检索库
  14. docsearch = Chroma(persist_directory="./storage_chroma", embedding_function=embeddings)
  15. def query(query):
  16. # 创建问答对象
  17. retriever = docsearch.as_retriever()
  18. qa = RetrievalQA.from_chain_type(llm=OpenAI(), chain_type="stuff",
  19. retriever=retriever)
  20. # 进行问答
  21. return qa({"query": query})
  22. # 使用Gradio构建简单问答前端页面
  23. iface = gr.Interface(fn=query, inputs="text", outputs="text")
  24. iface.launch(share=True, server_name='0.0.0.0', server_port=8081)

对LangChain实现上述过程的内部细节感兴趣的,可以先参考下图(和上述代码流程有细微差异,但不影响理解),后续会再详细分析LangChain的代码实现
来自https://github.com/imClumsyPanda/langchain-ChatGLM

4、参考文档

https://python.langchain.com/en/latest/
https://github.com/liaokongVFX/LangChain-Chinese-Getting-Started-Guide
https://github.com/imClumsyPanda/langchain-ChatGLM