快速了解 LangChain 的大模型应用开发

介绍

langchain 是一个开源框架,用于构建大模型应用。它封装了大模型开发的通用部分,并在各种 API 的基础上提供了通用性的调用和一些组件,可以更便捷的开发AI应用程序。

本文是基于 DeepLearning.AI 推出的 《LangChain for LLM Application Development》课程归纳而成的笔记,更详细的内容以及实例可以在通过学习课程深入了解,关于 langchain 的部分也可通过官方仓库以及文档获取更多的细节。

阅读更多:快速了解 LangChain 的大模型应用开发

模型,提示词,转换器

这三个关键词分别代表了多种可选的模型库(LLM),提示词模板,以及格式化方法。

LLMs

There are lots of LLM providers (OpenAI, Cohere, Hugging Face, etc) – the LLM class is designed to provide a standard interface for all of them.

—— from langchain doc

prompt template

参考课程中例子,咱可以举个类似的例子,比如将文案修改成特定的方言:四川话,这里可以是“四川话”,还可以是“广东话”,“东北话”…

请修改为 四川话 的语气:

熊猫,中国国宝,懒散却可爱。挑食竹子,攻击力强。繁殖能力低,生活慢节奏美好。 黑白分明的外表让人难以抗拒,仿佛穿着礼服上台演出。它们的悠闲态度让人忍不住想放慢脚步。 熊猫是自然界的独特存在,教会我们坚韧不拔。无论是懒散还是战斗力,熊猫总是赢得人们的喜爱。

基于这个变换着不同口音的”角色“,我们可以用 langchain 来将它的行为模式话,仿佛让AI角色可以表达不通的中国方言,下面是一个比较完整的例子:

import os
import openai
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate

# 运行此API配置,需要将目录中的.env中api_key替换为自己的
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
# 导入 OpenAI API_KEY
openai.api_key = os.environ['OPENAI_API_KEY']

chat = ChatOpenAI(temperature=0.0)

template_string = """请将文本修改为 {style} 的语气 \
文本: ```{text}```
"""

prompt_template = ChatPromptTemplate.from_template(template_string)

# 可以“四川话”,还可以是“广东话”,“东北话”...
customer_style = """
四川话
"""

customer_email = """
熊猫,中国国宝,懒散却可爱。挑食竹子,攻击力强。繁殖能力低,生活慢节奏美好。\
黑白分明的外表让人难以抗拒,仿佛穿着礼服上台演出。它们的悠闲态度让人忍不住想放慢脚步。\
熊猫是自然界的独特存在,教会我们坚韧不拔。无论是懒散还是战斗力,熊猫总是赢得人们的喜爱。
"""

customer_messages = prompt_template.format_messages(
                    style=customer_style,
                    text=customer_email)

print(customer_messages[0])
customer_response = chat(customer_messages)
print(customer_response.content)

相对于 API 调用的结果,我这里也对比了一下网页版 chatgpt 的答复效果,貌似与 api 还是有差异,我使用的 chatgpt3.5 貌似回复更好。

一个关键问题:为什么需要提示词模板?

  • 当每次需要向大模型问类似的问题的时候,只需要更换特定部分(风格)即可,这样它的重用价值就越高,尤其是构建一个比较复杂的提示词时,比如构建一个简历时,有部分不仅可独立还可复用:
{个人简介}

{教育经历}

{工作经验}

...
  • langchain提供了多种内置的 prompt template,有助快速满足常见需求。诸如:总结,提问,SQL操作,API调用等。公用的模板也发挥了其分享带来的价值,可以帮助开发者提高效率,为什么不站在巨人的肩膀上?

记忆

有些情况下,我们需要大模型能够记住一些信息(上下文),方便信息在上下文持续起作用,由于模型本身没有记忆,我们可以通过一些手段引入内容来解决。主要包括:token 缓冲区的介绍,以及后面会提到的向量存储。

  • 基于 token 的缓冲区记忆

利用token的区间大小对记忆进行不同形式的控制,通常是加载特定的“聊天记录”(部分或全部)

  • 向量存储

将信息已信以向量的形式存储与文件或数据库中,基于文档的对话就是常见的例子。关于缓冲区记忆,可能需要了解一下 token 相关的信息,他决定了“临时”记忆的大小。

token

token 这个概念是出现在自然语言处理技术的研究中,在把文字输给计算机时需要切分一下,大段文本会被分割成小块,这些被拆分后的“小块”称为连续子字符串——token。

在一个会话过程中上下文的有token长度的限制,即 input + completion = max tokens,这也意味无法一次性给模型太多的数据,不同模型本身的编码不同决定了对 token 长度的计算不同

链条

这个概念跟名字一样生动,每个链条就像一个与 LLM 互动的任务被连接在一起。主要的形式为:

  • 单一的

像直线的一样完成一个链式任务

  • 连续的

多个链条协同,在直线的基础上对每个连体进行关连,给予不同的次序,以协作完成任务

  • 路由模式

根据设定的主题(模式/情景)来灵活的匹配要完成的任务

QA模式

“LLM’s only inspect a few 1000 words one time”

这里提到的QA交互利用了向量数据的检索和存储来实现的,比如pdf文档,在超过token范围的时候进行自然语言处理时,则是将较大的数据(如:文档、书籍)进行进行分块变成向量数据。

向量数据是指由一组数值组成的数据,这些数值按照特定的顺序排列,形成一个向量。向量可以是一维的,也可以是多维的。在计算机科学和数据分析领域,向量通常用于表示和处理各种类型的数据,如数值、文本、图像等。

在一维向量中,数据按照线性顺序排列,并且可以通过索引访问每个元素。例如,[1, 2, 3, 4, 5] 是一个包含五个元素的一维向量。

在多维向量中,数据以多维数组的形式排列。例如,[ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] 是一个包含三个子数组的二维向量,每个子数组又是一个包含三个元素的一维向量。

向量数据在数据分析和机器学习中广泛应用。它们可以用于表示特征向量,其中每个元素表示一个特定的特征。例如,在图像识别任务中,可以将图像表示为像素值组成的向量。在文本分析中,可以将文本表示为词频或词向量的向量。这样的向量表示可以用于计算相似性、聚类、分类和预测等任务。

by chatgpt

问题会被转化为向量数据,比如狗子喜欢追松鼠,猫咪倔强到不吃罐头,都反映了宠物的特点,将信息转化为向量形式后,再通过数据库检索因此可以找到相似的内容。

问题会被转化为向量数据,再通过数据库检索找到相似的内容。

  • 模型检索

“stuff method” 是合并相似内容交给模型来处理,那么当 stuff 足够大超过了 token 限制也可能存在问题,所以还有额外的办法,分别是:

  1. 逐个执行再合并可以并行,但会造成高并发
  2. 持续的精炼因为需要等待结果,时间会明显延长
  3. 让模型打分再评估准确性存在一定程度的损失

评估

在大模型开发的过程中,光看结果的输出很难进行优化,需要肉眼可见的看到提示词对话的过程才能更确切的找到应该优化的部分。可以用的方法:

  • debug = true or false 人工评估,通过开关了解执行细节
  • 通过 LLM 评估,用自然语言来做评估算是符合其价值的一种方式

tips: 根据 LLM 评估的特点,实际上也是可以对模型能力进行一个全面的检测,这和一些软硬件的基准测试差不多,如果应用合理在很多流程化的检测中会很有用处。

此外,langchain提供了一个调试平台可以增加自定义数据集用于评估预期与结果的一致性。

代理

如同扩展和插件一样,让 LLM 在能力上有了延伸。这跟 OpenAI 的插件功能非常类似,比如联网可以充分扩充 AI 的能力,langchain 有内置的代理来,同时还可以自定义代理。

  • 内置:调用现成的工具库,比如:数学计算和维基百科等
  • 内置:模拟python运行环境执行代码
  • 自定义:自定义代理工具的代码,利用自然语言的特性让 LLM 自主判断(你只需要做好指示)

代理可以让模型与不同的扩展功能以及 API 进行连接,相比基于LLM的文档对话,可以说是从湖泊走向了大海,这极大程度的强化了 LLM 的预处理能力。

总结

Langchain 提供了一个完整的大模型开发框架,它定义的开发范式具有非常灵活的扩展性,对那些基于模型的应用开发者而言能够带来极大的效率提升。个人认为它可以算作是大模型应用开发领域的”瑞士军刀“,值得学习和了解。

未经允许不得转载:dyordo » 快速了解 LangChain 的大模型应用开发

评论

2+1=