LangChain.js 实战系列:入门介绍

📝 LangChain.js 是一个快速开发大模型应用的框架,它提供了一系列强大的功能和工具,使得开发者能够更加高效地构建复杂的应用程序。LangChain.js 实战系列文章将介绍在实际项目中使用 LangChain.js 时的一些方法和技巧。

LangChain.js 是一个快速构建 AI 应用的库,它提供了一系列的工具,可以帮助你快速构建一个 AI 应用。

LangChain.js 目前还在快速迭代中,这是由于 AI 技术自身也正在快速迭代中,所以很多功能可能很快就被废弃掉,比如 generate() 方法。

使用 LangChain.js 的好处有挺多,比如:

  1. 封装了大量的模型,比如 OpenAI、Azure OpenAI、Claude、文心一言等等,填入响应的 API Key 等参数即可调用
  2. 提供了大量方便的方法,比如链式调用、对话管理、回钩子等等
  3. 和 LangSmith 结合,对 AI 应用可以很好地进行调试开发

LangChain.js 的基本使用

调用模型

LangChain.js 新改版区分了两种调用方式,一种是LLM,一种是ChatModel,不过这两种调用方式本质都一样,最终都是调用模型,一般我们使用后者。

实例化 ChatModel

import { ChatOpenAI } from "langchain/chat_models/openai";const chatModel = new ChatOpenAI({openAIApiKey: "...",
});

这里 openAIApiKey 可以在实例化的时候传入,也可以放置在环境变量 OPENAI_API_KEY 中,这样就不用每次都传入了,LangChain 会自动从 process.env 读取。如果是 Azure OpenAI,那对应的就是 AZURE_OPENAI_API_KEYAZURE_OPENAI_API_INSTANCE_NAMEAZURE_OPENAI_API_DEPLOYMENT_NAME 等等。

接着就可以调用模型:

import { HumanMessage, SystemMessage } from "langchain/chat_models/messages";const messages = [new SystemMessage("你是一位语言模型专家"),new HumanMessage("模型正则化的目的是什么?"),
];

这里的 SystemMessage 和 HumanMessage 都是 LangChain.js 提供的消息类,分别表示系统消息和用户消息。用户消息好理解,系统消息的话可以看作是针对 AI 模型的一个高级指令(instruction),比如 SystemMessage("你是一位语言模型专家") 就是告诉 AI 模型,你是一位语言模型专家,这样 AI 模型就会以这个身份来回答你的问题,SystemMessage 是可选的。

await chatModel.invoke(messages);

这里的 invoke() 方法就是调用模型,它会返回一个 Promise,这个 Promise 的结果就是 AI 模型的回复,比如:

AIMessage { content: 'The purpose of model regularization is to prevent overfitting in machine learning models. Overfitting occurs when a model becomes too complex and starts to fit the noise in the training data, leading to poor generalization on unseen data. Regularization techniques introduce additional constraints or penalties to the model's objective function, discouraging it from becoming overly complex and promoting simpler and more generalizable models. Regularization helps to strike a balance between fitting the training data well and avoiding overfitting, leading to better performance on new, unseen data.' }

流式传输

流式传输是一个基本功能了,一开始 LangChain 仅支持使用回调函数的方式来实现,比如:

const chat = new ChatOpenAI({streaming: true,
});const response = await chat.call([new HumanMessage("讲个笑话")], {callbacks: [{handleLLMNewToken(token: string) {console.log({ token });},},],
});

这样每当模型返回的时候,都会触发 handleLLMNewToken 回调函数,新版 LangChain.js 更加灵活,使用 .stream() 方法可以实现同样的功能:

const stream = await chat.stream([new HumanMessage("讲个笑话")]);for await (const chunk of stream) {console.log(chunk);
}

这里的 stream 是一个 AsyncIterableIterator,可以使用 for await 来遍历,每当模型返回的时候,就会触发 for await 中的代码。

JSON Mode

JSON Mode 是 OpenAI 新版的能力,它可以让你更好地控制 AI 模型的输出,比如:

const jsonModeModel = new ChatOpenAI({modelName: "gpt-4-1106-preview",
}).bind({response_format: {type: "json_object",},
});

注意,目前仅 gpt-4-1106-preview 模型支持 JSON Mode,另外还有一个强制性的要求,就是 SystemMessage 必须包含 JSON 字眼:

const res = await jsonModeModel.invoke([["system", "Only return JSON"],["human", "Hi there!"],
]);

后续 GPT 迭代 JSON Mode 应该就会变成通用能力,之语 SystemMessage 的规则,不知道后续会不会改变。

函数调用

函数调用(Function Calling)是 OpenAI 的一个重点能力,也就是目前 AI 应用和程序的一个重要交互协议。函数调用其实很简单,就是先让 AI 去选择调用哪个函数,然后在程序中调用真正的函数。

最常见的场景就是联网回答,你提供了「联网搜索」的函数,当用户提问「今天的重点新闻是什么」的时候,AI 会先调用「联网搜索」函数,然后根据函数执行得到的信息,最终再回答用户的问题。

OpenAI 使用 JSON Schema 来定义函数调用的协议,比如定义一个提取字段的函数:

const extractionFunctionSchema = {// 定义函数的名字name: "extractor",// 定义函数的描述description: "Extracts fields from the input.",// 定义函数的入参有哪些parameters: {type: "object",properties: {tone: {type: "string",enum: ["positive", "negative"],description: "The overall tone of the input",},word_count: {type: "number",description: "The number of words in the input",},chat_response: {type: "string",description: "A response to the human's input",},},required: ["tone", "word_count", "chat_response"],},
};

也可以使用 zod 这个库,写起来更方便:

import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";const extractionFunctionSchema = {name: "extractor",description: "Extracts fields from the input.",parameters: zodToJsonSchema(z.object({tone: z.enum(["positive", "negative"]).describe("The overall tone of the input"),entity: z.string().describe("The entity mentioned in the input"),word_count: z.number().describe("The number of words in the input"),chat_response: z.string().describe("A response to the human's input"),final_punctuation: z.optional(z.string()).describe("The final punctuation mark in the input, if any."),})),
};

调用函数:

const model = new ChatOpenAI({modelName: "gpt-4",
}).bind({functions: [extractionFunctionSchema],function_call: { name: "extractor" },
});
const result = await model.invoke([new HumanMessage("What a beautiful day!")]);
console.log(result);
/*
AIMessage {//...additional_kwargs: {function_call: {name: 'extractor',arguments: '{\n' +'"tone": "positive",\n' +'"entity": "day",\n' +'"word_count": 4,\n' +`"chat_response": "I'm glad you're enjoying the day!",\n` +'"final_punctuation": "!"\n' +'}'}}
}
*/

最后

推荐一些好用的资源

👉 StarFlow.tech ,一个集聊天、工作流和知识库的 AI 平台。在这里,你可以免费使用 ChatGPT3.5 和 3.5 16K,还有 GPT-4 Vision、DELL·E3、Midjourney 等多种模型可供选择。这个平台就像一个小型工作室,助力个人效率 Max!

👉 OpenAI 官方提示词指南 ,专门面向中文的提示词工程指南,该教程是 OpenAI 官方出版,主要包括了六大策略,轻松学习提示词技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

环形锻件全自动尺寸测量法兰三维检测自动化设备-CASAIM自动化蓝光检测系统

锻造是一种利用锻压机械对金属坯料施加压力,使其产生塑性变形以获得具有一定机械性能、一定形状和尺寸锻件的加工方法,锻压(锻造与冲压)的两大组成部分之一。 目前客户使用专用直径千分尺、塞规、塞尺等对锻件形状尺寸误差进行测…

使用 JWT(JSON Web 令牌)实现登录身份验证和令牌续订

文档链接 文档链接, PDF中包含一部分宣传大字制作不易还望多多支持互相交流 使用 JWT(JSON Web 令牌)实现登录身份验证和令牌续订。它将 JWT 与基于会话的身份验证进行了比较,并强调了每种方法的差异、优点和缺点。本文档介绍了基于会话的方…

2022年2月-2023年12月总结

时间:2023年12月30日 14:28 地点:博库书城 0、序言 2023年上半年除了阿里16N拆分,我就不记得其他的事情了,就好像我的记忆只从今年9月份自己的折腾开始。是不是只有自己认真对待过的日子,才会让人深刻呢?…

T527 Android13遥控适配

T527 Android13遥控的适配和官方提供的文档有些不一样,按照官方的文档不能够正常适配到自己的遥控器。 首先确保驱动是否有打开CONFIG_AW_IR_RX和CONFIG_RC_DECODERSy 以及CONFIG_IR_NEC_DECODERm,这个可以在longan/out/t527对应的目录下的.config查看是…

算法每日一题:购买两块巧克力 | 两个最小值的遍历

大家好,我是星恒 今天的每日一题是寻找一个数组中的两个最小值,看似简单的一道题,其实有不少门道! 话不多说,我们直接来看: 题目:给你一个整数数组 prices ,它表示一个商店里若干巧克…

数模学习day05-插值算法

插值算法有什么作用呢? 答:数模比赛中,常常需要根据已知的函数点进行数据、模型的处理和分析,而有时候现有的数据是极少的,不足以支撑分析的进行,这时就需要使用一些数学的方法,“模拟产生”一些…

Windows下Qt使用MSVC编译出现需要转为unicode的提示

参考 Qt5中文编码问题解决办法_qt5设置编码-CSDN博客 致敬 提示:warning: C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。 出现此问题,应该是Unix格式下代码的编码格式是UTF-8,注意不…

SOLIDWORKS Flow Simulation热环境分析

关于室内通风的问题,其实室内通风方面的与我们之前聊到的数据中心通风散热问题相类似,只不过本次会引入一个新的模块——人体舒适度问题,在Flow Simulation中有一个HVAC模块就是专门用于研究人体舒适度的,它可以预测人们在热环境中…

LeetCode75| 哈希表/哈希集合

目录 2215 找出两数组的不同 1207 独一无二的出现次数 1657 确定两个字符串是否接近 2352 相等行列对 2215 找出两数组的不同 class Solution { public:vector<vector<int>> findDifference(vector<int>& nums1, vector<int>& nums2) {un…

力扣题目学习笔记(OC + Swift)206. 反转链表

206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 方法一、迭代 在遍历链表时&#xff0c;将当前节点的 next\textit{next}next 指针改为指向前一个节点。由于节点没有引用其前一个节点&#xff0c;因此必须事先存储其…

【Proteus仿真】【51单片机】自动除湿器系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LCD1602液晶、DHT11温湿度、继电器除湿模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示DHT11传感器检测的湿度值阈值&am…

面试数据库八股文五问五答第三期

面试数据库八股文五问五答第三期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;MyIsAm 和 InnoDB 的区别 事务支持&#xff1a;MyISAM不支持事务&a…

开源radishes高仿网易云音乐完整源码,可试听和下载“灰色”歌曲,跨平台的无版权音乐平台

源码介绍 Radishes是项目名称&#xff0c;是由萝卜翻译而来。可以在这里试听和下载“灰色”歌曲&#xff0c;是一个可以跨平台的无版权音乐平台。 萝卜音乐界面和功能参考 windows 网易云音乐界面和 ios 的网易云音乐 安装依赖 cd radishes/ yarn bootstrap 运行项目 web:…

docker-compose Install TeamCity

前言 TeamCity 是一个通用的 CI/CD 软件平台,可实现灵活的工作流程、协作和开发实践。允许在您的 DevOps 流程中成功实现持续集成、持续交付和持续部署。 系统支持 docker download TeamCity TeamCity 文档参考项目离线包百度网盘获取

PPT录制视频的方法,轻松提升演示效果!

在现代工作和学习中&#xff0c;ppt是一种常见的演示工具&#xff0c;而将ppt转化为视频形式更能方便分享和传播。本文将介绍两种ppt录制视频的方法&#xff0c;每一种方法都将有详细的步骤和简要的介绍&#xff0c;通过这些方法&#xff0c;你可以轻松将ppt制作成视频&#xf…

Servlet入门

目录 1.Servlet介绍 1.1什么是Servlet 1.2Servlet的使用方法 1.3Servlet接口的继承结构 2.Servlet快速入门 2.1创建javaweb项目 2.1.1创建maven工程 2.1.2添加webapp目录 2.2添加依赖 2.3创建servlet实例 2.4配置servlet 2.5设置打包方式 2.6部署web项目 3.servl…

SSH -L:安全、便捷、无边界的网络通行证

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 SSH -L&#xff1a;安全、便捷、无边界的网络通行证 前言1. SSH -L基础概念SSH -L 的基本语法&#xff1a;端口转发的原理和作用&#xff1a; 2. SSH -L的基本用法远程访问本地示例&#xff1a;访问本…

Linux 账号的权限管理

文章目录 Linux 账号的权限管理一、用户账号和组账号的概述1、Linux基于用户身份对资源访问进行控制1.1 用户账号1.2 组账号1.3 UID和GID系统如何区别用户身份 二、用户账号文件1、用户账号文件/etc/passwd保存用户名称&#xff0c;宿主目录、登录shell等基本信息 2、用户账号文…

【北亚服务器数据恢复】san环境下LUN Mapping出错导致文件系统一致性出错的数据恢复案例

服务器数据恢复环境&#xff1a; san环境下的存储上一组由6块硬盘组建的RAID6&#xff0c;划分为若干LUN&#xff0c;MAP到跑不同业务的服务器上&#xff0c;服务器上层是SOLARIS操作系统UFS文件系统。 服务器故障&#xff1a; 业务需求需要增加一台服务器跑新增的应用&#xf…

Kubernetes 100个常用命令

本文简单总结关于使用 Kubectl 进行 Kubernetes 诊断的指南。列出了 100 个 Kubectl 命令&#xff0c;这些命令对于诊断 Kubernetes 集群中的问题非常有用。这些问题包括但不限于&#xff1a; 集群信息 Pod 诊断 服务诊断 部署诊断 网络诊断 持久卷和持久卷声明诊断 资源…