LangChain入门学习教程二
引言
在上一节中,我们初步了解了 LangChain 的基础概念、设计思路以及它解决的一些常见问题。这一节我们将深入探讨如何创建和使用 LLM 模块、聊天模块、链式结构以及代理人,让你的开发之旅更加丰富多彩!
创建第一个 LLM 模块
本地运行一个开源的 LLM 模型
要在本地运行一个开源的大型语言模型(LLM),你需要庞大的 GPU 资源。想象一下,你拥有一台装满显卡的超级计算机,就像一部未来派的太空船。虽然这样做可以获得最佳性能,但对于大多数开发者来说,这并不是一个现实的选择。
使用第三方的模型 API
与其自己搭建昂贵的硬件设施,不如借助第三方提供的强大模型 API。这些 API 已经优化好,可以直接调用,非常适合快速开发。目前市面上有很多优秀的 LLM 提供商,比如百度的文心 ERNIE 和阿里的通义千问。
简单应用 - 用 LLM 模块生成文本
在 LangChain 中,一个 LLM 模块的基本功能就是根据输入的文本生成新的文本。最常用的方法是 predict()
。
示例代码
javascript
const { OpenAI } = require("langchain/llms/openai");
// 初始化 OpenAI 模型
const model = new OpenAI({ openAIApiKey: "your-openai-api-key" });
// 输入文本
const inputText = "告诉我一个关于机器学习的故事。";
// 使用 predict 方法生成文本
model.predict(inputText).then((response) => {
console.log(response);
});
在这个示例中,我们做了以下几步:
- 初始化 OpenAI 模块:创建一个 OpenAI 模型实例,并传入你的 API 密钥。
- 设置输入文本:指定要生成故事的提示。
- 生成响应 :调用
predict
方法生成故事,并打印到控制台。
温度参数 (Temperature)
生成的文本结果会根据底层模型的不同有很大的差别,而且 LLM 模块所设置的温度参数也会影响生成的文本的质量。温度参数决定了生成文本的随机性程度:
- 低温度(接近 0):生成的文本更保守、确定性强。
- 高温度(接近 1):生成的文本更具创意和多样性。
让我们来调整一下温度参数,看看效果如何:
javascript
const { OpenAI } = require("langchain/llms/openai");
// 初始化 OpenAI 模型
const model = new OpenAI({ openAIApiKey: "your-openai-api-key", temperature: 0.7 });
// 输入文本
const inputText = "告诉我一个关于机器学习的故事。";
// 使用 predict 方法生成文本
model.predict(inputText).then((response) => {
console.log(response);
});
通过调整温度参数,你可以获得不同风格的生成文本。
简单应用 - 用聊天模块续写对话
聊天模块(Chat Model)
聊天模块与 LLM 模块类似,也是以 LLM 为底层支持,但它专门用于处理多轮对话。聊天模块能够记住之前的对话内容,并据此生成回复。
用于支持聊天模块的特殊类
为了更好地管理对话,LangChain 提供了一些特殊的类:
- AIMessage: 表示 AI 发送的消息。
- HumanMessage: 表示人类发送的消息。
- SystemMessage: 表示系统消息,通常用于设置对话的初始状态或规则。
聊天模块支持的方法调用
聊天模块支持两种主要的方法:
- predict(): 生成文本回复。
- predict_messages(): 生成一系列消息对象,包括 AI 和人类的消息。
示例代码
javascript
const { ChatOpenAI } = require("langchain/chat_models/openai");
const { HumanMessage, AIMessage } = require("langchain/schema");
// 初始化 ChatOpenAI 模型
const chatModel = new ChatOpenAI({ openAIApiKey: "your-openai-api-key" });
// 对话历史
const messages = [
new HumanMessage("你好,我是一个学生。"),
new AIMessage("你好!很高兴见到你。")
];
// 新的人类消息
const newMessage = new HumanMessage("我在学习机器学习,有什么推荐的学习资源吗?");
// 将新消息添加到对话历史中
messages.push(newMessage);
// 使用 predict_messages 方法生成回复
chatModel.predict_messages(messages).then((responseMessages) => {
responseMessages.forEach((message) => {
if (message instanceof HumanMessage) {
console.log(`You: ${message.content}`);
} else if (message instanceof AIMessage) {
console.log(`AI: ${message.content}`);
}
});
});
在这个示例中,我们做了以下几步:
- 初始化 ChatOpenAI 模型:创建一个 ChatOpenAI 模型实例,并传入你的 API 密钥。
- 定义对话历史 :使用
HumanMessage
和AIMessage
类定义之前的对话内容。 - 添加新消息:将新的人类消息添加到对话历史中。
- 生成回复 :调用
predict_messages
方法生成回复,并打印到控制台。
简单应用 - 链式结构
为什么要链式结构?
链式结构使得你可以方便地连接多个 LLM 模块,形成复杂的处理流程。想象一下,你有一系列的乐高积木,每个积木代表一个功能模块。通过将这些积木串在一起,你可以构建出各种各样的东西,从简单的房子到复杂的机器人。
如何避免重复定义功能相似的 LLM 模块?
为了避免重复定义功能相似的 LLM 模块,LangChain 提供了提示模板(Prompt Template)。提示模板允许你预先定义好输入格式,然后根据不同情况填充不同的内容。
示例代码
javascript
const { OpenAI } = require("langchain/llms/openai");
const { PromptTemplate } = require("langchain/prompts");
// 初始化 OpenAI 模型
const model = new OpenAI({ openAIApiKey: "your-openai-api-key" });
// 定义提示模板
const promptTemplate = new PromptTemplate({
template: "Generate a summary of the following text: {text}",
});
// 设置输入文本
const inputText = "机器学习是一种人工智能技术,通过算法使计算机从数据中自动学习并改进。";
// 渲染提示
promptTemplate.format({ text: inputText }).then((formattedPrompt) => {
// 使用模型生成响应
model.predict(formattedPrompt).then((response) => {
console.log(`Summary: ${response}`);
});
});
在这个示例中,我们定义了一个提示模板来生成文本摘要。通过这种方式,我们可以轻松地复用相同的模板,只需改变输入的内容即可。
简单应用 - 代理人
为什么要代理人?
代理人(Agent)用于处理链式模式难以独立处理的复杂问题。它们能够动态决策,选择合适的工具来完成任务,并根据结果不断调整策略。想象一下,你有一个智能助手,它不仅能回答问题,还能帮你完成一系列复杂的任务,比如预定机票、订酒店等。
代理人的本质
对于一个任务,代理人运用语言模型来决定完成任务所需的行为以及实施这些行为的顺序。代理人就像是一个聪明的小秘书,知道何时该做什么。
代理人的行为方式
代理人可以使用一系列预设的工具,按照以下步骤工作:
- 选择工具:根据当前任务需求选择合适的工具。
- 使用工具:执行选定的工具。
- 观察并处理结果:根据工具返回的结果进行分析和处理。
- 重复以上步骤:直到任务完成。
示例代码
假设我们要创建一个代理人来帮助用户预订酒店。代理人需要完成以下几个步骤:
- 获取用户的预订请求。
- 根据请求查询可用的酒店。
- 显示查询结果给用户。
- 用户选择酒店后,确认预订信息。
- 最终完成预订。
javascript
const { AgentExecutor } = require("langchain/agents");
const { Tool } = require("langchain/tools");
const { OpenAI } = require("langchain/llms/openai");
const { PromptTemplate } = require("langchain/prompts");
// 初始化 OpenAI 模型
const model = new OpenAI({ openAIApiKey: "your-openai-api-key" });
// 定义查询酒店的工具
class HotelSearchTool extends Tool {
constructor() {
super();
this.name = "hotel_search";
this.description = "Search for hotels based on location and date range.";
}
async _call(location, startDate, endDate) {
// 这里模拟查询酒店的过程
return `Found hotels in ${location} from ${startDate} to ${endDate}: Hotel A, Hotel B`;
}
}
// 定义确认预订的工具
class BookingConfirmationTool extends Tool {
constructor() {
super();
this.name = "booking_confirmation";
this.description = "Confirm booking details with the user.";
}
async _call(bookingDetails) {
// 这里模拟确认预订的过程
return `Confirmed booking for ${bookingDetails}`;
}
}
// 创建工具实例
const hotelSearchTool = new HotelSearchTool();
const bookingConfirmationTool = new BookingConfirmationTool();
// 定义提示模板
const agentPromptTemplate = new PromptTemplate({
template: "Based on the user's request, decide which tool to use and provide necessary parameters.",
});
// 创建代理人
const agent = AgentExecutor.fromToolsAndPrompt(
[hotelSearchTool, bookingConfirmationTool],
model,
agentPromptTemplate
);
// 用户请求
const userInput = "我想在巴黎从2025年4月1日到2025年4月5日预订酒店。";
// 使用代理人处理请求
agent.run(userInput).then((response) => {
console.log(response);
});
在这个示例中,我们做了以下几步:
- 定义工具 :创建两个工具类
HotelSearchTool
和BookingConfirmationTool
,分别用于查询酒店和确认预订。 - 初始化 OpenAI 模型:创建一个 OpenAI 模型实例,并传入你的 API 密钥。
- 定义提示模板 :使用
PromptTemplate
定义一个提示模板,指导代理人如何选择和使用工具。 - 创建代理人 :使用
AgentExecutor.fromToolsAndPrompt
方法创建一个代理人实例。 - 处理用户请求 :调用
run
方法处理用户的预订请求,并打印结果。
实战演练 - 构建一个简单的问答机器人
步骤 1: 初始化项目
首先,创建一个新的项目目录并初始化 npm 项目:
sh
mkdir my-langchain-chatbot
cd my-langchain-chatbot
npm init -y
步骤 2: 安装必要的依赖
安装 LangChain 和 OpenAI 的 SDK:
sh
npm install langchain openai
步骤 3: 编写代码
创建一个名为 index.js
的文件,并编写以下代码:
javascript
const { ChatOpenAI } = require("langchain/chat_models/openai");
const { HumanMessage, AIMessage } = require("langchain/schema");
// 初始化 ChatOpenAI 模型
const chatModel = new ChatOpenAI({ openAIApiKey: "your-openai-api-key" });
// 对话历史
let messages = [];
// 处理用户输入
function handleUserInput(userInput) {
// 添加用户消息到对话历史
messages.push(new HumanMessage(userInput));
// 使用 predict_messages 方法生成回复
chatModel.predict_messages(messages).then((responseMessages) => {
let latestResponse = null;
responseMessages.forEach((message) => {
if (message instanceof HumanMessage) {
console.log(`You: ${message.content}`);
} else if (message instanceof AIMessage) {
console.log(`AI: ${message.content}`);
latestResponse = message.content;
}
});
// 更新对话历史
messages = responseMessages;
// 模拟继续对话
continueConversation(latestResponse);
});
}
// 模拟继续对话
function continueConversation(lastResponse) {
if (lastResponse.includes("再见")) {
console.log("对话结束!");
return;
}
const nextInput = prompt("请输入您的下一个问题: ");
handleUserInput(nextInput);
}
// 启动对话
console.log("欢迎来到问答机器人!您可以开始提问了。");
const initialInput = prompt("请输入您的问题: ");
handleUserInput(initialInput);
步骤 4: 运行应用
确保你已经安装了所有依赖项,然后运行你的应用程序:
sh
node index.js
你应该会看到类似如下的输出:
makefile
欢迎来到问答机器人!您可以开始提问了。
请输入您的问题: 什么是机器学习?
You: 什么是机器学习?
AI: 机器学习是一种人工智能技术,通过算法使计算机从数据中自动学习并改进。
请输入您的下一个问题: 有哪些常见的机器学习算法?
You: 有哪些常见的机器学习算法?
AI: 常见的机器学习算法包括线性回归、逻辑回归、决策树、支持向量机、神经网络等。
请输入您的下一个问题: 再见
You: 再见
AI: 再见!祝您有愉快的一天!
对话结束!
总结
通过本篇文章,我们深入了解了如何创建和使用 LLM 模块、聊天模块、链式结构以及代理人。LangChain 提供了一整套强大的工具和方法,帮助开发者高效地构建由大型语言模型驱动的应用程序。
希望这篇教程能让你对 LangChain 有更深的理解,并激发你探索更多有趣的应用场景。如果你有任何问题或需要进一步的帮助,请随时提问。快来加入 LangChain 的大家庭,开启你的语言模型之旅吧!