LLM意图识别器实践

图片利用 Ollama 和 LangChain 强化条件判断语句的智能提示分类

本文译自Supercharging If-Statements With Prompt Classification Using Ollama and LangChain一文,以Lumos工具为例,讲解了博主在工程实践中,如何基于LangChain框架和本地LLM优雅实现了通用的意图识别工具。

简短回顾 Lumos! 🪄

我以前写过不少关于 Lumos 的内容,所以这次我就简短介绍一下。Lumos 是一个基于本地大型语言模型(LLM)开发的网页浏览辅助工具,呈现为 Chrome 浏览器插件形式。它可以抓取当前页面的内容,并把抓取的数据在一个在线内存 RAG 工作流中处理,一切都在一个请求上下文内完成。Lumos 建立在 LangChain 基础上,并由 Ollama 本地LLM驱动,开源且免费。

Lumos 擅长于大型语言模型(LLM)所擅长的任务,比如:

  • 摘要新闻文章、论坛帖子与聊天历史
  • 关于餐厅和产品评价的查询
  • 提取来自密集技术文档的细节

Lumos 甚至帮我优化了学习西班牙语的过程。该应用的操作逻辑极其方便。随着我不断深入使用这个应用,我也渐渐发掘出用LLM在浏览器中的新奇用法。

重建计算功能 🧮

在处理文本任务时,LLM 既有创意又灵巧。但它们的设计原则不是基于确定性Andrej Karpathy 曾将大型语言模型形容为 “dream machines”。因此,像 456*4343 这样简单的运算,LLM无法通过预测模型给出正确的回答。对于一个包含众多数值和符号的复杂方程,即便是最高级的模型也可能力不从心。

456*4343 — 56/(443-11+4) 等于多少?

图片GPT-3.5 错误地“计算”了 456*4343

图片Llama2 错误地“计算”了 456*4343

LLMs 在处理特定任务时需要借助额外的工具,比如执行代码或解决数学问题等。Lumos 也是如此。我不记得为什么需要在浏览器里快速使用计算器了(或许是计算税收?),但我知道我不想拿出手机或另开一个标签页。我只是希望我的 LLM 能准确解答数学问题。

所以,我决定把一个计算器集成到 Lumos 里。

借助 Ollama 进行提示分类 🦙

我之前用 Ollama 做了提示分类的实验并发现这个技术相当有用。如果可靠的话,“分类提示”的输出可以强化条件判断语句和逻辑分支。

虽然 Lumos 并没有基于 LangChain Agent 实现,但我希望用户使用它的体验能和与 Agent 互动一样流畅。它应能够在不需明确的指示下独立执行各种工具。应用程序应当能自动识别何时需要使用计算器。利用 Ollama 来判断是否需要计算器工具的实施是轻而易举的。

参考以下代码示例:

const isArithmeticExpression = async (
  baseURL: string,  
  model: string,  
  prompt: string,
): Promise<boolean> => {
  // 检查开头的触发指令  
  if (prompt.trim().toLowerCase().startsWith("calculate:")) {  
    return new Promise((resolve) => resolve(true));  
  }  
  
  // 否则,尝试分类当前提示  
  const ollama = new Ollama({ baseUrl: baseURL, model: model, temperature: 0, stop: [".", ","]});  
  const question = `以下提示是否代表含有数字和运算符的数学方程式?请用'是'或'否'来回答。\n\n提示: ${prompt}`;  
  return ollama.invoke(question).then((response) => {
    console.log(`isArithmeticExpression 分类结果: ${response}`);    
    const answer = response.trim().split(" ")[0].toLowerCase();    
    return answer.includes("yes");  
  });
};

只需询问大型语言模型,该提示是否为一个含有数字和运算符的数学方程,并检查返回的内容是否含有“是”或“否”。过程非常直接。这种实现即使在没有 JSON 模式和函数调用时也相当可靠。与让模型分类多个可能无关的类别相比,直接要求 LLM 对话给出二进制反应相比,更简单直接。我们在测试中的 Llama2 和 Mistral 都表现出色。将模型温度设为0,并配置结束序列如 [".", ","],能进一步提高响应速度和可靠度。相较于用户平时遇到的几秒钟的响应时间,这种分类所增加的延迟可以忽略不计。当然,对于某些应用来说,这点额外的等待时间或许还不够。

图片Lumos 控制台日志

我们还要特别强调,利用本地 LLMs,这个操作基本上是零成本的。Ollama 在这种情况下的实用性得到了充分的体现。为了让用户能最大程度地控制,我们还设有触发器选项,用户可通过在提示中加上特定的前缀来确保触发相应工具的执行。这与 ChatGPT 通过 @ 符号调用特定 GPT 功能相似。

456 x 4343 =1980408 🔢

图片Lumos 正确计算出 456*4343

Lumos 的计算器 设计得非常直观。它是以 LangChain 工具(Tool)的形式构建的,这样未来可以方便地将应用整合进更强大的 Agent 系统中。对于自定义工具,虽然 LangChain 推荐开发 DynamicToolDynamicStructuredTool,直接继承 Tool 基类同样简洁易行。

参见以下代码:

在这里插入图片描述

当 Lumos 接收到一个类似数学方程的提示,不管它的复杂程度如何,它都能自动判定调用计算器。

扩展分类技巧处理复杂条件 🌲

这种为多种模式功能而复现的分类技术,比如Lumos 的多模式能力,就能够在用户需要时从网页上下载图像。反之,如果不需要,则出于效率考虑,跳过下载过程。我决定用一个可配置的函数来普适化这种方法。

参见以下代码:

在这里插入图片描述

现在 classifyPrompt() 能够接收一个“分类提示”以及一个触发器参数。这个函数可以在整个应用程序代码中被复用。

在这里插入图片描述

把分类结果纳入条件判断语句是个自然、简单并且有效的做法。采用这种方法,软件开发者能够完全掌握应用程序的运作流程。到一定程度上,依赖于 LLM 的编程逻辑现在变得可测试了。

Lumos 在决定是否下载图像的时候,不仅考虑了分类结果,还把用户的一些配置选项考虑在内。更复杂的是,结合复杂应用状态(比如用户配置、访问控制、缓存状态等)和分类结果进行一致决策对于 LLM 来说,在大规模应用上会更有挑战。

这种方法可能被用于同时对多个 LLM 功能进行 A/B 测试。对于某些敏感领域,比如需要特定授权执行工具的情况或对 RAG 功能需要特定数据权限访问,这种设计方式看起来非常合适。我们不会让任何重要决策留给偶然。

Lumos 未来将如何发展?🔮

从短期来看,我将继续探索将更多工具集成进 Lumos。我将考虑迁移至 Agent 架构,并着手解决本地 LLM 应用运行时的效率和速度挑战。

长远来讲,还有更大的机遇值得我们考量。Chrome 插件固然强大,但其能力终究有限。当我们在思索将 LLM 运用到浏览器中的新场景时候,或许有必要完全打造一个全新的浏览器。目前而言,这些尚只是构想。暂且让我们享受在这个创新激动人心的时代开发 LLM 应用的过山车旅程,有了 LangChain 和 Ollama,这趟旅程会更加顺畅。😎

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

011、MongoDB副本集数据同步机制深度解析

目录 MongoDB副本集数据同步机制深度解析 1. 副本集架构概述 1.1 基本组成 1.2 节点角色 2. 数据同步过程详解 2.1 初始同步 2.2 持续复制 2.3 Oplog详解 3. 数据一致性与可用性 3.1 写关注(Write Concern) 3.2 读偏好(Read Preference) 3.3 因果一致性会话 4. 高…

SuperMap iDesktop

SuperMap iDesktop 介绍 SuperMap iDesktop是一款由超图公司推出的企业级插件式桌面GIS软件&#xff0c;它通过SuperMap iObjects .NET、桌面核心库和.NET Framework 4.0构建&#xff0c;集成了地图制作、空间分析、数据编辑、三维分析等多种功能于一体&#xff0c;为用户提供…

驾校预约小程序系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学员管理&#xff0c;教练管理&#xff0c;驾校信息管理&#xff0c;驾校车辆管理&#xff0c;教练预约管理&#xff0c;考试信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;驾校信息&am…

虚拟化 之八 详解构造带有 jailhouse 的 openEuler 发行版(ARM 飞腾派)

概述 本文将探索学习通过移植适配 yocto-meta-openeuler 这个 Layer 进而使用 oebuild 直接构建一个适用于飞腾派开发板的带有 jailhouse 的 openEuler 发行版。并且通过移植一个独立的 jailhouse 的 Recipe 文件进而不依赖于 openEuler 官方的 MCS 这个框架(该框架目前本身也…

期末考试后,老师如何私发成绩?

期末考试的钟声一响&#xff0c;学生们如释重负&#xff0c;而老师们的工作却才刚刚开始。成绩的整理、再到成绩单发放&#xff0c;每一步都格外繁重。传统的成绩单发放方式&#xff0c;需要老师一个个私信给学生家长&#xff0c;耗时耗力&#xff0c;而且容易出错。在忙碌的期…

数字信号处理实验一(离散信号及离散系统的MATLAB编程实现)

实验要求&#xff1a; 离散信号及离散系统的MATLAB编程实现&#xff08;2学时&#xff09; 要求&#xff1a; 编写一程序&#xff0c;输出一定长度&#xff08;点数&#xff09;&#xff0c;具有一定幅度、&#xff08;角&#xff09;频率和初始相位的实&#xff08;或复&…

第四节:如何使用注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上一节学习了如何理解Spring的两个特性IOC和AOP&#xff0c;这一节来基于上节的内容进行一个简单实践。这节要实现的效果是通过IOC容器获取到Bean&#xff0c;并且将Bean的属性显示打印出来。 第一步&#xff1a;创建pojo实体类stu…

FreeSWITCH 1.10.10 简单图形化界面24-呼入呼出编码

FreeSWITCH 1.10.10 简单图形化界面24-呼入呼出编码 FreeSWITCH GUI界面预览00、安装FreeSWITCH GUI先看使用手册1、语音接听还是视频接听2、排查 FreeSWITCH GUI界面预览 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin FreeSWITCH…

讨论stl链表

讨论链表 list迭代器失效list的模拟实现创建结点类链表迭代器完成实现代码 list与vector 链表是一个序列容器&#xff0c;在任意位置都可以用常数时间插入或者删除&#xff0c;并且可以在两个方向进行迭代。 list迭代器失效 迭代器失效指迭代器所指向的结点无效&#xff0c;即该…

数据结构7---图

一、定义 对于图的定义&#xff0c;我们需要明确几个注意的地方:一线性表中我们把数据元素叫元素&#xff0c;树中叫结点&#xff0c;在途中数据元素我们则称之为顶点(Vertex)。 对于图的定义&#xff0c;我们需要明确几个注意的地方: 线性表中我们把数据元素叫元素&#xf…

通过systemctl启停tomcat

目录 目的.service配置文件的结构介绍实验步骤1. 安装java2. 二进制安装tomcat3. 编写/usr/systemd/system/tomcat.service文件4. 测试启动关闭 目的 通过二进制安装的tomcat&#xff0c;只能通过tomcat文件目录下的.sh脚本进行启停。 而我们一般使用的服务&#xff0c;是通过…

kubuadm 方式部署 k8s 集群

准备三台机器 主机名IP地址CPU/内存角色K8S版本Docker版本k8s231192.168.99.2312C4Gmaster1.23.1720.10.24k8s232192.168.99.2322C4Gwoker1.23.1720.10.24k8s233192.168.99.2332C4Gwoker1.23.1720.10.24 需要在K8S集群各节点上面安装docker&#xff0c;如未安装则参考 …

探究互联网领域知识,解密数字化时代神秘面纱

随着信息时代的不断发展&#xff0c;互联网的发展呈现出爆炸式的增长&#xff0c;以至于引起广泛的关注和深入的探究。互联网作为一个庞大的网络体系&#xff0c;涵盖着无穷无尽的信息和知识&#xff0c;其背后的科技和应用已经改变了人们的生活&#xff0c;产生了翻天覆地的变…

使用java代码实现GUI画面的简易项目操作

要使用Java创建一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;我们可以使用Swing库&#xff0c;它是Java提供的一个标准GUI工具包。以下是一个简单的Java Swing程序示例&#xff0c;它创建了一个窗口&#xff08;JFrame&#xff09;&#xff0c;并在其中添加了一个标…

Ubuntu系统,实现FastDDS的源码编译

目录 一、Ubuntu系统介绍二、FastDDS是什么三、FastDDS的源码编译四、FastDDS的简单测试 一、Ubuntu系统介绍 Ubuntu是一个基于Linux的开源操作系统&#xff0c;由Canonical公司开发和维护。它以其易用性、稳定性和安全性而受到广泛赞誉。Ubuntu系统提供了一个图形化的桌面环境…

深入解析链表:解锁数据结构核心奥秘

一. 链表的定义 链表是一种线性数据结构&#xff0c;由一系列节点组成。每个节点包含两个部分&#xff1a; 数据域&#xff08;Data&#xff09;&#xff1a;存储节点的数据。指针域&#xff08;Pointer&#xff09;&#xff1a;存储指向下一个节点的地址。 链表的第一个节点…

微信小程序开发_准备工作

1 注册小程序 注册地址 https://mp.weixin.qq.com/wxopen/waregister?actionstep1&sourcempregister&token&langzh_CN 2 完善小程序信息 进入微信公众平台https://mp.weixin.qq.com/,登录账号 登录后,在首页完善小程序信息和小程序类目 完成后在左侧找到开发…

权威认可 | Smartbi连续5年入选“Gartner增强数据分析代表厂商”

近日&#xff0c;全球权威技术研究与咨询公司Gartner最新发布《2024 年中国数据、分析和人工智能技术成熟度曲线》&#xff0c;Smartbi以其卓越的增强数据分析及自助分析能力&#xff0c;再次入选代表厂商&#xff0c;这也是Smartbi连续5年入选增强数据分析及自助分析代表厂商&…

优选算法2

五、位运算 常见位运算总结 &&#xff1a;有0就是0&#xff1b; |&#xff1a;有1就是1 ^&#xff1a;相同为0&#xff0c;相异就是1/无进位相加 给定一个数n,确定它的二进制表示中的第x位是0还是1&#xff1a;二进制中权值最小的是第0位&#xff0c;所以int整型是从第0位到…

os实训课程模拟考试(选择题复习)

目录 一、操作系统的基本功能和设计目标 &#xff08;1&#xff09;基础知识 &#xff08;2&#xff09;题目与答案 1、操作系统是一组 B &#xff08;单选&#xff09; 2、以下哪项不是操作系统关心的主要问题&#xff1f;D &#xff08;单选&#xff09; 3、下列关于…