前言
上一章,我们介绍了LangChain的基本简介
本章,我们介绍如何 使用 LangChain 构建一个简单的 LLM 应用程序
我们将向您展示如何使用 LangChain 构建一个简单的 LLM 应用程序。此应用程序会将文本从英语翻译成另一种语言。这是一个相对简单的 LLM 应用程序 – 它只是一个 LLM 调用加上一些提示。不过,这仍然是开始使用 LangChain 的好方法 – 只需一些提示和一个 LLM 调用就可以构建许多功能!
阅读完本教程后,您将对以下内容有一个总体了解
知识点
- 使用语言模型
- 使用PromptTemplates和OutputParsers
- 使用LangChain 表达语言 (LCEL)将组件链接在一起
- 使用LangSmith调试和跟踪你的应用程序
- 使用LangServe部署你的应用程序
基础知识
Jupyter笔记本
本指南(以及文档中的大多数其他指南)使用Jupyter 笔记本,并假设读者也使用 Jupyter 笔记本。Jupyter 笔记本非常适合学习如何使用 LLM 系统,因为经常会出现问题(意外输出、API 故障等),而在交互式环境中阅读指南是更好地理解它们的好方法。
安装
要安装 LangChain,请运行:
pip install langchain
LangSmith
使用 LangChain 构建的许多应用程序将包含多个步骤,并多次调用 LLM 调用。随着这些应用程序变得越来越复杂,能够检查链或代理内部究竟发生了什么变得至关重要。最好的方法是使用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_Key需要你自行设置和寻找。
import os
os.environ["OPENAI_API_KEY"] = "1232323234324324234234"
使用语言模型
首先,让我们学习如何单独使用语言模型。LangChain 支持多种不同的语言模型,您可以互换使用 – 在下面选择您想要使用的模型!
这里我们假设使用 Azure的服务
pip install -qU langchain-openai
让我们首先直接使用模型。ChatModel
是 LangChain“Runnable”的实例,这意味着它们公开了一个用于与它们交互的标准接口。为了简单地调用模型,我们可以将消息列表传递给该.invoke
方法。
import getpass
import os
os.environ["AZURE_OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import AzureChatOpen
AImodel = AzureChatOpenAI(azure_endpoint=os.environ["AZURE_OPENAI_ENDPOINT"],azure_deployment=os.environ["AZURE_OPENAI_DEPLOYMENT_NAME"],openai_api_version=os.environ["AZURE_OPENAI_API_VERSION"], )
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="Translate the following from English into Italian"),
HumanMessage(content="hi!"),
]
result= model.invoke(messages)
print(result)
以上使用大模型的部分,我们用了Azure,以下是用OpenAI的代码演示
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4")
用Google的Gemini
import getpass
import os
os.environ["GOOGLE_API_KEY"] = getpass.getpass()
from langchain_google_vertexai import ChatVertexAI
model = ChatVertexAI(model="gemini-1.5-flash")
用Cohere
import getpass
import os
os.environ["COHERE_API_KEY"] = getpass.getpass()
from langchain_cohere import ChatCohere
model = ChatCohere(model="command-r-plus")
用NVIDIA的
import getpass
import os
os.environ["NVIDIA_API_KEY"] = getpass.getpass()
from langchain import ChatNVIDIA
model = ChatNVIDIA(model="meta/llama3-70b-instruct")
这里是一个使用中文的通一千问,中文大模型的代码完整示例
from langchain_community.llms import Tongyi
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
import os
os.environ["DASHSCOPE_API_KEY"] = "sk-5b3bdd33fe584683a83b3a032366cf9a"
DASHSCOPE_API_KEY="sk-5b3bdd33fe584683a83b3a032366cf9a"
# res=Tongyi().invoke("上海多大")
# print(res)#打印结果
llm=Tongyi(temperature=1)
template='''
你的名字是小联,当人问问题的时候,你都会在开头加上'你好,我是智能机器人',然后再回答{question}
'''
prompt=PromptTemplate(
template=template,
input_variables=["question"]#这个question就是用户输入的内容,这行代码不可缺少
)
chain = LLMChain(#将llm与prompt联系起来
llm=llm,
prompt=prompt
)
question='微软这个公司怎么样'
res=chain.invoke(question)#运行
print(res['text'])#打印结果
API 参考:HumanMessage | SystemMessageAIMessage(content='ciao!', response_metadata={'token_usage': {'completion_tokens': 3, 'prompt_tokens': 20, 'total_tokens': 23}, 'model_name': 'gpt-4', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-fc5d7c88-9615-48ab-a3c7-425232b562c5-0')
如果我们启用了 LangSmith,我们可以看到这次运行被记录到 LangSmith,并且可以看到LangSmith 的跟踪
OutputParsers
请注意,模型的响应是AIMessage
。它包含一个字符串响应以及有关响应的其他元数据。通常我们可能只想处理字符串响应。我们可以使用简单的输出解析器来解析出这个响应。
我们首先导入简单的输出解析器。
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
API 参考:StrOutputParser
一种使用方法是直接使用它。例如,我们可以保存语言模型调用的结果,然后将其传递给解析器。
result = model.invoke(messages)
parser.invoke(result)
'Ciao!'
更常见的是,我们可以将模型与此输出解析器“链接”在一起。这意味着此输出解析器将在此链中每次被调用。此链采用语言模型的输入类型(字符串或消息列表)并返回输出解析器的输出类型(字符串)。
我们可以使用运算符轻松创建链|
。|
运算符在 LangChain 中用于将两个元素组合在一起。
chain = model | parser
chain.invoke(messages)
'Ciao!'
如果我们现在看看 LangSmith,我们可以看到该链有两个步骤:首先调用语言模型,然后将结果传递给输出解析器。我们可以看到 LangSmith跟踪
Prompt Templates
现在,我们将消息列表直接传递给语言模型。这个消息列表来自哪里?通常,它由用户输入和应用程序逻辑组合而成。此应用程序逻辑通常获取原始用户输入并将其转换为可传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。
PromptTemplates 是 LangChain 中的一个概念,旨在协助实现这种转换。它们接收原始用户输入并返回可传递到语言模型的数据(提示)。
让我们在这里创建一个 PromptTemplate。它将接受两个用户变量:
language
:文本翻译成的语言text
:要翻译的文本
from langchain_core.prompts import ChatPromptTemplate
API 参考:ChatPromptTemplate
首先,让我们创建一个字符串,将其格式化为系统消息:
system_template = "Translate the following into {language}:"
接下来,我们可以创建 PromptTemplate。这将是 的组合,system_template
以及用于放置文本的更简单的模板
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
此提示模板的输入是一本字典。我们可以单独试用此提示模板,看看它自己能做什么
result = prompt_template.invoke({"language": "italian", "text": "hi"})
result
ChatPromptValue(messages=[SystemMessage(content='Translate the following into italian:'), HumanMessage(content='hi')])
我们可以看到它返回了一个ChatPromptValue
由两条消息组成的消息。如果我们想直接访问这些消息,我们可以这样做:
result.to_messages()
[SystemMessage(content='Translate the following into italian:'),
HumanMessage(content='hi')]
使用LCEL
|
我们现在可以使用管道 ( ) 运算符将其与上面的模型和输出解析器结合起来:
chain = prompt_template | model | parser
chain.invoke({"language": "italian", "text": "hi"})
'ciao'
这是一个使用LangChain 表达语言 (LCEL)将 LangChain 模块链接在一起的简单示例。这种方法有几个好处,包括优化的流式传输和跟踪支持。
如果我们看一下 LangSmith 跟踪,我们可以看到所有三个组件都出现在LangSmith 跟踪中。
使用LangServe
现在我们已经构建了一个应用程序,我们需要为它提供服务。这就是 LangServe 的作用所在。LangServe 帮助开发人员将 LangChain 链部署为 REST API。您不需要使用 LangServe 即可使用 LangChain,但在本指南中,我们将展示如何使用 LangServe 部署您的应用程序。
虽然本指南的第一部分旨在在 Jupyter Notebook 或脚本中运行,但现在我们将不再使用这种方法。我们将创建一个 Python 文件,然后从命令行与其进行交互。
安装方式:
pip install "langserve[all]"
服务器
要为我们的应用程序创建服务器,我们将创建一个serve.py
文件。这将包含为应用程序提供服务的逻辑。它由三部分组成:
- 我们刚刚构建的链的定义
- 我们的 FastAPI 应用
- 定义一条服务链的路线,通过
langserve.add_routes
API 参考:ChatPromptTemplate | StrOutputParser | ChatOpenAI
就是这样!如果我们执行这个文件:
#!/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()
# 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)
python serve.py
我们应该看到我们的链在http://localhost:8000上提供服务。
Playground
每个 LangServe 服务都带有一个简单的内置 UI,用于配置和调用应用程序,并提供流式输出和中间步骤的可见性。前往http://localhost:8000/chain/playground/进行尝试!传入与之前相同的输入 – {"language": "italian", "text": "hi"}
– 它应该会做出与之前相同的响应。
Client
现在让我们设置一个客户端,以便以编程方式与我们的服务进行交互。我们可以轻松地使用 来完成此操作[langserve.RemoteRunnable](/docs/langserve/#client)
。使用它,我们可以与服务链进行交互,就像它在客户端运行一样。
from langserve import RemoteRunnable
remote_chain = RemoteRunnable("http://localhost:8000/chain/")
remote_chain.invoke({"language": "italian", "text": "hi"})
'Ciao'
要了解有关 LangServe 的其他功能的更多信息,请点击此处。
总结
就是这样!在本教程中,您学习了如何创建第一个简单的 LLM 应用程序。您学习了如何使用语言模型、如何解析其输出、如何创建提示模板、使用 LCEL 链接它们、如何将出色的可观察性融入使用 LangSmith 创建的链中,以及如何使用 LangServe 部署它们。
这只是成为熟练的 AI 工程师所需学习内容的冰山一角。幸运的是 – 我们还有很多其他资源!
RA/SD 衍生者AI训练营。发布者:chris,转载请注明出处:https://www.shxcj.com/archives/6758