ChatGPT 所取得的巨大成功,使得越来越多的开发者希望利用 OpenAI 提供的 API 或私有化模型开发基于大语言模型的应用程序。然而,即使大语言模型的调用相对简单,仍需要完成大量的定制开发工作,包括 API 集成、交互逻辑、数据存储等。
为了解决这个问题,从 2022 年开始,多家机构和个人陆续推出了大量开源项目,帮助开发者快速创建基于大语言模型的端到端应用程序或流程,其中较为著名的是 LangChain 框架。
LangChain 框架是一种利用大语言模型的能力开发各种下游应用的开源框架,旨在为各种大语言模型应用提供通用接口,简化大语言模型应用的开发难度。它可以实现数据感知和环境交互,即能够使语言模型与其他数据源连接起来,并允许语言模型与其环境进行交互。本文将重点介绍 LangChain 框架的核心模块,以及使用 LangChain 框架搭建知识库问答系统的实践。
LangChain框架核心模块
使用 LangChain 框架的核心目标是连接多种大语言模型(如 ChatGPT、LLaMA 等)和外部资源(如 Google、Wikipedia、Notion 及 Wolfram 等),提供抽象组件和工具以在文本输入和输出之间进行接口处理。大语言模型和组件通过“链(Chain)”连接,使得开发人员可以快速开发原型系统和应用程序。LangChain 的主要价值体现在以下几个方面。
(1)组件化:LangChain 框架提供了用于处理大语言模型的抽象组件,以及每个抽象组件的一系列实现。这些组件具有模块化设计,易于使用,无论是否使用 LangChain 框架的其他部分,都可以方便地使用这些组件。
(2)现成的链式组装:LangChain 框架提供了一些现成的链式组装,用于完成特定的高级任务。这些现成的链式组装使得入门变得更加容易。对于更复杂的应用程序,LangChain 框架也支持自定义现有链式组装或构建新的链式组装。
(3)简化开发难度:通过提供组件化和现成的链式组装,LangChain 框架可以大大简化大语言模型应用的开发难度。开发人员可以更专注于业务逻辑,而无须花费大量时间和精力处理底层技术细节。
LangChain 提供了以下 6 种标准化、可扩展的接口,并且可以外部集成:模型输入/输出(Model I/O),与大语言模型交互的接口;数据连接(Data connection),与特定应用程序的数据进行交互的接口;链(Chain),用于复杂应用的调用序列;记忆(Memory),用于在链的多次运行之间持久化应用程序状态;智能体(Agent),语言模型作为推理器决定要执行的动作序列;回调(Callback),用于记录和流式传输任何链式组装的中间步骤。
知识库问答系统实践
大语言模型虽然可以很好地回答很多领域的各种问题,但是由于其知识是通过语言模型训练及指令微调等方式注入模型参数中的,因此针对本地知识库中的内容,大语言模型很难通过此前的方式有效地进行学习。通过 LangChain 框架,可以有效地融合本地知识库内容与大语言模型的知识问答能力。
基于 LangChain 的知识库问答系统框架如下图所示。
知识库问答系统的工作流程主要包含以下几个步骤。
(1)收集领域知识数据构造知识库,这些数据应当能够尽可能地全面覆盖问答需求。
(2)对知识库中的非结构数据进行文本提取和文本分割,得到文本块。
(3)利用嵌入向量表示模型给出文本块的嵌入表示,并利用向量数据库进行保存。
(4)根据用户输入信息的嵌入表示,通过向量数据库检索得到最相关的文本片段,将提示词模板与用户提交问题及历史消息合并输入大语言模型。
(5)将大语言模型结果返回给用户。
上述过程的代码示例如下:
from langchain.document_loaders import DirectoryLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import Chroma
from langchain.chains import ChatVectorDBChain, ConversationalRetrievalChain
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
loader = DirectoryLoader(
‘./Langchain/KnowledgeBase/’, glob=‘**/*.pdf’, show_progress=True
)
docs = loader.load()
text_splitter = CharacterTextSplitter(
chunk_size=1000,
chunk_overlap=0
)
docs_split = text_splitter.split_documents(docs)
embeddings = OpenAIEmbeddings()
vector_store = Chroma.from_documents(docs, embeddings)
retriever = vector_store.as_retriever()
{chat_history}
“”"
messages = [
SystemMessagePromptTemplate.from_template(system_template),
HumanMessagePromptTemplate.from_template(‘{question}’)
]
prompt = ChatPromptTemplate.from_messages(messages)
llm=ChatOpenAI(temperature=0.1, max_tokens=2048)
qa = ConversationalRetrievalChain.from_llm(llm,retriever,condense_question_prompt=prompt)
chat_history = []
while True:
question = input(’ 问题:')
result = qa({‘question’: question, ‘chat_history’: chat_history})
chat_history.append((question, result[‘answer’]))
print(result[‘answer’])
▊《大规模语言模型:从理论到实践》
张奇,桂韬,郑锐,黄萱菁 著
解码大语言模型奥秘,引领机器智能新时代
详细介绍构建LLM的四个主要阶段:预训练、有监督微调、奖励建模和强化学习
解读ChatGPT背后的核心技术
配全书PPT课件
为了使更多的自然语言处理研究人员和对大语言模型感兴趣的读者能够快速了解大模型的理论基础,并开展大模型实践,复旦大学张奇教授团队结合他们在自然语言处理领域的研究经验,以及分布式系统和并行计算的教学经验,在大模型实践和理论研究的过程中,历时8个月完成本书的撰写。希望这本书能够帮助读者快速入门大模型的研究和应用,并解决相关技术问题。
本书详细介绍了构建大语言模型的四个主要阶段:预训练、有监督微调、奖励建模和强化学习。每个阶段都有算法、代码、数据、难点及实践经验的详细讨论。
本书以大语言模型的基础理论开篇,探讨了大语言模型预训练数据的构建方法,以及大语言模型如何理解并服从人类指令,介绍了大语言模型的应用和评估方法,为读者提供了更全面的视野。
本书旨在为对大语言模型感兴趣的读者提供入门指南,也可作为高年级本科生和研究生自然语言处理相关课程的补充教材!
本书一经上市,便摘得京东新书日榜销售TOP1的桂冠,可想大家对本书的认可和支持!
↑限时五折优惠↑
▊《LangChain入门指南:构建高可复用、可扩展的LLM应用程序》
李特丽 康轶文 著
全面介绍LangChain技术
逐步构建自己的LLM应用程序
内容注重高可复用性和可扩展性
实用案例和示例代码助你快速上手
与社区互动,共享经验与解决难题
本书由LangChain中文网联合创始人李特丽与创始人康轶文共同编著!
本书专门为那些对自然语言处理技术感兴趣的读者提供了系统的LLM应用开发指南。全书分为11章,从LLM基础知识开始,通过LangChain这个开源框架为读者解读整个LLM应用开发流程。第1~2章概述LLM技术的发展背景和LangChain框架的设计理念。从第3章开始,分章深入介绍LangChain的6大模块,包括模型I/O、数据增强、链、记忆等,通过大量代码示例让读者了解其原理和用法。第9章通过构建PDF问答程序,帮助读者将之前学习的知识应用于实践。第10章则介绍集成,可拓宽LangChain的用途。第11章为初学者简要解析LLM的基础理论,如Transformer模型等。
本书以LangChain这个让人熟悉的框架为主线,引导读者一步一步掌握LLM应用开发流程,适合对大语言模型感兴趣的开发者、AI应用程序开发者阅读。