AI - 使用LangChain请求LLM结构化生成内容

AI - 使用LangChain请求LLM结构化生成内容

ai-langchain

基于深度学习的大型语言模型(LLM)不仅可以生成文本,还可以帮助我们完成许多复杂任务,如自动化客服、内容创作和数据分析。然而,如何从这些模型中结构化地获取输出,仍然是一个关键问题。在这篇文章中,我们将探索如何使用 JavaScript 和 LangChain 构建一个简单的 LLM结构化输出的应用程序。

场景

在构建 LLM 应用程序时,许多时候我们不仅仅需要模型生成文本,还需要它按照我们指定的格式输出结果。这样的需求在以下场景中非常常见:

  • 数据处理和分析:当我们需要对生成的数据进一步处理和分析时,结构化数据会更加便于处理。
  • 系统集成:在复杂系统中,各个组件的协作往往需要标准化的数据格式,以确保不同模块之间的兼容性和数据流的顺畅。
  • 用户界面展示:结构化的数据更容易在用户界面中展示,让用户可以直观地理解内容。

好处

一致性

结构化输出可以确保返回的数据格式一致。这对于解析和处理数据非常重要,尤其是在需要进一步操作或存储数据的情况下。

易于调试

标准化的数据格式使得调试过程更加容易。通过固定的结构,我们可以迅速识别并修复可能存在的格式或内容问题。

自动化

结构化数据更便于自动化处理。无论是将数据存储到数据库中,还是进行进一步的分析和可视化,结构化数据都能大大简化这些过程。

实现结构化内容生成的方式

在利用大型语言模型(LLM)生成结构化内容时,我们可以通过直接设置提示(prompting)或使用withStructuredOutput方法来达到目的。这两种方法都有其独特的优点和适用场合。以下是对这两种方法的比较:

通过提示(Prompting)

通过提示法实现结构化内容生成,主要依赖于构建一个明确的文本提示,指导模型生成所需格式的输出。

优点

  • 简单易行:不需要额外的工具或库,只需精心设计提示即可。
  • 灵活性高:可以自由地设计和修改提示内容,适应不同的需求。
  • 模型无关:适用于不同类型的语言模型(如GPT-3、BERT等),无论其内部细节如何。

缺点

  • 依赖人工设计质量:提示的设计质量直接影响输出的准确性和格式一致性。
  • 不易维护和扩展:复杂的提示容易变得冗长和难以管理,修改提示可能导致意料之外的问题。
  • 高变异性:模型可能因细微的提示变化生成不同的格式,缺乏一致性和稳定性。

使用withStructuredOutput

withStructuredOutput方法是LangChain库提供的一种方法,通过定义结构化输出的模式来指导模型生成特定格式的内容。

优点

  • 强一致性:通过预定义的数据模式确保输出的格式和内容一致。
  • 易于维护和扩展:更改结构化输出模式比更改提示更为简单和直观,不需要修改大量提示文本。
  • 自动化:减少了手动调试和格式化的麻烦,通过明确的模式定义确保输出的准确性。

缺点

  • 依赖工具库:需要学习和使用LangChain或类似工具库提供的API。
  • 灵活性较低:输出格式固定,适应特定需求相对简单,但面对复杂和变动频繁的需求时可能不灵活。

示例代码

示例代码来主体源于LangChain官网,有兴趣的小伙伴可以去官网查看。下面将通过多种方式提示 LLM 讲一个笑话,并要求返回包括笑话的开头(setup),笑点(punchline),笑话的搞笑程度(rating)以及为什么它很搞笑(reason)的结构化输出。

第一步:设置开发环境

首先,创建一个新目录并进入该目录:

mkdir langchain-structure-output-app
cd langchain-structure-output-app

初始化一个新的Node.js项目:

npm init -y

安装必要的依赖:

# 安装langchain
npm install langchain @langchain/core --save# 安装groq的langchain开发包
npm install @langchain/groq  --save# 安装环境变量配置库
npm install dotenv --save# 安装JSONSchema生成库
npm install zod --save

第二步:创建项目结构

创建项目所需的文件和目录结构:

langchain-structure-output-app
├── index.js
├── .env
└── package.json

第三步:配置环境变量

在项目目录中创建一个 .env 文件,并添加Groq API密钥:

GROQ_API_KEY=your_groq_api_key_here

第四步:编写主应用程序

index.js 中编写应用程序代码,配置LangChain并创建翻译功能。

// 引入LangChain开发包,ChatGroq是用于与Groq语言模型交互的类
import { ChatGroq } from "@langchain/groq";// 导入 dotenv,它是一个零依赖模块,能够从.env文件中加载环境变量到process.env中
import dotenv from "dotenv";// 导入zod用于TypeScript优先的模式验证,并带有静态类型推断功能
import { z } from "zod";// 加载 .env 文件中的环境变量GROQ_API_KEY
dotenv.config();// 配置Groq LLM(语言模型),设置模型名称和温度参数
const model = new ChatGroq({model: "mixtral-8x7b-32768", // 使用的模型名称temperature: 0, // 温度参数,决定输出的随机性
});

第五步:JsonSchema结构化输出

/*** 通过JsonSchema实现结构化输出* * @param {string} model LLM实例* @param {boolean} includeRaw 是否包含原始内容,默认不包含*/
async function tellJoke(model, includeRaw = false) {// 定义结构化的笑话对象模式const joke = z.object({setup: z.string().describe("The setup of the joke"), // 笑话的开场部分,为字符串类型rating: z.number().describe("How funny the joke is, from 1 to 10"), // 笑话的搞笑程度评分,1到10的数字类型punchline: z.string().describe("The punchline to the joke"), // 笑点部分,为字符串类型reason: z.string().describe("The reason why it is funny"), // 可笑的原因,为字符串类型});// 使用withStructuredOutput方法,将输出格式化为定义好的笑话模式// 设置输出格式名为“joke”const structuredLlm = model.withStructuredOutput(joke, {includeRaw: includeRaw,name: "joke",});// 通过invoke方法向模型询问一个关于狗的笑话并获取结构化的输出const answer = await structuredLlm.invoke("Tell me a joke about dogs");// 打印输出的笑话结果console.log(answer);
}
await tellJoke(model);

用以下命令或者npm start运行应用程序:

node index.js

输出结果是一个标准的JSON格式,如下所示:

bash-3.2$ npm start> langchain-structure-output-app@1.0.0 start
> node index{setup: 'Why did the scarecrow adopt a dog?',rating: 5,punchline: 'Because he needed a bark-ing buddy!',reason: "It's a play on words between 'bark' and 'scarecrow's job'"
}

然后并非所有的LLM都支持结构化内容输出,对于不支持的情况,可以考虑将tellJoke(model, includeRaw = false)的第二个参数includeRaw置成true,这样可以返回原始内容,如下所示,然后开发者可以进行自定义解析。

{raw: AIMessage {"content": "","additional_kwargs": {"tool_calls": [{"id": "call_sxtk","type": "function","function": "[Object]"}]},"response_metadata": {"tokenUsage": {"completionTokens": 158,"promptTokens": 1280,"totalTokens": 1438},"finish_reason": "tool_calls"},"tool_calls": [{"name": "joke","args": {"setup": "Why did the scarecrow adopt a dog?","rating": 5,"punchline": "Because he needed a bark-ing buddy!","reason": "It's a play on words between 'bark' and 'scarecrow's job'"},"type": "tool_call","id": "call_sxtk"}],"invalid_tool_calls": [],"usage_metadata": {"input_tokens": 1280,"output_tokens": 158,"total_tokens": 1438}},parsed: {setup: 'Why did the scarecrow adopt a dog?',rating: 5,punchline: 'Because he needed a bark-ing buddy!',reason: "It's a play on words between 'bark' and 'scarecrow's job'"}
}

第六步:OpenAI风格结构化输出

// 通过OpenAI-style JSON schema 实现结构化输出
async function tellJoke2(model) {// 定义结构化的笑话对象模式const structuredLlm = model.withStructuredOutput({name: "joke",description: "Joke to tell user.",parameters: {title: "Joke",type: "object",properties: {setup: { type: "string", description: "The setup for the joke" },rating: { type: "number", description: "How funny the joke is, from 1 to 10" },punchline: { type: "string", description: "The punchline to the joke" },reason: { type: "string", description: "The reason why it is funny" }},required: ["setup", "punchline", "rating", "reason"],},});// 通过invoke方法向模型询问一个关于老鼠的笑话并获取结构化的输出// 设置输出格式名为“joke”const answer = await structuredLlm.invoke("Tell me a joke about mouse", { name: "joke" });// 打印输出的笑话结果console.log(answer);
}
await tellJoke2(model);

用以下命令或者npm start运行应用程序:

node index.js

输出结果是一个标准的JSON格式,如下所示:

bash-3.2$ npm start> langchain-structure-output-app@1.0.0 start
> node index{setup: "Why don't mice use spell check?",punchline: "Because they're afraid of making a misspell-mouse!",rating: 5,reason: "It's a play on words related to the question."
}

总结

ai-quotes-1

在本文中,我们使用LangChain和JavaScript创建了一个简单的格式化输出应用程序,通过配置Groq API并使用LangChain框架,在利用大型语言模型(LLM)生成结构化内容时,我们可以通过直接设置提示(prompting)或使用withStructuredOutput方法来达到目的。在这个基础上,您可以扩展该应用程序,以支持更多的功能和更复杂的应用场景。希望本教程对您有所帮助!

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

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

相关文章

Linux基础-常用操作命令详讲

Linux基础-常用操作命令详讲 一、openssl加密简单介绍 1. 生成加密的密码散列(password hash)​编辑 1.1 常见的选项总结表 1.2 加密参数详解 2. 自签名证书 3. 证书转换 二、文件管理 1. 创建空文件 ​编辑 2. 删除文件 4. 新建目录 ​编辑…

Windows、Linux系统上进行CPU和内存压力测试

CPU和内存压力测试 1. Linux环境 Linux环境下,我们可以用 stress 工具进行内存、CPU等的压力测试。 【1】. stress工具说明 [kalamikysrv1 ~]$ stress --help stress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-…

JVM知识点大全(未完...)

JVM运行时数据区域 堆 堆是Java虚拟机中用于存储对象的主要区域,包括字符串常量池。绝大多数对象都是在堆中创建的(少部分对象可能会在栈上分配)。为了更好地进行垃圾回收,堆被划分为年轻代和老年代两部分。年轻代又被进一步分为E…

九宫格按键输入

题目描述 九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入""或者其他字符,则循环中断,输…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

ZISUOJ 2024算法基础公选课练习一(1)

前言、 又是一年算法公选课&#xff0c;与去年不同的是今年学了一些纯C&#xff08;而不是带类的C&#xff09; 一、我的C模板 1.1 模板1 #include <bits/stdc.h> using i64 long long;int main() {std::cin.tie(nullptr)->sync_with_stdio(false);return 0; } 1…

基于STM32的八位数码管显示Proteus仿真设计

基于STM32的八位数码管显示Proteus仿真设计 1.主要功能2.仿真设计3. 程序设计4. 设计报告5. 资料清单&下载链接 基于STM32的八位数码管显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;…

【机器学习】Lesson 4 - 朴素贝叶斯(NB)文本分类

目录 背景 一、适用数据集 1. 数据集选择 1.1 适用领域 1.2 数据集维度&#xff08;特征数&#xff09; 1.3 数据行数 2. 本文数据集介绍 2.1 数据集特征 2.2 数据格式 3. 数据集下载 二、算法原理 1. 朴素贝叶斯定理 2. 算法逻辑 3. 运行步骤 4. 更多延申模型 …

软考教材重点内容 信息安全工程师 第1章 网络信息安全概述

第 1 章 网络信息安全概述 1.1.1 网络信息安全相关概念 狭义上的网络信息安全特指网络信息系统的各组成要素符合安全属性的要求&#xff0c;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

使用Vue3和Vue2进行开发的区别

使用Vue3和Vue2进行开发的区别 笔者虽然老早就是用vue3进行开发了&#xff0c;但是上次有人问道使用vue3进行开发跟使用vue2进行开发的区别有哪些这个问题的时候&#xff0c;回答的还是有些琐碎&#xff0c;干脆今天专门整理一下&#xff0c;做个记录。 一、再也不用set了 众所…

项目开发流程规范文档

项目开发流程规范文档 目标: 明确项目组中需求管理人员, 交互设计, 美工以及开发之间的工作输入输出产物. 明确各岗位职责. 以免造成开发, 产品经理以及项目经理之间理解不到位, 沟通成本过高,返工造成资源浪费. 所有环节产生的文档都可以作为项目交付的资源. 而不是事后再补文…

在docker里创建 bridge 网络联通不同容器

1.网络创建&#xff1a; docker network create --subnet192.168.1.0/24 --gateway192.168.1.1 uav_management 2.查看网络&#xff1a; docker network ls 3.给已经创建的容器分配ip: docker network connect --ip 192.168.1.10 uav_management 容器名/容器id 示例&#xf…

【极限编程(XP)】

极限编程&#xff08;XP&#xff09;简介 定义与核心价值观&#xff1a;极限编程&#xff08;Extreme Programming&#xff0c;XP&#xff09;是一种轻量级、敏捷的软件开发方法。它强调团队合作、客户参与、持续测试和快速反馈等价值观&#xff0c;旨在提高软件开发的效率和质…

低代码用户中心:简化开发,提升效率的新时代

随着数字化转型的加速&#xff0c;企业对于快速交付高质量应用的需求日益增长。在这个背景下&#xff0c;低代码开发平台应运而生&#xff0c;成为越来越多企业和开发者的首选工具。今天&#xff0c;我们将聚焦于低代码用户中心&#xff0c;探讨其如何帮助开发者简化流程、提升…

Docker在CentOS上的安装与配置

前言 随着云计算和微服务架构的兴起&#xff0c;Docker作为一种轻量级的容器技术&#xff0c;已经成为现代软件开发和运维中的重要工具。本文旨在为初学者提供一份详尽的指南&#xff0c;帮助他们在CentOS系统上安装和配置Docker及相关组件&#xff0c;如Docker Compose和私有…

Redis 权限控制(ACL)|ACL 命令详解、ACL 持久化

官网文档地址&#xff1a;https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/ 使用版本&#xff1a;Redis7.4.1 什么是 ACL&#xff1f; ACL&#xff08;Access Control List&#xff09;&#xff0c;权限控制列表&#xff0c;是 Redis 提供的一种…

淘宝反爬虫机制的主要手段有哪些?

淘宝的反爬虫机制主要有以下手段&#xff1a; 一、用户身份识别与验证&#xff1a; User-Agent 识别&#xff1a;通过检测 HTTP 请求头中的 User-Agent 字段来判断请求是否来自合法的浏览器。正常用户使用不同浏览器访问时&#xff0c;User-Agent 会有所不同&#xff0c;而爬虫…

2024最新gewe开发微信机器人教程说明

微信时代&#xff0c;越来越多的业务/服务沟通已直接在微信上完成&#xff0c;但在沟通效率及员工管理方面却存在如下问题&#xff1a; 1、现有的微信功能&#xff0c;已无法满足与客户沟通时的高效率要求 2、当员工掌管的微信号若干或更多时&#xff0c;迫切需要有个汇总工具…

Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着科技的飞速发展&#xff0c;人们的…

如何使用Langchain集成Kimi AI(Moonshot AI)

如何使用Langchain集成Kimi&#xff08;Moonshot AI&#xff09; 一、获取API密钥1. 注册账号2. 获取密钥 二、环境配置三、上手四、整合一下五、检验一下成果六、官方网站 一、获取API密钥 1. 注册账号 毕竟只有注册过帐号才能拿到key~ Moonshot 登陆 2. 获取密钥 用户中心…