大模型框架LangChain开发实战(一)

news2024/11/18 19:30:47

一、概述

在大模型应用中,通常是基于框架来呼叫模型的,大模型提供了两个最重要的功能,一是提供了具体的intermediate steps(即做事情的中间步骤,模型作为reasoning engine),二是提供了evaluation的能力(模型作为evaluation tool),在此基础上,对于用户来说,重要的是写好你的prompt,通过它下指令让模型做一些事情。除了模型之外,还有agent(智能体),它本身会不断地进行循环,基于模型产生的步骤以及对效果的评估,不断地调整agent的执行,这个调整可能是与第三方工具进行交互,也可能是与第三方数据进行交互(不是指模型的数据,而是用户自己的私有数据,譬如类似profile的数据)。从企业级开发的角度来说,最重要的是要有一个类似代理的智能体(agent),负责与模型进行交互(agent会不断循环查看模型中间执行的一些结果),并且如果有必要,agent会根据模型的信息调用第三方工具或者访问用户私有数据,另外也可以跟tools进行交互。从业界的最佳实践看,一般都会把上述agent的这些功能封装进framework,目前最流行的framework就是LangChain,这是开源界公认的最好的大模型框架,也是工业界采用最广泛的大模型框架,同时也是学术界认可度最高的大模型框架。

二、企业级大模型框架LangChain解析

通常在一段对话流中,会包括历史会话信息(historic data),当前的对话信息(current utterance),历史会话信息会影响到当前的对话(作为上下文存在),历史会话信息不是简单地追加到当前会话输入后面来传给模型,因为这样做会使模型需要处理的输入tokens越来越多,导致效率和成本的问题,更致命的是会导致prompt的质量问题(当historic data较多时,可能current utterance输入根本不起什么作用)。prompt首先是从你的用词中找出隐性或者显性的patterns,然后基于patterns来提取关键信息,如果只是简单的追加(appended to historic data),可能就会导致模型使用prompt时忽略当前的输入信息,从而表现出用户与模型对话时模型不会给到用户相应的反馈,因此需要在生成prompt之前添加一个standalone service,它会突出当前的用户输入信息(因为模型要回答当前的问题),同时又基于historic data或者系统的设定提供相应的上下文。另外,由于存在企业私有数据,standalone service也需要和这些数据进行交互。历史数据,当前用户输入和企业私有数据三者结合形成了企业级的prompt,然后才与大模型进行交互(中间存在一个循环的过程)。基于以上分析得到下面的对话流程图:

以上流程图所展示的内容还不足以构成企业级的基于大模型的应用程序开发,因为在这个流程图中还缺少两个重要的元素:工具和第三方数据,举个例子来说,如果我们针对学生做一个阅读理解方面的应用(阅读理解本身是文字,但是应用开发可能涉及到多模态),那可能需要访问wikipedia或者其它的一些(学校的)系统的数据来增强学生的理解,也有可能是转换为音频的方式,也有可能是补充图片或者视频的方式,这就涉及到工具和数据。我们需要一个容器来完成模型、工具和数据的交互,而这就是LangChain,你可以认为LangChain是大模型开发时代的operating system,因为它驱动了所有模块和数据的相互交互。在这样的一个框架中,有这样一个东西称作agent,目前来看agent还是一个很开放的领域,其本身的作用是基于模型驱动的做事情的具体过程,来在适当的时候使用工具或者本地数据,或者第三方数据来完成模型设定的步骤,这样的一个agent具有动态调整的过程,可以把它看成一个loop,它既能与模型,数据,工具进行交互,又能处理异常,以及评估整个系统的行为。一句话来总结LangChain,它就是一个service,一个framework,或者一个platform,它通过模型驱动来整合数据和工具,从而完成大模型应用的开发。

以下是更新后的基于LangChain来开发的大模型对话应用流程图:

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

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

相关文章

vue3实现容器内容滚动到底,触底加载新数据

scroll方式实现 在Vue3中&#xff0c;可以使用ref和onMounted钩子函数获取容器元素并监听滚动事件&#xff0c;判断内容是否滚动到了底部&#xff0c;从而触发加载新数据。 以下是一个简单的示例代码&#xff1a; <template><div class"container" ref&…

Kafka的底层“真面目”

简介 kafka是一个分布式消息队列。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息&#xff0c;消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。 kafka对外使用topic的概念&#xff0c;生产者往topic里写消息&…

并查集路径压缩(Java 实例代码)

目录 并查集路径压缩 Java 实例代码 UnionFind3.java 文件代码&#xff1a; 并查集路径压缩 并查集里的 find 函数里可以进行路径压缩&#xff0c;是为了更快速的查找一个点的根节点。对于一个集合树来说&#xff0c;它的根节点下面可以依附着许多的节点&#xff0c;因此&am…

Redis数据结构之String

String 类型是 Redis 的最基本的数据类型&#xff0c;一个 key 对应一个 value&#xff0c;可以理解成与Memcached一模一样的类型。 String 类型是二进制安全的&#xff0c;意思是 Redis 的 String 可以包含任何数据&#xff0c;比如图片或者序列化的对象&#xff0c;一个 Redi…

【Redis从头学-6】Redis中的Hash数据类型实战场景之购物车

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Re…

如何使用媒体查询(media query)来适配不同设备上的样式?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用媒体查询适配不同设备上的样式⭐ 基本语法⭐ 示例⭐ 常见的媒体特性⭐ 创建响应式布局⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来…

(2)、将SpringCache扩展功能封装为starter

(2)、将SpringCache扩展功能封装为starter 1、准备工作 前面我们写了一个common-cache模块,尽可能的将自定义的RedisConnectionFactory, RedisTemplate, RedisCacheManager等Bean封装了起来。 就是为了方便我们将其封装为一个Starter。 我们这里直接《SpringCache+Redis实…

LLM 生成式配置的推理参数温度 top k tokens等 Generative configuration inference parameters

在这个视频中&#xff0c;你将了解一些方法和相关的配置参数&#xff0c;这些参数可以用来影响模型在下一个词生成时的最终决策方式。如果你在Hugging Face网站或AWS的游乐场中使用过LLMs&#xff0c;你可能已经看到了这些控制选项&#xff0c;用来调整LLM的行为。每个模型都暴…

Communication Channels

沟通渠道 n * (n - 1) / 2 你1 相关方3 4 4 * 3 / 2 6 你1 相关方3 相关方1 5 5 * 4 / 2 10 人越多&#xff0c;沟通渠道越多&#xff0c;沟通成本理论越高

Qt文件系统操作和文件的读写

一、文件操作类概述 QIODevice&#xff1a;所有输入输出设备的基础类 QFile&#xff1a;用于文件操作和文件数据读写的类QSaveFile&#xff1a;用于安全保存文件的类QTemporaryFile&#xff1a;用于创建临时文件的类QTcpSocket和QUdpSocket&#xff1a;分别实现了TCP和UDP的类…

CSSCI、北核期刊投稿指南(2023年更新)

该数据为经管类的期刊投稿指南&#xff0c;包含发表难度&#xff0c;文章数量&#xff0c;影响因子&#xff0c;用户评价等指标。共5份文件&#xff0c;分别为国内所有期刊信息库、投稿指南&#xff08;CSSCI版本、CSSCI扩展版本、北大核刊版本、建议期刊版本&#xff09; 一、…

Risk Probability

风险概率计算 sum p1 * v1 p2 * v2 p3 * v3 ... pn * vn

memmove的实现与使用

memmove与memcpy相比&#xff0c;可以实现同一数组的赋值 memmove要点 1.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 2.如果源空间和目标空间出现重叠&#xff0c;就得使用memmove函数处理。 函数实现 void* my_memmove(void* dest, void* sor…

【无监督】5、DINO | 使用自蒸馏和 transformer 来释放自监督学习的超能力(ICCV2021)

文章目录 一、背景二、相关工作三、方法四、效果 论文&#xff1a;Emerging Properties in Self-Supervised Vision Transformers 代码&#xff1a;https://github.com/facebookresearch/dino 出处&#xff1a;ICCV2021 | FAIR DINO&#xff1a; self-DIstillation with NO …

Ubuntu服务器service版本初始化

下载 下载路径 官网&#xff1a;https://cn.ubuntu.com/ 下载路径&#xff1a;https://cn.ubuntu.com/download 服务器&#xff1a;https://cn.ubuntu.com/download/server/step1 点击下载&#xff08;22.04.3&#xff09;&#xff1a;https://cn.ubuntu.com/download/server…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)一(112)

需求&#xff1a;&#xff1a; 有一个List<Map<String.Object>>,存储了某年某月的数据&#xff0c; 数据是根据用户查询条件进行显示的&#xff1b;所以查询的数据是动态的&#xff1b;需按月份统计每个年月数据出现的次数&#xff0c;并且按照月份排序&#xff1…

Oracle19c-补丁升级报错合集(一)

前言: 本文主要介绍Oracle19c补丁升级遇到的问题&#xff0c;涉及安装补丁prepatch步骤&#xff0c;apply应用报错以及datapatch -verbose数据字典更新报错 问题一: 在执行补丁rootcrs.sh -prepatch操作时&#xff0c;发生执行检查命令cluutil -chkshare报错 CLSRSC-180: An …

春秋云镜 CVE-2019-9042

春秋云镜 CVE-2019-9042 Sitemagic CMS v4.4 任意文件上传漏洞 靶标介绍 Sitemagic CMS v4.4 index.php?SMExtSMFiles 存在任意文件上传漏洞&#xff0c;攻击者可上传恶意代码执行系统命令。 启动场景 漏洞利用 login进入登陆界面admin/admin 访问http://eci-2zebi1tekpr…

什么是BEM命名规范?为什么要使用BEM命名规范?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ BEM命名规范⭐ 为什么使用BEM命名规范&#xff1f;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为…

ROS_LINUX学习笔记=2=

B站ros入门教程 rqt_robot_steering 控制小乌龟 在index ros .rog中查找相关的包&#xff1a;rosindex 下图是rqt_robot_steering的简介 其中可以查看github源码地址 website可以查看效果图 下载相关的包 sudo apt install ros-kinetic-rqt-robot-steering roscore打开ros核…