无限可能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)

  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 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 跟踪记录: 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 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 服务启动: image.png

API 调用结果: image.png

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

小结

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

数据库(15)——DQL分页查询

DQL分页查询语法 SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数; 注:起始索引从0开始,起始索引(查询页码-1)*每页显示记录数。 如果查询的是第一页,可以省略起始索引。 示例:查询第一页…

【NLP开发】Python实现聊天机器人(微信机器人)

🍺NLP开发系列相关文章编写如下🍺:1🎈【小沐学NLP】Python实现词云图🎈2🎈【小沐学NLP】Python实现图片文字识别🎈3🎈【小沐学NLP】Python实现中文、英文分词🎈4&#x1…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:美团小袋自动配送车

大型电商公司美团已选用NVIDIA Jetson AGX Xavier 平台,作为无人配送机器人核心AI算力。 美团点评是全球大型的按需食品配送公司,结合了Uber Eats、Yelp和Groupon的商业模式,与超过40万家本地企业开展合作。他们推出了小袋自动配送车&#…

LeetCode---哈希表

242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 代码示例: //时间复杂度: O(n) //空间复杂度: O(1) c…

【NOIP提高组】进制转换

【NOIP提高组】进制转换 💖The Begin💖点点关注,收藏不迷路💖 我们可以用这样的方式来表示一个十进制数:将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以 10 为底数的幂…

Java web应用性能分析之【java进程问题分析概叙】

Java web应用性能分析概叙-CSDN博客 Java web应用性能分析之客户端慢_有的客户端跑java应用特别慢-CSDN博客 Java web应用性能分析服务端慢之前端页面慢_前端页面加载性能分析-CSDN博客 Java web应用性能分析服务端慢之Nginx慢_前端nginx请求比直接连接后台慢很多-CSDN博客 …

【安规介绍】

文章目录 一、基础知识安规上的六类危险的防护:安全电压漏电流接触电流能量问题:火灾问题:热问题结构问题阻燃等级绝缘等级:对接地系统的要求:结构要求:电气要求: 二、设计的关键电气绝缘距离电气爬电距离:…

四足机器人步态仿真(三)四足机器人基础步态仿真

观前提醒,本章主要内容为分析四足机器人步态实现和姿态控制,碰撞体积等程序 步态效果: 一、完整代码如下 # -*- coding: utf-8 -*-import pybullet as pimport timeimport numpy as npp.connect(p.GUI)p.createCollisionShape(p.GEOM_PLANE…

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

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

MYSQL数据库细节详细分析

MYSQL数据库的数据类型(一般只需要用到这些) 整型类型:用于存储整数值,可以选择不同的大小范围来适应特定的整数值。 TINYINTSMALLINTMEDIUMINTINTBIGINT 浮点型类型:用于存储带有小数部分的数值,提供了单精度(FLOA…

2-1RT-Thread线程管理-笔记

2-1RT-Thread线程管理-笔记 其中系统线程由内核创建,如main函数和空闲线程都属于系统线程,而用户线程是由应用程序所创建的。 对于资源较大的MCU可以适当设计较大的线程栈,也可以在初始化时设置一个具体的数值,如1K或2K字节。…

【JavaEE 进阶(二)】Spring MVC(下)

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多进阶知识 目录 1.前言2.响应2.1返回静态界面2.2返回数据2.3返回HTML代码 3.综合练习3.1计算器3.2用户登…

Python 技能提升(二)

理想的类结构 Property装饰器 # 传统写法 class Square1:def __init__(self):self.__side Nonedef get_side(self):return self.__sidedef set_side(self, side):assert side > 0, 边长不能为负数!self.__side sidedef del_side(self):# del self.__sideself.…

点到线段的最短矩离 及垂足的计算

过P做MN的垂线,垂足为Q,若Q在线段MN以内(包括与点M点N重合),则最短距离为垂线段长度,若垂足在MN以外,则最短距离为PM,PN中的较小者。(若P与MN共线,垂线长度为零,同样适用…

使用 MobileNet和ImageHash做图片相似度匹配(以图搜图)

很多应用中有以图搜图的应用,那么我们应该如何实现呢? 传统的文本搜索主要是关键字匹配,而目前图片和音乐的搜索却使用使用特征向量的方式。 向量就是使用一组数从多个维度描述特征,虽然每个维度的含义我们可能无法得知&#xff…

彻底卸载Windows Defender

概述 卸载Windows Defender的方法有很多,如修改注册表、组策略,执行脚本等等,这些方法操作过于繁琐和复杂,不适合小白,今天带来一款强大的卸载工具,只需要以管理员身份运行该软件即可,不用其他操…

css特殊效果和页面布局

特殊效果 圆角边框:div{border-radius: 20px 10px 50px 30px;} 四个属性值按顺时针排列,左上的1/4圆半径为20px,右上10,右下50,左下30。 div{border-radius: 20px;} 四角都为20px。 div{border-radius: 20px 10…

系统架构设计师【第12章】: 信息系统架构设计理论与实践 (核心总结)

文章目录 12.1 信息系统架构基本概念及发展12.1.1 信息系统架构的概述12.1.2 信息系统架构的发展12.1.3 信息系统架构的定义 12.2 信息系统架构12.2.1 架构风格12.2.2 信息系统架构分类12.2.3 信息系统架构的一般原理12.2.4 信息系统常用4种架构模型12.2.5 企业信息系…

finebi或者finereport发邮件

我们二次开发中,如果想利用产品自带的发邮件的功能,来发送自己的邮件内容。 首先 决策系统中邮件相关信息要配置好之后: 这里配好了发件人,以及默认发件人后, private void sendEmail(String content,String subject)…