青训营学习3 | 豆包MarsCode AI 刷题

46 阅读15分钟

青训营学习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中的具体组件包括:

  1. 模型(Models) :包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
  2. 提示模板(Prompts) :使提示工程流线化,进一步激发大语言模型的潜力。
  3. 数据检索(Indexes) :构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
  4. 记忆(Memory) :通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你是谁。
  5. 链(Chains) :是LangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成常见用例。
  6. 代理(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)

通过上述代码,可以生成情人节红玫瑰的宣传语。

image.png

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,首先利用图像字幕生成工具将图片转化为字幕,然后对字幕做进一步处理,生成中文推广文案。

image2.png

入门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模型

步骤

  1. 注册API Key并安装OpenAI库:

    pip install openai
    
  2. 导入API Key:

    import os
    os.environ["OPENAI_API_KEY"] = 'Open API Key'
    
  3. 创建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的文本生成模型时,可以通过一些参数来控制输出的内容和样式。

image1.png

当调用OpenAI的Completion.create方法时,它会返回一个响应对象,该对象包含了模型生成的输出和其他一些信息。这个响应对象是一个字典结构,包含了多个字段。在使用Text模型(如text-davinci-003)的情况下,响应对象的主要字段包括:

image2.png

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模型以其强大的文本理解能力而著称,它不是生成式模型,而是专注于理解和分析。这种多样性展示了大语言模型在自然语言处理中的广泛应用。通过探索不同类型的模型,我们可以更好地理解语言模型的潜力,并在具体应用中最大化其价值。