青训营学习3:探索AI应用开发的新时代
1. AI应用开发的历史与未来
1.1 AI应用开发的历史节点
AI技术的发展历程充满了起伏,从神经网络到自然语言处理技术,经历了多次辉煌与低谷。近年来,大模型技术的突破,如ChatGPT和GPT-4,标志着AI的又一次飞跃。
行业观点
- 阿里巴巴的张勇:大模型是划时代的里程碑,类似工业革命,将广泛应用于各行各业。“面向AI时代,所有产品都值得用大模型重新升级。”
- 英伟达的黄仁勋:ChatGPT是AI的“iPhone时刻”,其影响力可比互联网时刻。
发展前景
大语言模型如ChatGPT和GPT-4为跨平台企业的成长提供了新可能,可能改变未来的科技格局。
1.2 LangChain的出现
LangChain是一个以大模型为引擎的全新应用开发框架,几乎和ChatGPT一起面世。它使得程序设计者可以利用大模型的潜能以及LangChain的便捷,开发出令人惊叹的智能应用。LangChain作为新一代AI开发框架,必将受到程序员的追捧,点燃AI应用开发的新热潮。
2. 深入了解LangChain
2.1 什么是LangChain?
LangChain是一个专为开发基于语言模型应用而设计的框架。它不仅支持通过API调用ChatGPT、GPT-4、Llama 2等大型语言模型,还能实现更高级的功能。
关键特性
- 数据感知:能够将语言模型与其他数据源连接起来,从而实现对更丰富、更多样化数据的理解和利用。
- 具有代理性:能够让语言模型与其环境进行交互,使得模型能够对其环境有更深入的理解,并能够进行有效的响应。
设计目标
LangChain框架的设计目标是使这种AI类型的应用成为可能,并帮助我们最大限度地释放大语言模型的潜能。
小结
LangChain是一个基于大语言模型(LLMs)用于构建端到端语言模型应用的框架,它可以让开发者使用语言模型来实现各种复杂的任务,例如文本到图像的生成、文档问答、聊天机器人等。LangChain提供了一系列工具、套件和接口,可以简化创建由LLMs和聊天模型提供支持的应用程序的过程。
2.2 LangChain的核心组件
启程
介绍LangChain系统的安装流程,以及如何进行快速的入门操作。例如,如何使用LangChain来构建一个基于“易速鲜花”本地知识库的智能问答系统。
基础6大组件
LangChain中的具体组件包括:
- 模型(Models) :包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
- 提示模板(Prompts) :使提示工程流线化,进一步激发大语言模型的潜力。
- 数据检索(Indexes) :构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
- 记忆(Memory) :通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你是谁。
- 链(Chains) :是LangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成常见用例。
- 代理(Agents) :通过“代理”让大模型自主调用外部工具和内部工具,使强大的“智能化”自主Agent成为可能。
这些组件是LangChain的基石,是赋予其智慧和灵魂的核心要素,它们相互协作,形成一个强大而灵活的系统。在基础篇中,将深入探索这些组件的工作原理和使用方法,并给出大量用例,夯实对这些组件的理解和应用能力。
应用
展示如何将LangChain组件应用到实际场景中。学会如何使用LangChain的工具和接口,进行嵌入式存储,连接数据库,引入异步通信机制,通过智能代理进行各种角色扮演、头脑风暴,并进行自主搜索,制定自动策略,尝试不同方案完成任务。
实战
学习如何部署一个鲜花网络电商的人脉工具,并开发一个易速鲜花聊天客服机器人。从模型的调用细节,到数据连接的策略,再到记忆的存储与检索,每一个环节都是为了打造出一个更加智能、更加人性化的系统。所以将能够利用LangChain构建出属于自己的智能问答系统,不论是用于企业的应用开发,还是个人的日常应用,都能够得心应手,游刃有余。
3. 有趣的LangChain用例
3.1 应用1:宣传语
情人节到啦,花店需要推销红色玫瑰。我们让大语言模型生成简短的宣传语。通过LangChain来实现:
import os
os.environ["OPENAI_API_KEY"] = 'OpenAI Key'
from langchain_openai import OpenAI
llm = OpenAI(model_name="gpt-3.5-turbo-instruct", max_tokens=200)
text = llm.invoke("请给我写一句情人节红玫瑰的中文宣传语")
print(text)
通过上述代码,可以生成情人节红玫瑰的宣传语。
3.2 应用2:海报文案
制作好了一批鲜花的推广海报,想为每一个海报的内容写一两句话,然后post到社交平台上。这个需求可以通过LangChain的“代理”调用“工具”来完成。
首先,需要安装所需的包:
pip install --upgrade langchain
pip install transformers
pip install pillow
pip install torch torchvision torchaudio
然后,使用以下代码实现:
import os
import requests
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration
from langchain.tools import BaseTool
from langchain import OpenAI
from langchain.agents import initialize_agent, AgentType
# 初始化图像字幕生成模型
hf_model = "Salesforce/blip-image-captioning-large"
processor = BlipProcessor.from_pretrained(hf_model)
model = BlipForConditionalGeneration.from_pretrained(hf_model)
# 定义图像字幕生成工具类
class ImageCapTool(BaseTool):
name = "Image captioner"
description = "为图片创作说明文案."
def _run(self, url: str):
image = Image.open(requests.get(url, stream=True).raw).convert('RGB')
inputs = processor(image, return_tensors="pt")
out = model.generate(**inputs, max_new_tokens=20)
caption = processor.decode(out[0], skip_special_tokens=True)
return caption
def _arun(self, query: str):
raise NotImplementedError("This tool does not support async")
# 初始化并运行LangChain智能代理
os.environ["OPENAI_API_KEY"] = 'OpenAI API Key'
llm = OpenAI(temperature=0.2)
tools = [ImageCapTool()]
agent = initialize_agent(
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
tools=tools,
llm=llm,
verbose=True,
)
img_url = 'https://mir-s3-cdn-cf.behance.net/project_modules/hd/eec79e20058499.563190744f903.jpg'
agent.invoke(input=f"{img_url}\n请创作合适的中文推广文案")
通过上述代码,根据输入的图片URL,由OpenAI大语言模型驱动的LangChain Agent,首先利用图像字幕生成工具将图片转化为字幕,然后对字幕做进一步处理,生成中文推广文案。
入门LangChain
2.1 理解大语言模型
大语言模型是一种基于深度学习的人工智能模型,通常使用神经网络来理解和生成自然语言。其“巨大”体现在参数数量上,通常达到数十亿,使模型能够处理复杂的语言模式。
大语言模型的工作机制
- 预测能力:模型通过“猜词”机制工作,给定一段文本的开头,预测下一个词。
- 上下文理解:不仅基于词语的统计关系,还包括对上下文的理解和世界常识的认知。
- 局限性:虽然擅长语言模式识别,但缺乏人类的情感和真正的理解力。
LangChain的优势
LangChain是一个基于大语言模型的应用开发工具,提供灵活性和模块化特性,使得处理语言模型变得简便。支持Python和JavaScript版本,后续使用Python进行研究。
2.2 安装LangChain
安装LangChain的基本步骤:
pip install langchain
依赖管理
-
安装常用的开源LLM库:
pip install langchain[llms] -
更新到最新版本:
pip install --upgrade langchain -
从源代码安装:
pip install -e .
LangChain的GitHub社区活跃,提供了丰富的教程和最佳实践。
2.3 OpenAI API的基础
LangChain通过封装OpenAI的API来简化大模型的调用。了解OpenAI API是理解LangChain底层逻辑的关键。
关键模型
- Chat Model:用于对话生成,如gpt-3.5-turbo和GPT-4。
- Text Model:用于文本生成,如text-davinci-003。
2.4 调用OpenAI的Text模型
步骤
-
注册API Key并安装OpenAI库:
pip install openai -
导入API Key:
import os os.environ["OPENAI_API_KEY"] = 'Open API Key' -
创建Client并调用模型,指定 gpt-3.5-turbo-instruct(也就是 Text 模型)并调用 completions 方法:
from openai import OpenAI client = OpenAI() response = client.completions.create( model="gpt-3.5-turbo-instruct", temperature=0.5, max_tokens=100, prompt="请给我的花店起个名" ) print(response.choices[0].text.strip())
使用OpenAI的文本生成模型时,可以通过一些参数来控制输出的内容和样式。
当调用OpenAI的Completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。在使用Text模型(如text-davinci-003)的情况下,响应对象的主要字段包括:
choices字段是一个列表,因为在某些情况下,可以要求模型生成多个可能的输出。每个选择都是一个字典,其中包含以下字段:text:模型生成的文本。finish_reason:模型停止生成的原因,可能的值包括 stop(遇到了停止标记)、length(达到了最大长度)或 temperature(根据设定的温度参数决定停止)。所以,response.choices[0].text.strip() 这行代码的含义是:从响应中获取第一个(如果在调用大模型时,没有指定n参数,那么就只有唯一的一个响应)选择,然后获取该选择的文本,并移除其前后的空白字符。这通常是想要的模型的输出。
2.5 调用OpenAI的Chat模型
示例代码
response = client.chat.completions.create(
model="gpt-4",
messages=[
{"role": "system", "content": "You are a creative AI."},
{"role": "user", "content": "请给我的花店起个名"},
],
temperature=0.8,
max_tokens=60
)
这段代码中,除去刚才已经介绍过的temperature、max_tokens等参数之外,有两个专属于Chat模型的概念,一个是消息,一个是角色!
先说消息,消息就是传入模型的提示。此处的messages参数是一个列表,包含了多个消息。每个消息都有一个role(可以是system、user或assistant)和content(消息的内容)。系统消息设定了对话的背景(你是一个很棒的智能助手),然后用户消息提出了具体请求(请给我的花店起个名)。模型的任务是基于这些消息来生成回复。
再说角色,在OpenAI的Chat模型中,system、user和assistant都是消息的角色。每一种角色都有不同的含义和作用。
● system:系统消息主要用于设定对话的背景或上下文。这可以帮助模型理解它在对话中的角色和任务。例如可以通过系统消息来设定一个场景,让模型知道它是在扮演一个医生、律师或者一个知识丰富的AI助手。系统消息通常在对话开始时给出。
● user:用户消息是从用户或人类角色发出的。它们通常包含了用户想要模型回答或完成的请求。用户消息可以是一个问题、一段话,或者任何其他用户希望模型响应的内容。
● assistant:助手消息是模型的回复。例如,在使用API发送多轮对话中新的对话请求时,可以通过助手消息提供先前对话的上下文。然而,请注意在对话的最后一条消息应始终为用户消息,因为模型总是要回应最后这条用户消息。
在使用Chat模型生成内容后,返回的响应,也就是response会包含一个或多个choices,每个choices都包含一个message。每个message也都包含一个role和content。role可以是system、user或assistant,表示该消息的发送者,content则包含了消息的实际内容。
response的基本结构,其实和Text模型返回的响应结构也是很相似,只是choices字段中的Text换成了Message。可以通过解析这个对象来获取需要的信息。例如,要获取模型的回复,可使用 response['choices'][0]['message']['content']。
2.6 Chat模型 vs Text模型
- Chat模型:适合多轮对话,管理对话历史,支持角色模拟。
- Text模型:适合简单的单轮文本生成任务。
相较于Text模型,Chat模型的设计更适合处理对话或者多轮次交互的情况。这是因为它可以接受一个消息列表作为输入,而不仅仅是一个字符串。这个消息列表可以包含system、user和assistant的历史信息,从而在处理交互式对话时提供更多的上下文信息。
这种设计的主要优点包括:
● 对话历史的管理:通过使用Chat模型,可以更方便地管理对话的历史,并在需要时向模型提供这些历史信息。例如,可以将过去的用户输入和模型的回复都包含在消息列表中,这样模型在生成新的回复时就可以考虑到这些历史信息。
● 角色模拟:通过system角色,可以设定对话的背景,给模型提供额外的指导信息,从而更好地控制输出的结果。当然在Text模型中,在提示中也可以为AI设定角色,作为输入的一部分。
然而,对于简单的单轮文本生成任务,使用Text模型可能会更简单、更直接。例如,如果只需要模型根据一个简单的提示生成一段文本,那么Text模型可能更适合。从上面的结果看,Chat模型给我们输出的文本更完善,是一句完整的话,而Text模型输出的是几个名字。这是因为ChatGPT经过了对齐(基于人类反馈的强化学习),输出的答案更像是真实聊天场景。
2.7 使用LangChain调用Text模型
import os
os.environ["OPENAI_API_KEY"] = 'Open API Key'
from langchain.llms import OpenAI
llm = OpenAI(
model="gpt-3.5-turbo-instruct",
temperature=0.8,
max_tokens=60
)
response = llm.predict("请给我的花店起个名")
print(response)
这只是一个对OpenAI API的简单封装:先导入LangChain的OpenAI类,创建一个LLM(大语言模型)对象,指定使用的模型和一些生成参数。使用创建的LLM对象和消息列表调用OpenAI类的__call__方法,进行文本生成。生成的结果被存储在response变量中。
2.8 使用LangChain调用Chat模型
import os
os.environ["OPENAI_API_KEY"] = 'Open API Key'
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
chat = ChatOpenAI(model="gpt-4", temperature=0.8, max_tokens=60)
messages = [
SystemMessage(content="你是一个很棒的智能助手"),
HumanMessage(content="请给我的花店起个名")
]
response = chat(messages)
print(response)
2.9 小结
- 理解OpenAI模型的演变及其适用场景。
- 认识到LangChain对大语言模型的封装优势。
- 随着开源模型的发展,LangChain将不断扩展其支持的模型库。
课后题的个人思考
(1)LangChain的核心价值
虽然LangChain仍需依赖OpenAI API来调用GPT家族模型,但其核心价值在于:
- 模块化与灵活性:LangChain就像乐高积木,为开发者提供了灵活的模块化组件。这种设计不仅让新手更容易上手,也为经验丰富的开发者提供了深度定制的可能。
- 跨平台支持:通过支持多种大语言模型,LangChain打破了对单一平台的依赖,促进了不同模型之间的无缝切换。
- 开发效率:通过封装复杂的API调用,LangChain大大简化了集成过程,帮助开发者专注于应用逻辑而非底层实现。
LangChain的真正价值在于它为开发者提供了一个高效、灵活的开发环境,使得创新和实验变得更加容易。
(2)尝试使用HuggingFace的模型
LangChain不仅支持OpenAI模型,还支持HuggingFace开源社区中的模型。可以尝试使用以下代码来调用HuggingFace的模型:
from langchain import HuggingFaceHub
llm = HuggingFaceHub(model_id="bigscience/bloom-1b7")
response = llm.predict("请给我的花店起个名")
print(response)
在选择模型时,可以考虑文本生成(Text-Generation)、文本到文本生成(Text-Text Generation)和问答(Question-Answer)这类模型。尝试不同的模型,不仅可以扩展视野,还能激发新的创意。
(3)大语言模型的其他类别
除了文本生成式模型,大语言模型还有其他类别,例如:
- 文本嵌入模型:如BERT,主要用于生成文本的向量表示,适合进行相似度计算、分类等任务。
- 文本分类模型:用于将文本分配到预定义的类别,帮助自动化处理海量信息。
- 情感分析模型:用于识别文本中的情感倾向,适合社交媒体和市场分析。
- 命名实体识别模型:用于识别和标注文本中的实体,提高信息抽取的效率。
BERT模型以其强大的文本理解能力而著称,它不是生成式模型,而是专注于理解和分析。这种多样性展示了大语言模型在自然语言处理中的广泛应用。通过探索不同类型的模型,我们可以更好地理解语言模型的潜力,并在具体应用中最大化其价值。