LangChain入门指南-大预言模型应用驱动框架

前言

首先需要安装LangChain:

使用LangChain需要与一个或多个模型提供程序、数据存储、API集成。

pip install langchain
# or
conda install langchain -c conda-forge

然后我们需要在终端设置环境变量

export OPENAI_API_KEY="..."

一、提示模版(PromptTemplate)

通常在应用程序中使用 LLM 时,不会将用户输入直接发送到 LLM。相反,您可能接受用户输入并构造一个提示符,然后将其发送给 LLM。使用LangChain,这个事情变得很简单。

定义提示模版:

from langchain.prompts import PromptTemplate
 
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)
#调用.format 方法完成格式化
print(prompt.format(product="colorful socks"))
#输出为:What is a good name for a company that makes colorful socks?

二、链:在多步骤的工作流中组合LLM和提示(prompt)

真正的程序是PromptTemplate和LLM的组合。在LangChain中,链是由链组成的,可以是LLM这样的原始链,也可以是其他链。最核心的链类型是LLMChain,它由 PromptTemplate 和 LLM 组成。

它接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化后的响应传递给LLM:

from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
 
llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
    input_variables=["product"],
    template="What is a good name for a company that makes {product}?",
)

#现在我们可以创建一个非常简单的链,它接受用户的输入,用它格式化提示符,然后将它发送到LLM:
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)

#运行
chain.run("colorful socks")
# -> '\n\nSocktastic!'

这是比较简单的链类型之一。

三、代理Agent:基于用户输入的动态调用链

到目前为止,我们看到的链运行在一个预先确定的顺序。

但是代理不再这样做: 它们使用 LLM 来确定要执行哪些操作以及按照什么顺序执行。

操作可以使用工具并观察其输出,也可以返回给用户。

如果使用得当,效果可以非常强大。

在本教程中,我们将向您展示如何通过最简单、最高级别的 API 轻松使用代理。

为了运好代理,您应该理解以下概念:

  • 工具(tools): 执行特定任务的功能。这可以是: Google 搜索、数据库查找、 Python REPL、其他链。工具的接口目前是一个函数,预计将有一个字符串作为输入,一个字符串作为输出。
  • 大语言模型(LLM): 为代理提供动力的语言模型。
  • 代理(agents): 要使用的代理。这应该是引用支持代理类的字符串。因为本教程主要关注最简单、最高级别的 API,所以它只涉及使用标准支持的代理。如果要实现自定义代理,请参阅自定义代理的文档(即将发布)。
#需要安装第三方包
#pip install google-search-results

#设置环境变量
import os
os.environ["SERPAPI_API_KEY"] = "..."

from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
 
llm = OpenAI(temperature=0)
 
tools = load_tools(["serpapi", "llm-math"], llm=llm)
 
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
 
agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")

四、内存:向链和代理添加状态

到目前为止,我们经历过的所有工具和代理都是无状态的的。但是通常,您可能希望链或代理具有某种“内存”概念,以便它可以记住关于其以前的交互的信息。最简单明了的例子就是在设计一个聊天机器人时——你想让它记住之前的消息,这样它就可以利用这些消息的上下文来进行更好的对话。

这是一种“短期记忆”。在更复杂的一面,你可以想象一个链条/代理随着时间的推移记住关键信息——这将是一种形式的“长期记忆”。

LangChain 提供了几个专门为此目的创建的链。 本教程使用其中一个链(ConversationChain)和两种不同类型的内存来完成操作。默认情况下,ConversationChain有一个简单的内存类型,它记住所有的输入和输出,并将他们添加到传递的上下文中。

让我们看一下如何使用这个链(设置 verbose=True,这样我们就可以看到提示符)。

from langchain import OpenAI, ConversationChain
llm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True)
output = conversation.predict(input="Hi there!")
print(output)

output = conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
print(output)

五、构建语言模型应用程序:聊天模型

从聊天模型获取消息完成:

您可以通过向聊天模型传递一条或多条消息来完成聊天。

响应将是一条消息。

LangChain 中当前支持的消息类型是 AIMessage , HumanMessage , SystemMessage , 和 ChatMessage – ChatMessage 接受任意角色参数。大多数时候,您只需要处理 HumanMessage , AIMessage , 和 SystemMessage .

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)
chat = ChatOpenAI(temperature=0)

chat([HumanMessage(content="Translate this sentence from English to French. I love programming.")])
# -> AIMessage(content="J'aime programmer.", additional_kwargs={})

您还可以为 OpenAI 的 gpt-3.5-turbo 和 gpt-4型号传递多条消息。

messages = [
    SystemMessage(content="You are a helpful assistant that translates English to French."),
    HumanMessage(content="Translate this sentence from English to French. I love programming.")
]
chat(messages)
# -> AIMessage(content="J'aime programmer.", additional_kwargs={})

更进一步,使用generate为多组消息完成生成。这将返回一个带有附加message参数的LLMResult。

batch_messages = [
    [
        SystemMessage(content="You are a helpful assistant that translates English to French."),
        HumanMessage(content="Translate this sentence from English to French. I love programming.")
    ],
    [
        SystemMessage(content="You are a helpful assistant that translates English to French."),
        HumanMessage(content="Translate this sentence from English to French. I love artificial intelligence.")
    ],
]
result = chat.generate(batch_messages)
 
#查看token
result.llm_output['token_usage']
# -> {'prompt_tokens': 71, 'completion_tokens': 18, 'total_tokens': 89}
 

后续其他内容会不定时发布,谢谢大家!

  • 18
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值