有兄弟让我讲讲langchain

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

哈哈,我又没出镜,他怎样看出我说话好听的?不过,我却是喜欢写我们关怀的。下面就聊聊这个langchain

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男孩的工作,它不知道。

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

辛弃疾是泛常识,本人(TF男孩)是范畴常识(只活泼在社区)。因而它不知道我。

1.3 范畴内应用

迁移到笔直职业也是相同的道理。

大言语模型关于泛常识能找到上下文,这源于网络上公开的数据。可是关于范畴常识,它的表现或许就差点。因为你们公司的数据,它拿不到。

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

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

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

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

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

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

可是,这儿边会有一些问题。

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

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

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

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

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

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

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

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

协助手册:python.langchain.com/

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

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

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

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

2.1 给LLM加拉链

首要,它让LLM的调用愈加便捷了。

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

别的,你要装置:pip install langchain

然后履行如下python代码:

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

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

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

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

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

2.2 给LLM加助理

有些工作尽管不大,但做起来也很麻烦。比方,端茶倒水、复印打印。大模型是有脾气的,它不屑于做这些小事。

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

因而langchain就给它加了一个私家助理的功用。

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

你在公司喊出一句“剩下调休”,那必定不是问“请查询近邻老王的剩下调休”。助理会加工一下,比方弥补一些个性信息变成“请到体系查询一下截止今日我的剩下调休?”,然后再去问脾气大的LLM。

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

这儿边有一个LLMChain链条的概念,那便是依照预设的1、2、3过程去履行。

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

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

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

2.3 给LLM加外援

言语大模型不是万能的,尤其面对许多不知道的工作。

言语大模型一般会有一个训练数据的截止日期。比方截止到今年3月15日。那么,在这个日期之后产生的工作,它是不知道的。这很好理解,它也是看新闻增加才智。就算LLM具备写高考作文的才干,可是你让他写明天的高考作文,它是不知道题意图。

于是langchain引入了一个叫Agents署理的模块。署理能够将许多外部操作融入到业务链条当中。所谓署理便是代为处理

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

这件事应当分为三步:

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

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

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会打印出来流程。

> 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。你需求先注册。假如量大的话,还需求花钱购买额度。

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

python_repl则是python的普通指令,能够履行python代码。

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

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

关于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…

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

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

他文档中说:

怎样(以及为什么)使用假LLM? 我们公开了一个可用于测验的假 LLM 类。这使您能够模仿对LLM的调用,并模仿假如LLM以某种方式响应会产生什么。

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

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相同。

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

我们看看效果怎样:

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

解决了LLM的问题,你就能够继续学习langchain

现在业内卖课的,是有这么个说法,便是说LLM+langchain能够怎样怎样。

实际上这仅仅理论。是能够完成,但不是“嗖”一下就搞定。前前后后还有许多周边的东西需求处理。比方向模型扔文档资料这一步。你得先将pdf转成文字吧。pdf怎样解析?带表格的,带水印的,怎样提取和剔除?pdf是相片扫描件的话,还得先走OCR识别!

想要真实落地,还需求接上许多条相似langchain的大腿。

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

我是TF男孩,我在做AI的科普工作,这篇文章是 全民AI计划 的第4期。

  • 第1期:《测验第一个AI程序》
  • 第2期:《文本摘要完成原理》
  • 第3期:《详解词向量的效果》

我是@TF男孩,一个普及AI常识的民科IT男。