当前位置:AIGC资讯 > AIGC > 正文

【AIGC】LangChain入门指南—第二章 LangChain入门指南

第二章 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知识库:免费使用

更新时间 2024-07-06