Skip to main content
Open In ColabOpen on GitHub

使用聊天模型和提示模板构建一个简单的 LLM 应用程序

在本快速入门中,我们将展示如何使用 LangChain 构建一个简单的 LLM 应用程序。该应用程序将把英文文本翻译成另一种语言。这是一个相对简单的 LLM 应用程序——它仅包含一次 LLM 调用和一些提示。尽管如此,这仍是开始使用 LangChain 的绝佳方式——许多功能只需通过一些提示和一次 LLM 调用即可实现!

阅读本教程后,您将拥有以下内容的概览:

让我们开始吧!

设置

Jupyter Notebook

本教程及其他教程最方便在 Jupyter notebooks 中运行。在交互式环境中逐步学习指南是更好地理解它们的绝佳方式。有关安装说明,请参阅 此处

安装

安装 LangChain 请运行:

pip install langchain

有关更多详细信息,请参阅我们的 安装指南

LangSmith

您使用 LangChain 构建的许多应用程序将包含多个步骤以及多次 LLM 调用。 随着这些应用程序变得越来越复杂,能够检查您的链或代理内部究竟发生了什么变得至关重要。 实现这一点的最佳方式是使用 LangSmith

在通过上述链接注册后,请确保设置您的环境变量以开始记录追踪:

export LANGSMITH_TRACING="true"
export LANGSMITH_API_KEY="..."
export LANGSMITH_PROJECT="default" # or any other project name

或者,如果在笔记本中,您可以这样设置:

import getpass
import os

try:
# load environment variables from .env file (requires `python-dotenv`)
from dotenv import load_dotenv

load_dotenv()
except ImportError:
pass

os.environ["LANGSMITH_TRACING"] = "true"
if "LANGSMITH_API_KEY" not in os.environ:
os.environ["LANGSMITH_API_KEY"] = getpass.getpass(
prompt="Enter your LangSmith API key (optional): "
)
if "LANGSMITH_PROJECT" not in os.environ:
os.environ["LANGSMITH_PROJECT"] = getpass.getpass(
prompt='Enter your LangSmith Project Name (default = "default"): '
)
if not os.environ.get("LANGSMITH_PROJECT"):
os.environ["LANGSMITH_PROJECT"] = "default"
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = getpass.getpass(
prompt="Enter your OpenAI API key (required if using OpenAI): "
)

使用语言模型

首先,让我们学习如何单独使用语言模型。LangChain 支持多种不同的语言模型,您可以互换使用它们。有关特定模型的入门详情,请参阅 支持的集成

pip install -qU "langchain[openai]"
import getpass
import os

if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")

from langchain.chat_models import init_chat_model

model = init_chat_model("gpt-4o-mini", model_provider="openai")

让我们首先直接使用模型。ChatModels是LangChain Runnables的实例,这意味着它们为与模型交互提供了一个标准接口。要简单地调用模型,我们可以将消息列表传递给.invoke方法。

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
SystemMessage("Translate the following from English into Italian"),
HumanMessage("hi!"),
]

model.invoke(messages)
AIMessage(content='Ciao!', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 3, 'prompt_tokens': 20, 'total_tokens': 23, 'completion_tokens_details': {'accepted_prediction_tokens': 0, 'audio_tokens': 0, 'reasoning_tokens': 0, 'rejected_prediction_tokens': 0}, 'prompt_tokens_details': {'audio_tokens': 0, 'cached_tokens': 0}}, 'model_name': 'gpt-4o-mini-2024-07-18', 'system_fingerprint': 'fp_0705bf87c0', 'finish_reason': 'stop', 'logprobs': None}, id='run-32654a56-627c-40e1-a141-ad9350bbfd3e-0', usage_metadata={'input_tokens': 20, 'output_tokens': 3, 'total_tokens': 23, 'input_token_details': {'audio': 0, 'cache_read': 0}, 'output_token_details': {'audio': 0, 'reasoning': 0}})
提示

如果我们已启用 LangSmith,我们可以看到此运行记录到 LangSmith,并可以查看 LangSmith 跟踪。LangSmith 跟踪报告了 令牌 使用情况、延迟、标准模型参数(例如温度)以及其他信息。

请注意,ChatModels 接收 消息 对象作为输入,并生成消息对象作为输出。除了文本内容外,消息对象还传达对话的 角色,并保存重要数据,例如 工具调用 和令牌使用计数。

LangChain 还支持通过字符串或 OpenAI 格式 传递聊天模型输入。以下内容是等效的:

model.invoke("Hello")

model.invoke([{"role": "user", "content": "Hello"}])

model.invoke([HumanMessage("Hello")])

流式传输

因为聊天模型是可运行对象,它们暴露了一个标准接口,其中包括异步和流式调用模式。这允许我们从聊天模型中流式传输单个令牌:

for token in model.stream(messages):
print(token.content, end="|")
|C|iao|!||

您可以在本指南中查找有关流式聊天模型输出的更多详细信息。

提示模板

目前,我们直接将消息列表传递给语言模型。这个消息列表从何而来?通常,它是从用户输入和应用逻辑组合而成的。该应用逻辑通常将原始用户输入转换为准备好传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。

提示模板是 LangChain 中的一个概念,旨在协助完成此转换过程。它们接收原始用户输入,并返回已准备好传递给语言模型的数据(即一个提示)。

让我们在这里创建一个提示模板。它将接收两个用户变量:

  • language: 将文本翻译成目标语言
  • text: 要翻译的文本
from langchain_core.prompts import ChatPromptTemplate

system_template = "Translate the following from English into {language}"

prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)

请注意,ChatPromptTemplate 支持在单个模板中使用多个 消息角色。我们将 language 参数格式化为系统消息,将用户 text 格式化为用户消息。

此提示模板的输入是一个字典。我们可以单独使用此提示模板来观察其效果

prompt = prompt_template.invoke({"language": "Italian", "text": "hi!"})

prompt
ChatPromptValue(messages=[SystemMessage(content='Translate the following from English into Italian', additional_kwargs={}, response_metadata={}), HumanMessage(content='hi!', additional_kwargs={}, response_metadata={})])

我们可以看到它返回了一个由两条消息组成的ChatPromptValue。如果我们想直接访问这些消息,可以这样做:

prompt.to_messages()
[SystemMessage(content='Translate the following from English into Italian', additional_kwargs={}, response_metadata={}),
HumanMessage(content='hi!', additional_kwargs={}, response_metadata={})]

最后,我们可以在格式化后的提示词上调用聊天模型:

response = model.invoke(prompt)
print(response.content)
Ciao!
提示

消息 content 可以同时包含文本和具有附加结构的 内容块。有关更多信息,请参阅 此指南

如果我们查看 LangSmith 追踪,就可以确切地看到聊天模型接收到的提示词,以及 令牌 使用情况、延迟、标准模型参数(例如温度)和其他信息。

结论

就是这样!在本教程中,您已经学会了如何创建您的第一个简单的大语言模型(LLM)应用。您还学习了如何使用语言模型、如何创建提示模板,以及如何通过 LangSmith 对您构建的应用程序获得出色的可观测性。

这仅仅触及了你想成为熟练的 AI 工程师所需学习的冰山一角。幸运的是——我们还有很多其他资源!

关于 LangChain 的核心概念,我们提供了详细的概念指南以供进一步阅读。

如果您对这些概念有更具体的问题,请查看以下操操作指南章节:

以及 LangSmith 文档: