当前位置:   article > 正文

【AIGC】LangChain入门指南—第二章 LangChain入门指南_langchain的工作流程

langchain的工作流程

第二章 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("我有一个人工智能的公司,帮我起一个好听又好记的名字"))
  • 1
  • 2
  • 3
  • 4
  • 5

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="请帮我将中文翻译成英语。 我爱你")]))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

提示词模版

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

创建第一个链

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": "我爱你"}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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": "今天昆明会下大雨吗"})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

记忆组件

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"}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

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": "狗"}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

提示词模版+模型包装器+输出解释器

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": "熊"}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

多功能组合链

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": "英语"}))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

二、总结

这一章主要介绍了LangChain的基础知识,两个关键词、六个主要的模块以及三个比较典型的应用场景。

从整体来看,链和组件是LangChain中最为关键的两个概念,一切皆是组件,所有组件都有链来串联执行。

从模块的角度来看,整个LangChain框架分为六大组件,核心为模型I/O组件,所有的任务都必须交由模型I/O组件来决策驱动,可以理解为模型I/O是大脑,其他的组件为四肢或其他器官,用于执行大脑的决策。

最后介绍了一下基于LangChain开发的流程,如何完成一个基础的基于大语言模型的应用程序和如何使用LangChain表达式来完成程序的便捷开发。

基于LangChin开发的AIGC知识库:免费使用

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号