使用聊天模型和提示模板构建一个简单的大型语言模型应用
在本快速入门中,我们将向您展示如何使用 LangChain 构建一个简单的大型语言模型(LLM)应用。该应用将把英文文本翻译成另一种语言。这是一个相对简单的 LLM 应用——仅需一次 LLM 调用加上一些提示(prompting)。尽管如此,这仍然是开始使用 LangChain 的绝佳方式——许多功能只需通过一些提示和一次 LLM 调用即可实现!
阅读本教程后,您将获得以下内容的概览:
让我们开始吧!
设置
Jupyter Notebook
其他教程也最适合在 Jupyter 笔记本 中运行。在交互式环境中学习指南是更好地理解它们的好方法。有关安装说明,请参见 此处。
安装
要安装 LangChain,请运行:
- Pip
- Conda
pip install langchain
conda install langchain -c conda-forge
有关详细信息,请参阅我们的 安装指南。
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 的实例,这意味着它们提供了一个标准接口来与之交互。要简单地调用模型,我们可以将一组 messages 传递给 .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!
如果我们查看 LangSmith 跟踪,就可以清楚地看到聊天模型接收到的提示内容,以及 令牌 使用信息、延迟、标准模型参数(如温度)和其他相关信息。
结论
就是这样!在本教程中,你学会了如何创建第一个简单的大型语言模型应用程序。你了解了如何使用语言模型,如何创建提示模板,以及如何通过 LangSmith 对你创建的应用程序获得出色的可观测性。
这仅仅是你想要成为一名熟练的AI工程师所要学习内容的冰山一角。幸运的是——我们还有大量其他资源!
有关LangChain核心概念的进一步阅读,我们提供了详细的概念指南。
如果你对这些概念有更具体的问题,请查阅以下操操作指南中的相关内容:
以及 LangSmith 的文档: