使用聊天模型和提示模板构建一个简单的 LLM 应用程序
在这个快速入门中,我们将向您展示如何使用 LangChain 构建一个简单的 LLM 应用程序。此应用程序将文本从英语翻译成另一种语言。这是一个相对简单的 LLM 应用程序 - 它只是一个 LLM 调用加上一些提示。尽管如此,这是开始使用 LangChain 的绝佳方法 - 许多功能只需一些提示和一个 LLM 调用即可构建!
阅读本教程后,您将对以下内容有一个高层次的概述
让我们深入探讨!
设置
安装
要安装 LangChain,请运行
- npm
- yarn
- pnpm
npm i langchain @langchain/core
yarn add langchain @langchain/core
pnpm add langchain @langchain/core
有关更多详细信息,请参阅我们的安装指南。
LangSmith
您使用 LangChain 构建的许多应用程序将包含多个步骤,其中包含对 LLM 调用的多次调用。随着这些应用程序变得越来越复杂,能够检查您的链或代理内部到底发生了什么是至关重要的。最好的方法是使用 LangSmith。
在上面的链接注册后,请确保设置您的环境变量以开始记录跟踪
export LANGSMITH_TRACING="true"
export LANGSMITH_API_KEY="..."
# Reduce tracing latency if you are not in a serverless environment
# export LANGCHAIN_CALLBACKS_BACKGROUND=true
使用语言模型
首先,让我们学习如何单独使用语言模型。LangChain 支持许多不同的语言模型,您可以互换使用。有关开始使用特定模型的详细信息,请参阅支持的集成。
选择您的聊天模型
- Groq
- OpenAI
- Anthropic
- FireworksAI
- MistralAI
- VertexAI
安装依赖项
请参阅 本节,了解有关安装集成包的通用说明.
- npm
- yarn
- pnpm
npm i @langchain/groq
yarn add @langchain/groq
pnpm add @langchain/groq
添加环境变量
GROQ_API_KEY=your-api-key
实例化模型
import { ChatGroq } from "@langchain/groq";
const model = new ChatGroq({
model: "llama-3.3-70b-versatile",
temperature: 0
});
安装依赖项
请参阅 本节,了解有关安装集成包的通用说明.
- npm
- yarn
- pnpm
npm i @langchain/openai
yarn add @langchain/openai
pnpm add @langchain/openai
添加环境变量
OPENAI_API_KEY=your-api-key
实例化模型
import { ChatOpenAI } from "@langchain/openai";
const model = new ChatOpenAI({ model: "gpt-4" });
安装依赖项
请参阅 本节,了解有关安装集成包的通用说明.
- npm
- yarn
- pnpm
npm i @langchain/anthropic
yarn add @langchain/anthropic
pnpm add @langchain/anthropic
添加环境变量
ANTHROPIC_API_KEY=your-api-key
实例化模型
import { ChatAnthropic } from "@langchain/anthropic";
const model = new ChatAnthropic({
model: "claude-3-5-sonnet-20240620",
temperature: 0
});
安装依赖项
请参阅 本节,了解有关安装集成包的通用说明.
- npm
- yarn
- pnpm
npm i @langchain/community
yarn add @langchain/community
pnpm add @langchain/community
添加环境变量
FIREWORKS_API_KEY=your-api-key
实例化模型
import { ChatFireworks } from "@langchain/community/chat_models/fireworks";
const model = new ChatFireworks({
model: "accounts/fireworks/models/llama-v3p1-70b-instruct",
temperature: 0
});
安装依赖项
请参阅 本节,了解有关安装集成包的通用说明.
- npm
- yarn
- pnpm
npm i @langchain/mistralai
yarn add @langchain/mistralai
pnpm add @langchain/mistralai
添加环境变量
MISTRAL_API_KEY=your-api-key
实例化模型
import { ChatMistralAI } from "@langchain/mistralai";
const model = new ChatMistralAI({
model: "mistral-large-latest",
temperature: 0
});
安装依赖项
请参阅 本节,了解有关安装集成包的通用说明.
- npm
- yarn
- pnpm
npm i @langchain/google-vertexai
yarn add @langchain/google-vertexai
pnpm add @langchain/google-vertexai
添加环境变量
GOOGLE_APPLICATION_CREDENTIALS=credentials.json
实例化模型
import { ChatVertexAI } from "@langchain/google-vertexai";
const model = new ChatVertexAI({
model: "gemini-1.5-flash",
temperature: 0
});
让我们首先直接使用模型。ChatModels 是 LangChain Runnables 的实例,这意味着它们公开了一个用于与之交互的标准接口。要简单地调用模型,我们可以将 消息列表传递给 .invoke
方法。
import { HumanMessage, SystemMessage } from "@langchain/core/messages";
const messages = [
new SystemMessage("Translate the following from English into Italian"),
new HumanMessage("hi!"),
];
await model.invoke(messages);
AIMessage {
"id": "chatcmpl-AekSfJkg3QIOsk42BH6Qom4Gt159j",
"content": "Ciao!",
"additional_kwargs": {},
"response_metadata": {
"tokenUsage": {
"promptTokens": 20,
"completionTokens": 3,
"totalTokens": 23
},
"finish_reason": "stop",
"usage": {
"prompt_tokens": 20,
"completion_tokens": 3,
"total_tokens": 23,
"prompt_tokens_details": {
"cached_tokens": 0,
"audio_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 0,
"audio_tokens": 0,
"accepted_prediction_tokens": 0,
"rejected_prediction_tokens": 0
}
},
"system_fingerprint": "fp_6fc10e10eb"
},
"tool_calls": [],
"invalid_tool_calls": [],
"usage_metadata": {
"output_tokens": 3,
"input_tokens": 20,
"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 格式 的聊天模型输入。以下是等效的
await model.invoke("Hello");
await model.invoke([{ role: "user", content: "Hello" }]);
await model.invoke([new HumanMessage("hi!")]);
流式传输
由于聊天模型是 Runnables,它们公开了一个标准接口,其中包括异步和流式调用模式。这使我们可以从聊天模型流式传输单个令牌
const stream = await model.stream(messages);
const chunks = [];
for await (const chunk of stream) {
chunks.push(chunk);
console.log(`${chunk.content}|`);
}
|
C|
iao|
!|
|
|
提示模板
现在我们直接将消息列表传递到语言模型中。这个消息列表从哪里来?通常,它是由用户输入和应用程序逻辑的组合构建的。此应用程序逻辑通常采用原始用户输入并将其转换为准备传递给语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。
提示模板 是 LangChain 中的一个概念,旨在帮助进行这种转换。它们接收原始用户输入并返回准备传递到语言模型的数据(提示)。
让我们在这里创建一个提示模板。它将接收两个用户变量
language
:要将文本翻译成的语言text
:要翻译的文本
import { ChatPromptTemplate } from "@langchain/core/prompts";
首先,让我们创建一个字符串,我们将对其进行格式化以作为系统消息
const systemTemplate = "Translate the following from English into {language}";
接下来,我们可以创建 PromptTemplate。这将是 systemTemplate
以及用于放置文本的更简单模板的组合
const promptTemplate = ChatPromptTemplate.fromMessages([
["system", systemTemplate],
["user", "{text}"],
]);
请注意,ChatPromptTemplate
在单个模板中支持多个 消息角色。我们将 language
参数格式化为系统消息,并将用户 text
格式化为用户消息。
此提示模板的输入是一个字典。我们可以单独使用此提示模板来查看它本身的作用
const promptValue = await promptTemplate.invoke({
language: "italian",
text: "hi!",
});
promptValue;
ChatPromptValue {
lc_serializable: true,
lc_kwargs: {
messages: [
SystemMessage {
"content": "Translate the following from English into italian",
"additional_kwargs": {},
"response_metadata": {}
},
HumanMessage {
"content": "hi!",
"additional_kwargs": {},
"response_metadata": {}
}
]
},
lc_namespace: [ 'langchain_core', 'prompt_values' ],
messages: [
SystemMessage {
"content": "Translate the following from English into italian",
"additional_kwargs": {},
"response_metadata": {}
},
HumanMessage {
"content": "hi!",
"additional_kwargs": {},
"response_metadata": {}
}
]
}
我们可以看到它返回一个 ChatPromptValue
,其中包含两条消息。如果我们想直接访问消息,我们这样做
promptValue.toChatMessages();
[
SystemMessage {
"content": "Translate the following from English into italian",
"additional_kwargs": {},
"response_metadata": {}
},
HumanMessage {
"content": "hi!",
"additional_kwargs": {},
"response_metadata": {}
}
]
最后,我们可以在格式化的提示上调用聊天模型
const response = await model.invoke(promptValue);
console.log(`${response.content}`);
Ciao!
如果我们查看 LangSmith 跟踪,我们可以看到所有三个组件都显示在 LangSmith 跟踪中。
结论
就这样!在本教程中,您学习了如何创建您的第一个简单的 LLM 应用程序。您学习了如何使用语言模型、如何创建提示模板以及如何使用 LangSmith 获得对您创建的应用程序的良好可观察性。
这仅仅触及了您想要学习成为一名精通 AI 工程师的皮毛。幸运的是 - 我们有很多其他资源!
有关 LangChain 核心概念的更多阅读,我们有详细的概念指南。
如果您对这些概念有更具体的问题,请查看操作指南的以下部分
以及 LangSmith 文档