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,一经查实,立即删除!

相关文章

lsblk 命令学习

一、命令介绍 lsblk(list block devices) 是一个用于列出块设备的命令,它提供了关于系统中所有块设备的详细信息。块设备包括硬盘、分区、磁盘镜像文件等。lsblk 命令非常有用,特别是在需要查看和管理存储设备时。 $ lsblk NAME MAJ:MIN RM SIZE RO…

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]] ...-…

windows C#-析构元组和其他类型(下)

用户定义类型的扩展方法 如果没有创建类、结构或接口,仍可通过实现一个或多个 Deconstruct 扩展方法来析构该类型的对象,以返回所需值。 以下示例为 System.Reflection.PropertyInfo 类定义了两个 Deconstruct 扩展方法。 第一个方法返回一组值&#x…

Linux 经典面试八股文

快速鉴别十个题 1,你如何描述Linux文件系统的结构? 答案应包括对/, /etc, /var, /home, /bin, /lib, /usr, 和 /tmp等常见目录的功能和用途的描述。 2,在Linux中如何查看和终止正在运行的进程? 期望的答案应涵盖ps, top, htop, …

香港服务器网络延迟的测量指标包括哪些?

网络延迟是影响香港服务器性能和用户体验的关键因素。网络延迟是指数据包从源头传输到目的地所需的时间。延迟的产生可能受到多种因素的影响,包括网络拥塞、传输媒介、路由器处理时间等。理解延迟的不同测量指标是评估和优化网络性能的重要基础。 主要测量指标&…

各种网络设备的工作原理

网络设备的工作原理涉及多种设备,包括路由器、交换机、防火墙等,它们各自承担着不同的功能。以下是对这些设备工作原理的详细解释: 一、路由器路由器是互联网通信中的关键设备,它负责在不同网络之间传输数据包。功能:路…

GEE 使用 JavaScript 中的 API 自动删除文件夹内的所有资产

目录 简介 函数 ee.data.listAssets(parent, params, callback) Arguments: Returns: api.ListAssetsResponse ee.data.deleteAsset(assetId, callback) Arguments: forEach(outputNames) Arguments: Returns: Reducer 代码 简介 使用 JavaScript 中的 API 自动删除…

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;即机密性、完整性、可用性、抗抵赖性、可控性。 广义上的网络信息安全是涉及国家安全、城市安全、经济安全、社会安全、生产安全、人身安…

【ChatGPT】让ChatGPT在回答中附带参考文献与来源

让ChatGPT在回答中附带参考文献与来源 在撰写内容时&#xff0c;引用参考文献和来源可以增强信息的可信度和权威性。通过引导ChatGPT生成带有参考文献的回答&#xff0c;用户能够获取更可靠的信息和背景资料。本文将探讨如何有效地引导ChatGPT在回答中附带参考文献与来源。 一…

Flutter鸿蒙next 中的 Expanded 和 Flexible 使用技巧详解

在 Flutter 开发中&#xff0c;Expanded 和 Flexible 是两个非常常用的布局控件&#xff0c;它们可以帮助开发者更加灵活地管理 UI 布局的空间分配。虽然它们看起来非常相似&#xff0c;但它们的功能和使用场景有所不同。理解这两者的区别&#xff0c;能帮助你在构建复杂 UI 布…

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

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

项目开发流程规范文档

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

springcloud各组件说明

Spring Cloud 是一个构建分布式微服务架构的开源框架&#xff0c;提供了一系列的组件和工具&#xff0c;用于实现服务治理、负载均衡、服务调用、断路器、API网关、配置中心、链路追踪等功能。 1. Eureka - 服务注册与发现 原理 Eureka 是 Netflix 开源的一个服务发现组件&am…