本文将向你展示如何使用 LangChain 构建一个简单的 LLM 应用程序。此应用程序会将文本从英语翻译成另一种语言。这是一个相对简单的 LLM 应用程序 - 它只是一个 LLM 调用加上一些提示。尽管如此,这仍然是开始使用 LangChain 的好方法——只需一些提示和 LLM 调用就可以构建许多功能!本文在python环境进行操作。
阅读本文后,你将大致了解以下内容:
1、使用语言模型;
2、使用 PromptTemplates 和 OutputParser;
3、使用 LangChain 表达式语言 (LCEL) 将组件链接在一起;
4、使用 LangServe 部署应用程序。
一、Installation安装
LangChain安装:
pip install langchain
二、使用语言模型
LangChain支持许多不同的语言模型,包含:OpenAI、Anthropic、Azure、Google、Cohere、FireworksAI、Groq、MistralAI、TogetherAI等,您可以互换使用 ,选择您要使用的语言模型!
下面内容将居于OpenAI语言模型进行演示:
1)LangChain OpenAI安装:
pip install -qU langchain-openai
让我们首先直接使用模型。是LangChain的实例,它们公开了一个标准接口来与它们进行交互。只需简单地调用模型,我们就可以将消息列表传递给该方法。
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4",openai_api_key = "")
2)HumanMessage 和 SystemMessage
from langchain_core.messages import HumanMessage, SystemMessage
content = "你好,你是谁?"
print("问:"+content)
messages = [
SystemMessage(content="你是一个情感小助手,你叫TT"),
HumanMessage(content="content"),
]
三、OutputParsers 输出解析器
请注意,模型的响应是 .这包含一个字符串响应以及有关响应的其他元数据。通常,我们可能只想使用字符串响应。我们可以使用简单的输出解析器来解析此响应。
1)输出解析器
简单的使用输出解析器,我们可以保存语言模型调用的结果,然后将其传递给解析器。
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
result = model.invoke(messages)
out = parser.invoke(result)
print("答:"+out)
输出结果:
2)chain
更常见的是,我们可以用这个输出解析器“链接”模型。这意味着此输出解析器将在此链中每次被调用。该链采用语言模型的输入类型(字符串或消息列表),并返回输出解析器的输出类型(字符串)。
我们可以使用运算符轻松创建链。在LangChain中,运算符用于将两个元素组合在一起。
chain = model | parser
chain.invoke(messages)
输出结果:
四、Prompt Templates 提示模板
现在,我们将消息列表直接传递到语言模型中。此消息列表从何而来?通常,它是由用户输入和应用程序逻辑的组合构建的。此应用程序逻辑通常采用原始用户输入,并将其转换为准备传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入设置模板的格式。
PromptTemplates 是 LangChain 中的一个概念,旨在帮助实现这种转换。它们接收原始用户输入并返回准备传递到语言模型中的数据(提示)。
1)创建一个 PromptTemplate。它包含两个用户变量:
language
: 将文本翻译成的语言text
: 要翻译的文本
2)导入ChatPromptTemplate,创建一个字符串,我们将该字符串格式转化为系统消息:
from langchain_core.prompts import ChatPromptTemplate
system_template = "Translate the following into {language}:"
3)接下来,我们可以创建 PromptTemplate。这将是一个简单的模板的组合,将要翻译的文本放在这里:
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
4)此提示模板的输入是字典。我们可以单独使用这个提示模板,看看它自己做了什么:
result = prompt_template.invoke({"language": "chinese", "text": "hi"})
五、使用 LCEL 将组件链接在一起
我们可以使用运算符将其与模型和上面的输出解析器结合起来:
chain = prompt_template | model | parser
chain.invoke({"language": "chinese", "text": "hi"})
这是使用 LangChain 表达式语言 (LCEL) 将 LangChain 模块链接在一起的简单示例。这种方法有几个好处,包括优化的流式处理和跟踪支持。
六、LangServe 服务
现在我们已经构建了一个应用程序,我们需要为它提供服务。这就是LangServe的用武之地。LangServe 帮助开发人员将 LangChain 链部署为 REST API。您无需使用 LangServe 即可使用 LangChain,但在本指南中,我们将展示如何使用 LangServe 部署您的应用程序。
1)创建一个 Python 文件,然后从命令行与之交互
Install with:安装方式:
pip install "langserve[all]"
2)服务器
为我们的应用程序创建一个服务器,我们将创建一个文件 langchinaServer.py。这将包含我们为应用程序提供服务的逻辑。它由三件事组成:
1.我们刚刚在上面构建的链的定义
2.我们的 FastAPI 应用程序
3.为链提供服务的路由的定义,这是通过langserve.add_routes
server源码:
#!/usr/bin/env python
from typing import List
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langserve import add_routes
# 1. Create prompt template
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages([
('system', system_template),
('user', '{text}')
])
# 2. Create model
model = ChatOpenAI(openai_api_key = "")
# 3. Create parser
parser = StrOutputParser()
# 4. Create chain
chain = prompt_template | model | parser
# 4. App definition
app = FastAPI(
title="LangChain Server",
version="1.0",
description="A simple API server using LangChain's Runnable interfaces",
)
# 5. Adding chain route
add_routes(
app,
chain,
path="/chain",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
执行 langchinaServer.py 文件:
python langchinaServer.py
3)web 体验
每个LangServe服务都带有一个简单的内置UI,用于配置和调用应用程序,并提供流式输出和对中间步骤的可见性。
前往 http://localhost:8000/chain/playground/ 尝试一下吧!传入与之前相同的输入 -{"language": "chinese", "text": "hi"}- 并且它的响应应与之前相同。
4)客户端
现在,让我们设置一个客户端,以便以编程方式与我们的服务进行交互。我们可以使用 langserve 轻松做到这一点。RemoteRunnable 的 。
使用它,我们可以与服务链进行交互,就好像它在客户端运行一样。
from langserve import RemoteRunnable
remote_chain = RemoteRunnable("http://localhost:8000/chain/")
remote_chain.invoke({"language": "Chinese", "text": "hi"})
至此,你学习了如何创建第一个简单的 LLM 应用程序。您已经学习了如何使用语言模型,如何解析其输出,如何创建提示模板,如何使用 LCEL 将它们链接起来,如何在使用 LangSmith 创建的链中获得出色的可观测性,以及如何使用 LangServe 部署它们。