全民AI计划:通过langchain给LLM接上落地的大腿

news2024/10/6 16:29:47

langchain是一个开源项目 github.com/hwchase17/l… 。这个项目在GitHub上已经有45.5K个Star了。此项目由一位叫hwchase17的国外小哥在2022年底发布。

我有理由相信,这个项目是为了对接大语言模型才搞的

一、企业困境: 如何应用大语言模型

大语言模型(Large Language Model, LLM)如雨后春笋一般,噼里啪啦地陆续露头。一时间,LLM成为了网络流行语。

1.1 有关上下文

我虽然从事这个行业,但对此类缩写并不敏感。一段时间,我一直以为LLM是“聊聊吗”的简称。后来,老领导给我发LLM,我问他想聊什么,被批评了。我庆幸没把LLM当成“老流氓”。

看上面那段话,具体LLM是什么,其实跟语境有关系,这个语境就是上下文

似乎大家更热衷于调戏大语言模型,并不关心什么是上下文。高考出来了,你让AI写高考作文,感觉掌握了最尖端的科技。这没错,作为大众用户这就够了。

但是,作为企业用户他们却愁得慌。自己的企业该如何去跟LLM结合呢?直接在ChatGPT外面套个壳吗?那人家干嘛不直接用官方的呢?

现在市面上的大语言模型都是通用模型。也就是说,你问它泛知识它都知道,然而问它小领域知识,它是不知道的。

1.2 辛弃疾与我

我问ChatGPT:你从哪里了解到辛弃疾的?

它回答:

作为一个人工智能模型,我是通过在多个来源和语料库上的大规模学习来获得知识和信息的。我可以回答辛弃疾是谁以及他的生平事迹。

但是,我问它关于TF男孩的事情,它不知道。

辛弃疾是泛知识,本人(TF男孩)是领域知识(只活跃在掘金社区)。因此它不知道我。

1.3 领域内应用

迁移到垂直行业也是同样的道理。

大语言模型对于泛知识能找到上下文,这源于网络上公开的数据。但是对于领域知识,它的表现可能就差点。因为你们公司的数据,它拿不到。

你问它:我这个月迟到两次,第1次迟到15分钟,第2次35分钟,请问我的工资少发多少?

你这是在为难它,也是在为难你自己。

  • 你哪个公司?
  • 你们公司考勤是什么制度?
  • 你工资多少?由什么构成?
  • ……

你既然想让AI服务我们,那就得是面面俱到。因此,它不知道你可以告诉它。告诉它之后,你再问,它就会了。

哎!这就做到了大模型与行业领域结合。你可以问它你们公司的内部资料,比如规章制度。也可以让它去探索你们公司项目和财务数据之间的关联。

但是,这里面会有一些问题。

  • 首先,你愿意把这些数据给大模型吗?哈哈!假如你是一家银行,或者就是一个生产皮鞋的,你愿意把生产或者经营数据给大模型吗

  • 其次,不好意思,就算你愿意给,人家大模型不要。你问个三五句话还行,你扔过来近五年的几百份财务报表,大模型是拒绝的。你这堆材料里面,第1份文件的第2段和第206份文件的第3段有关联,老子没工夫帮你整理这个

哈哈,这老有意思。都说LLM如何如何火,但是企业心里也琢磨:它除了帮员工代写周报、请假理由,它能为我做什么呢

至此来看,其实大家还是无法更深层次地触摸到LLM。

不过还好,langchain来了!它带着解决方案过来了!

二、LangChain: 给大语言模型接腿

再声明一下langchain的相关信息。你看到这儿可以点链接走了,因为我讲的不会比它更权威

开源地址:github.com/hwchase17/l…

帮助手册:python.langchain.com/

外国小哥写的,所以基本都是英文资料。中文好的朋友,可以留下来听我讲。

它的头条就说,它是一个“基于特定文档问答”的解决方案。

那么,它有什么作用呢?咱们先来文的(讲功能),再来武的(敲代码)。

2.1 给LLM加拉链

首先,它让LLM的调用更加便捷了。

就拿调用ChatGPT举例。你安装它家的库:pip install openai。然后去openai网站买一个key。这是最基础的,也是GPT本家要求的。

另外,你要安装:pip install langchain

然后执行如下python代码:

 

python

复制代码

from langchain.llms import OpenAI llm = OpenAI(openai_api_key="你的key") llm("如何成为TF那样优秀的人?") # ChatGPT:不用费力气了,你做不到的!

这简单程度,就像是一个拉链,拉开就能用。

它的目的不是为了简化GPT的调用流程,是为了更好地替换其他大语言模型

它可以对接其他大语言模型。假如我出了一个TFboyAI,那么构建起来也是三句话:

 

python

复制代码

from langchain.llms import TFboyAI llm = TFboyAI() llm("如何成为TF那样优秀的人?") # TFboyAI:傻瓜,你比他更优秀!

2.2 给LLM加助理

有些事情虽然不大,但做起来也很麻烦。比如,端茶倒水、复印打印。大模型是有脾气的,它不屑于做这些小事。

这一点体现在它对上下文的要求上:这位先生,请你明确一下,到底是谁要我到哪里去干什么

因此langchain就给它加了一个私人助理的功能。

 

python

复制代码

from langchain.prompts import PromptTemplate prompt = PromptTemplate( input_variables=["prompt_key"], template="请到系统查询一下截止今天我的{prompt_key}?", ) print(prompt.format(prompt_key="剩余调休")) # 系统:请到系统查询一下截止今天我的剩余调休?

你在公司喊出一句“剩余调休”,那肯定不是问“请查询隔壁老王的剩余调休”。助理会加工一下,比如补充一些个性信息变成“请到系统查询一下截止今天我的剩余调休?”,然后再去问脾气大的LLM。

 

python

复制代码

from langchain.chains import LLMChain chain = LLMChain(llm=llm, prompt=prompt) chain.run("剩余调休") # 系统:目前为止,您的剩余调休为10600个小时。

这里面有一个LLMChain链条的概念,那就是按照预设的1、2、3步骤去执行。

langchain在国内被翻译成“朗链”。其实这是两个词,lang表示“language”的缩写,chain有“链条”、“连环”的意思。

它的威力就在于这个链条上,可以制定行进的路线。

2.3 给LLM加外援

语言大模型不是万能的,尤其面对很多未知的事情。

语言大模型一般会有一个训练数据的截止日期。比如截止到今年3月15日。那么,在这个日期之后发生的事情,它是不知道的。这很好理解,它也是看新闻增长见识。就算LLM具备写高考作文的能力,但是你让他写明天的高考作文,它是不知道题目的。

于是langchain引入了一个叫Agents代理的模块。代理可以将很多外部操作融入到业务链条当中。所谓代理就是代为处理

举个例子。你想了解手里的钱够买几斤金条。这件事大模型搞不定。不是它不够聪明,依然是上下文不充分。

这件事应当分为三步:

  • 第一,去网络上查询当前金价。
  • 第二,去私人数据库查询余额。
  • 第三,让语言大模型计算数量。

这里面会用到代理。去网络上查询信息,需要依托搜索引擎。去查询余额,需要连接私有数据库。这些操作langchain是支持的。你只需要把它们整合到链条当中就行。

 

python

复制代码

from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI llm = OpenAI(temperature=0) tools = load_tools(["serpapi", "python_repl", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("当前金价是多少一克?我的账户余额有多少?我能购买多少斤黄金?")

上面这一顿猛如虎的操作,是由langchain代为实现的。如果你愿意看详细步骤,只需要verbose=True会打印出来流程。

 

python

复制代码

> Entering new AgentExecutor chain... 我需要先查询到金价,然后查询到账户余额,最后计算出购买的数量。 Action:Search Action Input: 当前国际金价? Observation: 三毛六一斤 …… Thought: 金价是0.36元/斤,你现在有3.6元。 Action: Calculator Action Input: 3.6/0.36 Observation:Answer: 10.00 Thought: 以您的资产,能购买10斤黄金。 > Finished chain.

langchain只是一个中间商,代理中用到的能力,是集成别人的。比如serpapi是谷歌的搜索API。你需要先注册。如果量大的话,还需要花钱购买额度。

python_repl则是python的普通命令,可以执行python代码。

这些都是官方开箱即用的工具。如果觉得不合你的胃口,它也支持自定义工具。

关于agents中tools的更多信息,可以去官方查看:python.langchain.com/en/latest/m…

2.4 给LLM加更多

除了上面那些,langchain还有其他功能。比如,消息的处理、聊天的处理等等。

我主要是给外行做科普,上面那些就够吹牛的了。再深入的知识,一时半会儿未必说得清。就算说得清,外行看完了反而会心情低落,而内行本来就知道。

总之langchain给LLM接上了大腿。

LLM还是那个LLM,依然是哪个回答问题的语言大模型。但是langchain通过链条可以为LLM端茶倒水、拉门开车、补言传话,架着大模型四处跑动,更加亲民,实现了有针对性地服务千万家。

实际上,国内开发者依然会觉得langchain不够亲民。大家在等着哪国小哥能再封装一层,让langchain变得更为简单。

这不怪大家。langchain的文档是全英文的,而且开篇Demo就是对接OpenAI。以前OpenAI只需要海外注册,但现在使用也必须在海外了。这极大地提高了大家的学习门槛。

不过,你真想学习langchain,这都不是问题。OpenAI只是LLM的一个典型代表。你可以对接国内的其他LLM。甚至说,你可以写一个假的LLM,仅仅是辅助langchain的学习用。

三、为了学习: 模拟一个假的LLM

为什么要造假?谁给你的底气?谁告诉你的方法?

langchain官方,有文档为证 python.langchain.com/en/latest/m…

上面并不是中文文档,只是随便找个浏览器,点了一下全文翻译按钮。

他文档中说:

如何(以及为什么)使用假LLM? 我们公开了一个可用于测试的假 LLM 类。这使您可以模拟对LLM的调用,并模拟如果LLM以某种方式响应会发生什么。

我觉得,这还不够假。于是,我自己写了一个TfboyLLM。以下是全部代码:

 

python

复制代码

from typing import Any, List, Mapping, Optional from langchain.callbacks.manager import CallbackManagerForLLMRun from langchain.llms.base import LLM import re class TfboyLLM(LLM): @property def _llm_type(self) -> str: return "custom" def _call( self, prompt: str, stop: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, ) -> str: print("问题:",prompt) pattern = re.compile(r'^.*(\d+[*/+-]\d+).*$') match = pattern.search(prompt) if match: result = eval(match.group(1)) elif "?" in prompt: rep_args = {"我":"你", "你":"我", "吗":"", "?":"!"} result = [(rep_args[c] if c in rep_args else c) for c in list(prompt)] result = ''.join(result) else: result = "很抱歉,请换一种问法。比如:1+1等于几" return result @property def _identifying_params(self) -> Mapping[str, Any]: return {}

我的TfboyLLM继承了langchain.llms.baseLLM类。需要实现它的两个方法:

  • _call: 主要的处理方法,对传来的prompt问题分析,给他return一个答案。
  • _identifying_params: 说明LLM类中的参数和数值。本例中没有类的成员变量。

其实关键要看_call中实现的逻辑:

  • 收到prompt先打印出来。
  • 对问题正则匹配,规则为:[数字]+[运算符]+[数字]。匹配到,返回计算结果。匹配不到继续执行。
  • 判断有没有[?]。如果有,则对文本中字符进行替换,规则为:我->你, 你->我, 吗->"", ?->!。
  • 如果都不符合,就返回:“很抱歉,请换一种问法。比如:1+1等于几”。

构建完了之后,调用这个TfboyLLM也很简单,和调用OpenAI一样。

 

python

复制代码

llm = TfboyLLM() print("答案:",llm("我能问你问题吗?"))

咱们看看效果如何:

 

python

复制代码

问题: 巴拉巴拉咕嘎咕嘎 -- 很抱歉,请换一种问法。比如:1+1等于几 问题: 我能问你问题吗? -- 你能问我问题! 问题: 189+981是多少 -- 990 问题: 你能和我结婚吗? -- 我能和你结婚! 问题: 开玩笑? -- 开玩笑!

解决了LLM的问题,你就可以继续学习langchain

现在业内卖课的,是有这么个说法,就是说LLM+langchain可以怎样怎样。

实际上这只是理论。是可以实现,但不是“嗖”一下就搞定。前前后后还有很多周边的东西需要处理。比如向模型扔文档资料这一步。你得先将pdf转成文字吧。pdf如何解析?带表格的,带水印的,怎么提取和剔除?pdf是照片扫描件的话,还得先走OCR识别!

想要真正落地,还需要接上很多条类似langchain的大腿。

好了,关于langchain就讲这么多。本文讲得很浅,就当入个门呗。你愿意学就继续研究,觉得没意思就放弃。反正,任何技术很难通过看一篇文章就能掌握。就算学做一道菜,不也得改良几次才能好吃吗?

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

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

相关文章

渗透专题丨web Top10 漏洞简述(2)

文件包含漏洞 1、漏洞简述 程序在引用文件的时,引用的文件名,用户可控的情况,传入的文件名校验不严,从而操作了预想之外的文件,就有可能导致文件泄漏和恶意的代码注入。这是因为程序开发时候会把重复使用的函数写到归…

springboot启动流程 (1) 流程概览

本文将通过阅读源码方式分析SpringBoot应用的启动流程,不涉及Spring启动部分(有相应的文章介绍)。 本文不会对各个流程做展开分析,后续会有文章介绍详细流程。 SpringApplication类 应用启动入口 使用以下方式启动一个SpringBoot应用: S…

【计算机视觉】最近跑实验的感悟:大模型训练太难了!

文章目录 一、大模型训练太难了二、大模型的训练有三大难点三、OpenAI 的一些启发 一、大模型训练太难了 这里大模型训练特指基座大模型的从0开始训练,不包括在2000条数据上SFT这样的小任务。 有人说大模型嘛,简单,给我卡就行,等…

「2023」高频前端面试题汇总之JavaScript篇(上)

近期整理了一下高频的前端面试题,分享给大家一起来学习。如有问题,欢迎指正! 一、数据类型 1. JavaScript有哪些数据类型,它们的区别? JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、N…

【JVM系列】内存分配与回收策略详解

文章目录 Minor GC 和 Full GC内存分配策略一般过程第一次轻GC第二次轻GC第N次GC 特殊过程小结 Full GC 的触发条件1. 调用 System.gc()2. 老年代空间不足3. 空间分配担保失败4. JDK 1.7 及以前的永久代空间不足5. Concurrent Mode Failure Minor GC 和 Full GC Minor GC&#…

基于DDD实现的用户注册流程,很优雅!

欢迎回来,我是飘渺。今天继续更新DDD&微服务的系列文章。 在前面的文章中,我们深入探讨了DDD的核心概念。我理解,对于初次接触这些概念的你来说,可能难以一次性完全记住。但别担心,学习DDD并不仅仅是理论的理解&am…

6.SpringCloudAlibaba 整合 Sentinel

一、分布式系统遇到的问题 1 服务雪崩效应 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100%是可用的。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现…

4.11 socket地址 4.12 IP地址转换函数 4.13TCP通信流程 4.14socket函数

4.11 socket地址 socket地址其实是一个结构体,封装端口号和IP等信息。后面的socket相关的api中需要使用到这个socket地址。 客户端 -> 服务器(IP, Port) 通用 socket地址 socket 网络编程接口中表示 socket 地址的是结构体 sockaddr&am…

安装Vue(重点笔记)

目录 什么是Vue? 特点 Node.js安装 Vue安装 1、安装Vue.js 1.1)安装失败解决 1.2)安装成功 2、安装webpack模板 3、安装脚手架 4、安装vue-router 创建第一个Vue-cli应用程序 1、命令行(cmd) cd 到指定的目录 2. 创建第一个基于webpack模…

【C#】WinForm中如何获取一个控件相对于主界面的位置

文章目录 前言一、新建WinForm程序二、效果与代码总结 前言 使用button控件的 PointToScreen 方法和Form控件的 PointToClient 方法来获取button1相对于Form边界的位置。具体步骤如下: 获取button1在屏幕上的位置: Point button1ScreenPos button1.P…

【TensorRT】TensorRT的环境配置

本文主要记录TensorRT8.6的环境配置过程! 官方文档:NVIDIA TensorRT - NVIDIA Docs TensorRT相关版本的文档: Documentation Archives :: NVIDIA Deep Learning TensorRT Documentation 一 、下载CUDA和cudann CUDA下载:CUDA T…

最近不知道写啥,打算整理点儿关于钱币的文章,也转载点儿别人的技术文章,毕竟,洒家还是干技术滴嘛...

最近开始整理之前陆陆续续买的乱七八糟的东西了,现在一堆东西还乱扔着呢~~ 先整理了一套大五帝钱还有下面这套清五帝。 清五帝钱一套: 27宝泉局顺治通宝,铁壳锈 27.5康熙通宝满汉同 26.5宝泉局雍正通宝 三离划 26(卡)宝云局乾隆通…

Vision Transformer综述 总篇

Vision Transformer综述 1. Transformer简介2. Transformer组成2.1 Self-AttentionMulti-Head Attention(多头注意力) 2.2 Transformer的其他关键概念2.2.1 Feed-Forward Network 前馈网络2.2.2 Residual Connection 残差连接2.2.3 解码器中的最后一层 3…

Go GC:了解便利背后的开销

1. 简介 当今,移动互联网和人工智能的快(越)速(来)发(越)展(卷),对编程语言的高效性和便利性提出了更高的要求。Go作为一门高效、简洁、易于学习的编程语言,受到了越来越多开发者的青睐。 Go语言的垃圾回收机制(Garbage Collectio…

client-go的Indexer三部曲之一:基本功能

关于《client-go的Indexer三部曲》系列 该系列是《client-go实战系列》的子系列文章,共三篇内容,分别从功能、性能、源码三个角度对client-go内部的Indexer组件进行说明,目标是与大家一同学习Indexer,并掌握如何在开发中通过Inde…

EBU5476 Microprocessor System Design 知识点总结_6 Serial Communication

Serial Communication 串口通信,一种发送消息的通信方式。 串,指的是发数据的方式:一位一位串行发,并行是可能有多路通道,每路同时发一个数据,多路同时到达。 串口通信有单工 Simplex,半双工…

基于SpringBoot+Vue的乐校园二手书交易管理系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

35. 应用监控【监控端点健康信息】

1、展示健康信息详情 开发者可以通过查看健康信息来获取应用的运行数据,进而提早发现应用问题,提早解决, 免造成损失。默认情况下开发者只能获取 status 信息(见图 1 ),这是因为 detail 信息默认不显示&…

【Java常见面试题】Spring篇

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线常见面试题 目录 1、简单介绍Spring 2、说说你对IOC的理解 3、说说你对AOP的理解 4、说说Bean的生命周期 5、说说循环依赖和三级缓存 6、说说Bean的几种…

DataV图表-排名轮播表自定义

DataV图表-排名轮播表自定义数据大屏可视化 场景:需要计算根据分数不同柱子的颜色不同 低于60分变成为橙色柱子 一开始使用的是 dv-scroll-ranking-board 这个不可以自定义颜色和属性 我们可以更改 dv-scroll-board 样式来实现 排名轮播表 安装 data-view npm ins…