无限可能LangChain——构建一个简单的LLM应用程序
2024/7/15 21:03:36
本文主要是介绍无限可能LangChain——构建一个简单的LLM应用程序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
在本快速入门中,我们将向您展示如何构建一个简单的LLM应用程序。该应用程序将文本从英语翻译成另一种语言。这是一个相对简单的LLM应用程序——它只是一个LLM调用加上一些提示。尽管如此,这仍然是开始使用LangChain的好方法——只需一些提示和一个LLM调用,就可以构建许多功能!
概念
我们将涵盖的概念是:
- 使用语言模型
- 使用PromptTemplates和OutputParsers
- 使用LangChain链接PromptTemplate + LLM + OutputParser
- 使用LangSmith调试和跟踪您的应用程序
- 使用LangServe部署您的应用程序
这是一些需要涵盖的内容!让我们开始吧。
目标
在本文档中,我们将构建一个应用程序,实现:利用大语言模型,将用户输入从一种语言翻译成另一种语言。
环境设置
Jupyter Notebook
本指南(以及留档中的大多数其他指南)使用 Jupyter 笔记本 。Jupyter笔记本非常适合学习如何使用LLM系统,因为经常会出错(意外输出、API关闭等),在交互式环境中浏览指南是更好地理解它们的好方法。
安装 LangChain
要安装LangChain,请运行:
pip install langchain
有关更多详细信息,请参阅我们的安装指南。
LangSmith
我们使用 LangChain 构建的许多应用程序都包含多个步骤和多次调用LLM调用。随着这些应用程序变得越来越复杂,能够检查链或代理内部发生的情况变得至关重要。最好的方法是使用 LangSmith。
注册 LangSmith
LangSmith 在链接上注册后,请确保设置您的环境变量以开始记录跟踪:
export LANGCHAIN_TRACING_V2="true" export LANGCHAIN_API_KEY="..."
或者,如果在笔记本中,您可以使用以下方式设置它们:
import getpass import os os.environ["LANGCHAIN_TRACING_V2"] = "true" os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
创建API密钥
要创建 设置页面 的API密钥头。然后单击创建API密钥。
安装 LangSmith 依赖
pip install -U langsmith
至此,我们的初步准备工作已完成。
LangServe
LangServe 帮助开发者部署 LangChain 可运行文件和链作为 REST API。
安装 LangServe
安装客户端和服务器:
pip install "langserve[all]"
或者只安装客户端:
pip install "langserve[client]"
只安装服务器
pip install "langserve[server]"
先介绍到这,下面会讲解如何部署和调用我们的 LangChain 程序。
选择大语言模型
首先,让我们学习如何单独使用语言模型。LangChain 支持许多不同的语言模型,您可以选择想要使用的模型!
选择 openai
pip install -qU langchain-openai
import getpass import os os.environ["OPENAI_API_KEY"] = getpass.getpass() from langchain_openai import ChatOpenAI model = ChatOpenAI(model="gpt-4")
选择 gemini
pip install -qU langchain-google-vertexai
import getpass import os os.environ["GOOGLE_API_KEY"] = getpass.getpass() from langchain_google_vertexai import ChatVertexAI model = ChatVertexAI(model="gemini-pro")
选择通义千问
如何拿到阿里云灵积模型服务的 apikey ?
链接:阿里云开发者社区-云计算社区-阿里云 (aliyun.com)
- 登录或者注册:点击右上角进行注册账号,有账号的可以直接登录
- 搜索灵积模型服务,开通服务
- 进入产品控制台,创建api-key,api-key要好好保存,如果不慎遗失了,可以在查看这个key
- 设置 API-KEY
export DASHSCOPE_API_KEY="你的apikey"
然后让我们直接使用模型。ChatModel 是 LangChain“Runnables”的实例,这意味着它们公开了一个与它们交互的标准接口。要简单地调用模型,我们可以将消息列表传递给 .invoke 方法。
from langchain_community.llms import Tongyi from langchain_core.messages import HumanMessage, SystemMessage # 使用 Tongyi LLM,并设置温度为 1,代表模型会更加随机,但也会更加不确定 llm = Tongyi(temperature=1) # 创建一个系统消息,并将它添加到消息列表中 # 系统消息用于指定模型应该如何理解用户输入 messages = [ SystemMessage(content="将以下内容从英文翻译成中文:"), HumanMessage(content="hi!"), ] # 运行 result = llm.invoke(messages) # 打印结果 print(result)
API参考:HumanMessage | SystemMessage
输出打印结果:
如果我们启用了LangSmith,我们可以看到此运行已记录到 LangSmith,并可以查看LangSmith的跟踪。
运行记录
OutputParsers
请注意,来自模型的响应是一个 AIMessage 。这包含一个字符串响应以及关于响应的其他元数据。通常我们可能只想使用字符串响应。我们可以使用简单的输出解析器解析出这个响应。
我们首先导入简单的输出解析器。
from langchain_core.output_parsers import StrOutputParser parser = StrOutputParser()
API参考:StrOutputParser
使用它的一种方法是单独使用它。例如,我们可以保存语言模型调用的结果,然后将其传递给解析器。
result = model.invoke(messages) parser.invoke(result)
完整代码:
from langchain_community.llms import Tongyi from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser # 使用 Tongyi LLM,并设置温度为 1,代表模型会更加随机,但也会更加不确定 llm = Tongyi(temperature=1) # 创建一个系统消息,并将它添加到消息列表中 # 系统消息用于指定模型应该如何理解用户输入 messages = [ SystemMessage(content="将以下内容从英文翻译成中文:"), HumanMessage(content="hi!"), ] # 创建一个输出解析器,用于解析模型输出的文本 parser = StrOutputParser() # 运行 result = llm.invoke(messages) # 使用输出解析器解析模型输出的文本 parserResult = parser.invoke(result) # 打印结果 print(parserResult)
LangSmith 跟踪记录:
创建链运行
更常见的是,我们可以用这个输出解析器“链接”模型。这意味着在这个链中每次都会调用这个输出解析器。这个链接受语言模型的输入类型(字符串或消息列表),并返回输出解析器的输出类型(字符串)。
我们可以使用 | 运算符轻松创建链。| 运算符在 LangChain 中用于将两个元素组合在一起。
chain = model | parser chain.invoke(messages)
完整代码:
from langchain_community.llms import Tongyi from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser # 使用 Tongyi LLM,并设置温度为 1,代表模型会更加随机,但也会更加不确定 llm = Tongyi(temperature=1) # 创建一个系统消息,并将它添加到消息列表中 # 系统消息用于指定模型应该如何理解用户输入 messages = [ SystemMessage(content="将以下内容从英文翻译成中文:"), HumanMessage(content="hi!"), ] # 创建一个输出解析器,用于解析模型输出的文本 parser = StrOutputParser() # 将 LLM 和输出解析器连接起来,轻松创建链 chain = llm | parser # 运行 result = chain.invoke(messages) # 打印结果 print(result)
如果我们现在看看 LangSmith,我们可以看到链有两个步骤:首先调用语言模型,然后将结果传递给输出解析器。我们可以看到 LangSmith 跟踪记录。
RunnableSequence 日志
StrOutputParser 日志
Prompt Templates
现在我们正在将消息列表直接传递到语言模型中。这个消息列表来自哪里?
通常它是由用户输入和应用程序逻辑的组合构成的。这个应用程序逻辑通常接受原始用户输入,并将其转换为准备传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。
PromptTemplate 是 LangChain 中的一个概念,旨在帮助实现这种转换。它们接受原始用户输入并返回准备传递到语言模型的数据(提示)。
让我们在这里创建一个PromptTemplate。它将接受两个用户变量:
- language: 将文本翻译成的语言
- text: 要翻译的文本
from langchain_core.prompts import ChatPromptTemplate
API参考 : ChatPromptTemplate
首先,让我们创建一个字符串,我们将其格式化为系统消息:
system_template = "将以下内容翻译成{language}:"
接下来,我们可以创建 PromptTemplate。这是 system_template 以及一个更简单的模板,用于放置文本
prompt_template = ChatPromptTemplate.from_messages( [("system", system_template), ("user", "{text}")] )
这个提示模板的输入是字典。我们可以自己玩这个提示模板,看看它自己做了什么
result = prompt_template.invoke({"language": "italian", "text": "hi"})
我们可以看到它返回一个 ChatPromptValue 由两条消息组成。如果我们想直接访问消息,我们会这样做:
result.to_messages()
我们现在可以将其与上面的模型和输出解析器结合起来。这将把所有三个组件链接在一起。
chain = prompt_template | model | parser chain.invoke({"language": "italian", "text": "hi"})
完整代码:
from langchain_community.llms import Tongyi from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate # 使用 Tongyi LLM,并设置温度为 1,代表模型会更加随机,但也会更加不确定 llm = Tongyi(temperature=1) system_template = "将以下内容从英文翻译成{language}:" prompt_template = ChatPromptTemplate.from_messages( [("system", system_template), ("user", "{text}")] ) # 创建一个输出解析器,用于解析模型输出的文本 parser = StrOutputParser() # 将 LLM 和输出解析器连接起来,轻松创建链 chain = prompt_template | llm | parser # 运行 result = chain.invoke({"language": "chinese", "text": "hi"}) # 打印结果 print(result)
如果我们查看 LangSmith 跟踪,我们可以看到所有三个组件都显示在 LangSmith 跟踪中。
运行日志
LangServe 部署示例
这是一个部署OpenAI聊天模型的服务器,实现文字翻译的应用。
#!/usr/bin/env python from fastapi import FastAPI from langchain.prompts import ChatPromptTemplate from langchain.chat_models import ChatAnthropic, ChatOpenAI from langserve import add_routes from langchain_community.llms import Tongyi from langchain_core.messages import HumanMessage, SystemMessage from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from fastapi.middleware.cors import CORSMiddleware # 使用 Tongyi LLM,并设置温度为 1,代表模型会更加随机,但也会更加不确定 llm = Tongyi(temperature=1) # 提示模版 system_template = "将以下内容从英文翻译成{language}:" prompt_template = ChatPromptTemplate.from_messages( [("system", system_template), ("user", "{text}")] ) # 创建一个输出解析器,用于解析模型输出的文本 parser = StrOutputParser() # 创建应用 app = FastAPI( title="LangChain Server", version="1.0", description="使用 Langchain 的 Runnable 接口的简单 api 服务器", ) # 设置所有启用 CORS 的源 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], expose_headers=["*"], ) # 添加路由 add_routes( app, prompt_template | llm | parser, path="/trans", ) if __name__ == "__main__": import uvicorn uvicorn.run(app, host="localhost", port=8000)
上面的 api 服务启动之后,可以使用 curl 调用,查看返回结果。
curl --location --request POST 'http://localhost:8000/trans/invoke' \ --header 'Content-Type: application/json' \ --data-raw '{ "input": { "language": "chinese", "text": "hi" } }'
API 服务启动:
API 调用结果:
LangSmith 观察结果:运行日志
小结
在本教程中,我们已经完成了创建第一个简单的LLM应用程序。
我们已经学习了如何使用语言模型,如何解析它们的输出,如何创建提示模板,如何在您使用 LangSmith 创建的链中获得出色的可观察性,以及如何使用LangServe部署它们。
这只是触及了您想要学习成为一名熟练的AI工程师的表面。幸运的是——我们有很多其他资源!
有关更深入的教程,请查看 官方教程 部分。
欢迎关注微信公众号【千练极客】,尽享更多干货文章!
本文由博客一文多发平台 OpenWrite 发布!
这篇关于无限可能LangChain——构建一个简单的LLM应用程序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-08-26Nacos初识学习:轻松入门分布式服务治理
- 2024-08-26Nacos初识学习:入门级指南与基本操作详解
- 2024-08-26Nacos多环境配置学习:入门指南与实操教程
- 2024-08-26Nacos多环境配置学习:从入门到实践
- 2024-08-26Nacos快速入门学习:轻松掌握分布式配置与服务发现
- 2024-08-26Nacos配置中心学习:入门指南与实践
- 2024-08-26Nacos配置中心学习:入门指南与实践
- 2024-08-26【PyTorch】n卡驱动、CUDA Toolkit、cuDNN全解安装教程
- 2024-08-26【Pytorch教程】迅速入门Pytorch深度学习框架
- 2024-08-25laravel 队列 使用范例介绍-icode9专业技术文章分享