无限可能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 osos.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 osos.environ["OPENAI_API_KEY"] = getpass.getpass()from langchain_openai import ChatOpenAImodel = ChatOpenAI(model="gpt-4")

选择 gemini

pip install -qU langchain-google-vertexai
import getpass
import osos.environ["GOOGLE_API_KEY"] = getpass.getpass()from langchain_google_vertexai import ChatVertexAImodel = ChatVertexAI(model="gemini-pro")

选择通义千问

如何拿到阿里云灵积模型服务的 apikey ?

链接:阿里云开发者社区-云计算社区-阿里云 (aliyun.com)

  1. 登录或者注册:点击右上角进行注册账号,有账号的可以直接登录

image.png

  1. 搜索灵积模型服务,开通服务

image.png

  1. 进入产品控制台,创建api-key,api-key要好好保存,如果不慎遗失了,可以在查看这个key

image.png

  1. 设置 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

输出打印结果: image.png

如果我们启用了LangSmith,我们可以看到此运行已记录到 LangSmith,并可以查看LangSmith的跟踪。 运行记录

OutputParsers

请注意,来自模型的响应是一个 AIMessage 。这包含一个字符串响应以及关于响应的其他元数据。通常我们可能只想使用字符串响应。我们可以使用简单的输出解析器解析出这个响应。

我们首先导入简单的输出解析器。

from langchain_core.output_parsers import StrOutputParserparser = 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 跟踪记录: image.png

创建链运行

更常见的是,我们可以用这个输出解析器“链接”模型。这意味着在这个链中每次都会调用这个输出解析器。这个链接受语言模型的输入类型(字符串或消息列表),并返回输出解析器的输出类型(字符串)。

我们可以使用 | 运算符轻松创建链。| 运算符在 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 日志 image.png

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)

image.png

如果我们查看 LangSmith 跟踪,我们可以看到所有三个组件都显示在 LangSmith 跟踪中。 运行日志 image.png

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 uvicornuvicorn.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 服务启动: image.png

API 调用结果: image.png

LangSmith 观察结果:运行日志 image.png

小结

在本教程中,我们已经完成了创建第一个简单的LLM应用程序。

我们已经学习了如何使用语言模型,如何解析它们的输出,如何创建提示模板,如何在您使用 LangSmith 创建的链中获得出色的可观察性,以及如何使用LangServe部署它们。

这只是触及了您想要学习成为一名熟练的AI工程师的表面。幸运的是——我们有很多其他资源! 有关更深入的教程,请查看 官方教程 部分。

欢迎关注微信公众号【千练极客】,尽享更多干货文章! qrcode_for_gh_e39063348296_258.jpg

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小波相干性显著性检验(MATLAB R2018A)

交叉小波常被用于检测不同信号之间的相关性,其在时频域建立了不同信号之间的联系。对于两个时域信号,其交叉小波变换和交叉小波尺度谱如下: 以轴承振动信号为例,利用正常轴承与故障轴承的振动信号、故障轴承和故障轴承的振动信号分…

【JavaEE进阶】——Mybatis操作数据库(使用注解和XML方式)

目录 🚩三层架构 🎈JDBC操作回顾 🚩什么是MyBatis 🚩MyBatis⼊⻔ 🎈准备工作 📝创建⼯程 📝数据准备 🎈配置数据库连接字符串 🎈写持久层代码 🎈单…

插入排序(直接插入排序、折半插入排序、希尔排序)的性能分析

目录 前言 插入排序 直接插入排序性能分析 折半插入排序性能分析 希尔排序性能分析 前言 本篇文章主要是总结插入排序的性能分析,具体的概念、算法、排序过程,我前面的文章有写,在这里就不再过多赘述了。 插入排序 插入排序是一种简单直…

如何从Windows的硬盘中恢复丢失或删除的照片

你有没有不小心删除了一张你再也找不回来的重要照片?如果是您的公司或家庭照片、婚礼或童年回忆,或亲人的照片怎么办? 根据我们的经验,用户通常会在清理计算机的存储/速度时遇到这样的事故,并最终删除包含重要图片的文…

PVE虚拟机 安装 OpenWrt

1、创建虚拟机 2、操作系统 3、磁盘,先删除 4、网络 5、其它默认 6、在 local 分区上传镜像 7、登录PVE虚拟机 # 切换到镜像目录 cd /var/lib/vz/template/iso/# 把镜像导入磁盘 qm importdisk 102 openwrt-buddha-version-v7_2022_-x86-64-generic-squashfs-uefi…

22 、系统安全

新的服务器到手,部署服务器初始化。 1、配置ip地址 网关dns解析(static)内网和外网。 2、安装源,外网(在线即可),内网(只能用源码包编译安装)。 3、磁盘分区&#xff…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:轨道交通监控系统

株洲中车时代电气股份有限公司(下称中车时代电气)是中国中车旗下股份制企业,其前身及母公司——中车株洲电力机车研究所有限公司创立于1959年。中车时代电气扎根株洲,走好两条钢轨,走出两条钢轨。中车时代电气秉承“双…

Sentinel与Nacos强强联合,构建微服务稳定性基石的重要实践

一、简介 Sentinel 作为一款强大的流量控制组件,能够对系统入口流量进行精准控制,有效防止服务因突发流量冲击引起服务雪崩,进而导致服务瘫痪,确保服务的稳定性和可靠性。 Nacos 作为配置管理和服务发现平台,实现了配置…

高斯混合模型聚类算法的实现

目录 1. 作者介绍2. 聚类简介2.1 K-Means聚类简介2.2 高斯混合聚类简介 3. 实验过程3.1 数据集介绍3.2 代码思路3.3 算法评价3.4 代码实现3.5 实验结果 4. 参考链接 1. 作者介绍 赵子仪,女,西安工程大学电子信息学院,2023级研究生 研究方向&…

深度网络学习笔记(一)——self-attention机制介绍和计算步骤

self-attention机制介绍及其计算步骤 前言一、介绍和意义二、 计算细节2.1 计算Attention Score2.2 计算value2.3 计算关联结果b2.4 统一计算 三、总结 前言 Transformer是一种非常常见且强大的深度学习网络架构,尤其擅长处理输出为可变长度向量序列的任务&#xf…

网络原理———TCP/IP—网络层IP协议

T04BF 👋专栏: 算法|JAVA|MySQL|C语言 🫵 今天你敲代码了吗 目录 网络层IP协议4位版本号4位首部长度8位服务类型16位总长度16位标识 3位标志 13位片偏移8位生存时间8位协议16位首部校验和32位源IP地址 和 32位目的IP地址方案1:动态分配IP地址方案2:NAT机…

小白跟做江科大32单片机之旋转编码器计次

原理部分按照下面这个链接理解即可y小白跟做江科大32单片机之对射式红外传感器计次-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139350487https://blog.csdn.net/weixin_58051657/article/details/139350487 实验过程 1.按照江科大老师给的电路图进行连接…

C语言(内存函数)

Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~ 💥个人主页:小羊在奋斗 💥所属专栏:C语言 本系列文章为个人学习笔记,在这里撰写成文一…

springboot+vue+mybatis博物馆售票系统+PPT+论文+讲解+售后

如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统博物馆售票系统信息管理难度大,容错率低,…

sqoop操作

介绍 sqoop是隶属于Apache旗下的, 最早是属于cloudera公司的,是一个用户进行数据的导入导出的工具, 主要是将关系型的数据库(MySQL, oracle...)导入到hadoop生态圈(HDFS,HIVE,Hbase...) , 以及将hadoop生态圈数据导出到关系型数据库中 操作 将数据从mysql中导入到HDFS中 1.全量…

Pytest框架中的Setup和Teardown功能

在 pytest 测试框架中,setup 和 teardown是用于在每个测试函数之前和之后执行设置和清理的动作,而pytest 实际上并没有内置的 setup 和 teardown 函数,而是使用了一些装饰器或钩子函数来实现类似的功能。 学习目录 钩子函数(Hook…

SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要

上面讲了SAP里面的基础知识,BOM,作业手顺(工艺路线),作业区(工作中心),MRP,MPS等概念,现在该到用的时候了。 SAP PP学习笔记07 - 简单BOM,派生BO…

STC8增强型单片机进阶开发--独立按键

知不足而奋进 望远山而前行 文章目录 目录 文章目录 前言 目标 内容 原理图 按键消抖 软件设计 要求 分析 实现单个按钮 实现多个按钮 使用位操作存储状态 总结 前言 本次学习旨在探索按键操作及按键消抖的原理和实现方法。通过学习原理图、按键消抖的三种方法以及软件设计的要…

如何选择D类音频放大器(数字功率放大器)

1 简介 多年来,音频内容一直在不断发展。从当地唱片店购买 12 英寸 LP 黑胶唱片的时代已经成为过去,现在我们通过流式传输几乎可即时播放云端的任何内容。虽然一些音频爱好者会为了获得新奇体验而重拾黑胶唱片,但今天绝大多数的音频都是以数…

JVM学习笔记(持续更新)

JDK、JRE、JVM区别? 类加载过程 装载 验证 准备 解析 初始化 类加载器分类 双亲委派模型 如何打破双亲委派模型? 自定义类加载器,集成ClassLoader类重写loadClass,如Tomcat JVM内存模型 JVM 需要使用计算机的内存,Java 程序…