第二章 LangChain入门指南
文章目录
第二章 LangChain入门指南 前言 一、主要内容 1、初识LangChain 1.1 为什么需要LangChain 1.2 LLM应用开发的最后1公里 1.3 LangChain的2个关键词 1.4 LangChain的3个场景 1.5 LangChain的6个模块 2、LangChain的开发流程 2.1 开发秘钥指南 2.2 编写一个取名程序 2.3 创建你的第一个聊天机器人 3、 LangChain表达式 二、总结前言
前面一章我们了解了LangChain和一些大语言模型的基础知识。接下来我们继续跟随《LangChain入门指南》深入的了解LangChain的体系架构以及具体的应用场景,并且尝试使用LangChain构建第一个基于大语言模型的应用。
文章的结尾提供了一个基于LangChain开发的AIGC知识库平台,可以免费使用,有任何疑问欢迎提出。
一、主要内容
1、初识LangChain
1.1 为什么需要LangChain
我们在开发一款LLM的应用时,需要集成各种各样的大语言模型和一些基础的模块,在集成时需要对每个模型和模块进行了解,工作量很大。而LangChain就是一个集成框架,处理的就是一系列组件和工具的集成。并且它在开发者社区有着有高的关注度。
1.2 LLM应用开发的最后1公里
LangChain为LLM应用的开发者提供了很大的便利,包括模型的接口,常用的组件和大量常用的提示词。为那些准备进入LLM应用开发领域的人铺平了最后一公里的道路。
1.3 LangChain的2个关键词
LangChain有两个关键词,同时也是LangChain的核心,分别是”组件“和”链“。组件可以理解为一整条完整的流水线上的工作站,每个组件有各自的功能各司其职,而链就可以理解为把所有使用到的工作站串联起来的链条。
1) 组件。
我们在开发一个大语言模型应用时有很多的工作流程,每一项工作都有一个单元来负责完成,例如:数据加载、与大语言模型沟通、构建提示词等等工作都需要实例化LangChain提供的一些类来完成,这些类就称为组件。
2) 链。
当我们使用LangChain实例化了很多的组件之后,发现单个组件并不能完成一整个复杂的任务,需要有多个组件结合。这时链就是来充当将所有需要的组件根据顺序串联起来的角色,使得整个程序像流水线一样按照预设路径顺序执行。
1.4 LangChain的3个场景
LangChain有三个比较典型的应用场景。
1) 问答系统。LangChain可以轻松的与外部数据源进行交互,迅速提取关键信息,然后生成准确的回答。
2) 数据处理与管理。LangChin可以将每一个数据处理的流程都标准化,包括加载、分割、存储、检索。
3) 自动问答机器人。开发者可以使用LangChain构建实时响应用户查询的客服机器人。
1.5 LangChain的6个模块
LangChain是由6个模块组成。
1) 模型I/O。模块主要用于与大语言模型进行交互,并且其中已经包装好了很多与市面上大多数模型交互的类。
2) 数据增强。模块主要是对外部数据处理的一整套流程。
3) 链。模块主要用于将所有的组件组合起来形成一条完整的业务线。
4) 记忆。模块一用于存储对话期间的对话内容,使得大语言模型具有记忆能力。
5) Agent。模块是为AGI的基础,他使用LLM来完成思考然后根据思考的结果执行操作。
6) 回调处理器。模块是LangChain提供的一个回调系统,允许开发者在LLM应用的各个阶段进行干预。
2、LangChain的开发流程
2.1 开发秘钥指南
我们在开发大语言模型应用程序时,需要调用大语言模型的接口,而接口往往需要一个秘钥要验证我们的身份。当我们从平台拿到秘钥之后,常用的有三种方法使用秘钥。
1、直接把秘钥硬编码到代码中。
2、把秘钥放入环境变量中,使用时获取。
3、通过第三方模块在使用秘钥时由用户输入秘钥。
2.2 编写一个取名程序
我们尝试调用大语言模型完成第一个应用的开发,功能就是帮助公司起一个名字。
由于书上的LangChain版本和当前LangChain的版本存在差异,所以在模块应用和方法调用上有一些细微的区别,我们按照当前最新的版本来完成程序的编写,模型包装类与书上相同使用openai。使用openai需要配置自己的API秘钥openai_api_key和openai的地址openai_api_base。
引入LangChain模块和openai模块。
pip3 install langchain,openai,langchain-openai
编写取名程序
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(openai_api_base=config.openai_api_base, openai_api_key=config.openai_api_key, model_name=config.model_name)
print(llm.invoke("我有一个人工智能的公司,帮我起一个好听又好记的名字"))
2.3 创建你的第一个聊天机器人
在完成第一个demo的发开之后,我们将完成一个完整的程序:聊天机器人。深入体验LangChain的6大核心模块。
环境配置和秘钥设置
from langchain_openai import ChatOpenAI
from langchain_core.messages import (
AIMessage,
HumanMessage,
SystemMessage
)
llm = ChatOpenAI(openai_api_base=config.openai_api_base, openai_api_key=config.openai_api_key,
model_name=config.model_name)
print(llm.invoke([HumanMessage(content="请帮我将中文翻译成英语。 我爱你")]))
提示词模版
from langchain_core.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate
)
template = "你是一个厉害的助手,你能把{input_language}翻译成{output_language}。"
sys_prompt = SystemMessagePromptTemplate.from_template(template)
human_prompt = HumanMessagePromptTemplate.from_template("{text}")
chat_prompt = ChatPromptTemplate.from_messages([
sys_prompt,
human_prompt
])
chat_prompt = chat_prompt.format_messages(
input_language="中文",
output_language="英语",
text="我爱你"
)
print(chat_prompt)
创建第一个链
from langchain.chains import LLMChain
from langchain_openai import ChatOpenAI
from langchain_core.prompts import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
SystemMessagePromptTemplate
)
template = "你是一个厉害的助手,你能把{input_language}翻译成{output_language}。"
sys_prompt = SystemMessagePromptTemplate.from_template(template)
human_prompt = HumanMessagePromptTemplate.from_template("{text}")
chat_prompt = ChatPromptTemplate.from_messages([
sys_prompt,
human_prompt
])
llm = ChatOpenAI(openai_api_base=config.openai_api_base, openai_api_key=config.openai_api_key,
model_name=config.model_name)
chain = LLMChain(llm=llm, prompt=chat_prompt)
print(chain.invoke({"input_language": "中文", "output_language": "英语", "text": "我爱你"}))
Agent
Agent需要搜索互联网数据,要安装Serpapi来进行谷歌搜索。pip3 install google-search-results
import os
from langchain.agents import load_tools, AgentType, initialize_agent
from langchain_openai import ChatOpenAI, OpenAI
os.environ['SERPAPI_API_KEY'] = '你的KEY'
chat = ChatOpenAI(openai_api_base=config.openai_api_base, openai_api_key=config.openai_api_key,
model_name=config.model_name)
llm = OpenAI(openai_api_base=config.openai_api_base, openai_api_key=config.openai_api_key,
model_name=config.model_name)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent_executor = initialize_agent(tools, chat, agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent_executor.invoke({"input": "今天昆明会下大雨吗"})
记忆组件
from langchain.chains.constitutional_ai.base import ConstitutionalChain, ConstitutionalPrinciple
from langchain.chains.llm import LLMChain
from langchain_core.prompts import (
ChatPromptTemplate,
HumanMessagePromptTemplate,
SystemMessagePromptTemplate,
MessagesPlaceholder
)
from langchain.memory import ConversationBufferMemory
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_messages([
SystemMessagePromptTemplate.from_template("你是一个强大的人工智能助手。"),
MessagesPlaceholder(variable_name="history"),
HumanMessagePromptTemplate.from_template("{input}")
])
chat = ChatOpenAI(model_name=config.model_name, openai_api_key=config.openai_api_key,
openai_api_base=config.openai_api_base)
memory = ConversationBufferMemory(return_messages=True)
qa_chain = LLMChain(prompt=prompt, llm=chat)
chain = ConstitutionalChain.from_llm(
llm=chat,
chain=qa_chain,
memory=memory,
constitutional_principles=[
ConstitutionalPrinciple(
critique_request="Tell if this answer is good.",
revision_request="Give a better answer.",
)
]
)
print(chain.invoke({"input": "你好,我是DoubleZ"}))
3、 LangChain表达式
LangChain表达式是组合各个组件的一种简洁的表达方式,它使得开发者可以像说话一样的编写代码,完成应用程序的开发。
提示词模版+模型包装器
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话")
chat = ChatOpenAI(model_name=config.model_name, openai_api_key=config.openai_api_key,
openai_api_base=config.openai_api_base)
chain = prompt | chat
print(chain.invoke({"topic": "狗"}))
提示词模版+模型包装器+输出解释器
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
prompt = ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话")
chat = ChatOpenAI(model_name=config.model_name, openai_api_key=config.openai_api_key,
openai_api_base=config.openai_api_base)
chain = prompt | chat | StrOutputParser()
print(chain.invoke({"topic": "熊"}))
多功能组合链
from operator import itemgetter
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
chat = ChatOpenAI(model_name=config.model_name, openai_api_key=config.openai_api_key,
openai_api_base=config.openai_api_base)
prompt1 = ChatPromptTemplate.from_template("{person}来自哪个城市")
prompt2 = ChatPromptTemplate.from_template("{city}这个城市属于哪个国家?用{language}回复我")
chain1 = prompt1 | chat | StrOutputParser()
chain2 = (
{"city": chain1, "language": itemgetter("language")}
| prompt2
| chat
| StrOutputParser()
)
print(chain2.invoke({"person": "奥巴马", "language": "英语"}))
二、总结
这一章主要介绍了LangChain的基础知识,两个关键词、六个主要的模块以及三个比较典型的应用场景。
从整体来看,链和组件是LangChain中最为关键的两个概念,一切皆是组件,所有组件都有链来串联执行。
从模块的角度来看,整个LangChain框架分为六大组件,核心为模型I/O组件,所有的任务都必须交由模型I/O组件来决策驱动,可以理解为模型I/O是大脑,其他的组件为四肢或其他器官,用于执行大脑的决策。
最后介绍了一下基于LangChain开发的流程,如何完成一个基础的基于大语言模型的应用程序和如何使用LangChain表达式来完成程序的便捷开发。
基于LangChin开发的AIGC知识库:免费使用