LangChain实战课-开篇词及快速入门 | 豆包MarsCode AI刷题

175 阅读8分钟

前言

本次参加字节跳动青训营的AI方向,选择这个方向的原因是自己本来也是从事深度学习的研究,但是学校里面并没有研究使用大模型的课程和资源,了解到字节这个机会,正好学习一下。

之前也了解过大模型的基础使用。也听说过LangChain框架,但是一直没有机会从头开始搭建一个基于LangChain的大模型应用,字节提供的这个机会和平台非常好的。

何为LangChain?

LangChain是一种专门开发基于语言模型的应用而设计的框架,它提供了一系列工具、套件和接口,通过这个框架,可以通过调用各种大语言模型的API来使用这些大模型,并在语言任务在外,还可以完成其他的一些功能,比如搭建基于本地数据的专用大模型,或者使用是多模态大模型。

下面这张图能很好的展示出怎么使用LangChain从入门到搭建出来一个系统:

image.png

LangChain的6大组件

  • 模型(Models) ,包含各大语言模型的LangChain接口和调用细节,以及输出解析机制。
  • 提示模板(Prompts) ,使提示工程流线化,进一步激发大语言模型的潜力。
  • 数据检索(Indexes) ,构建并操作文档的方法,接受用户的查询并返回最相关的文档,轻松搭建本地知识库。
  • 记忆(Memory) ,通过短时记忆和长时记忆,在对话过程中存储和检索数据,让ChatBot记住你是谁。
  • 链(Chains) ,是LangChain中的核心机制,以特定方式封装各种功能,并通过一系列的组合,自动而灵活地完成常见用例。
  • 代理(Agents) ,是另一个LangChain中的核心机制,通过“代理”让大模型自主调用外部工具和内部工具,使强大的“智能化”自主Agent成为可能!你的 App 将产生自驱力!

LangChain用例

所谓学习一项技能最好的方式就是动手去做。第一节教程提供了两个简单的用例,第一个是情人节玫瑰宣传语,第二个是海报文案生成器。这其实展示了两个方面的能力,分别是文本生成和跨模态的理解和生成。

情人节玫瑰宣传语

这个应用非常简单,就是让大模型生成一条关于情人节卖玫瑰花的宣传语,首先需要安装三个依赖库,langchain,openai和langchain-openai。 使用pip install命令安装即可。值得一提的是,字节给我们提供了AI练中学功能,可以直接打开就能运行代码,省掉了繁琐的环境配置问题,非常值得一用!

它的代码如下:

import os
from langchain_openai import ChatOpenAI

# 初始化大语言模型,因为openai的api需要付费,这里使用的是字节提供的免费doubao的api
llm = ChatOpenAI(os.environ.get("LLM_MODELEND"))

# 给大模型一个prompt,也就是我们的问题,大模型返回一个结果
text = llm.invoke("请给我写一句情人节红玫瑰的中文宣传语")
# 返回结果的文本内容,默认是返回15个结果
print(text.content)

结果如下:

image.png

海报文案生成器

还是以上面的背景为例,如果有一个宣传海报,还需要一个对应的宣传标语,这时候直接只用文本的LLM就够不了,需要用多模态大模型进行文本描述。在这里就用了blip多模态大模型,它能处理图片并生成图片的文字描述,然后根据文字描述和给定的prompt,让LLM进行处理,就能得到一张海报的宣传标语。

代码如下:

# ---- Part 0 导入所需要的类
import os
import requests
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration
from langchain.tools import BaseTool
from langchain_openai import ChatOpenAI
from langchain.agents import initialize_agent, AgentType

# ---- Part I 初始化图像字幕生成模型
# 指定要使用的工具模型(HuggingFace中的image-caption模型)
hf_model = "Salesforce/blip-image-captioning-large"

cache_dir = "/tmp/cache"

# 确保缓存目录存在
os.makedirs(cache_dir, exist_ok=True)

print("正在初始化图像字幕生成模型...")

# 初始化处理器和工具模型
# 预处理器将准备图像供模型使用
processor = BlipProcessor.from_pretrained(hf_model, cache_dir=cache_dir)
# 然后我们初始化工具模型本身
model = BlipForConditionalGeneration.from_pretrained(hf_model, cache_dir=cache_dir)
print("初始化图像字幕生成模型成功")


# ---- Part II 定义图像字幕生成工具类
class ImageCapTool(BaseTool):
    name = "Image captioner"
    description = "使用该工具可以生成图片的文字描述,需要传入图片的URL."

    def _run(self, url: str):
        # 下载图像并将其转换为PIL对象
        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")


# ---- PartIII 初始化并运行LangChain智能体
# llm = OpenAI(temperature=0.2)
llm = ChatOpenAI(
    model=os.environ.get("LLM_MODEL_4K_FUNCTION_CALL"),
    temperature=0.2,
)
print("初始化大语言模型成功")
# 使用工具初始化智能体并运行
tools = [ImageCapTool()]
agent = initialize_agent(
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    tools=tools,
    llm=llm,
    verbose=True,
    handle_parsing_errors=True,
)

img_url = "https://lf3-static.bytednsdoc.com/obj/eden-cn/lkpkbvsj/ljhwZthlaukjlkulzlp/eec79e20058499.563190744f903.jpg"
# agent.run(input=f"{img_url}\n请创作合适的中文推广文案")
agent.invoke(input=f"图片链接如下:{img_url}\n 请为这张图创作合适的中文推广文案")

结果如下:

image.png

LangChain系统安装和快速入门

上面初步了解了LangChain,并切从两个小demo认识到了它的能力。下面就正式开始安装LangChain和正式入门。

安装LangChain

# 安装langchain依赖
pip install langchain
# 可能还需要其他一些依赖,如transformers,openai等
pip install transformers
pip install openai
pip install chroma

如果是在自己的电脑环境中,一般还需要安装pytorch等框架。

通过 LangChain 调用 Text 模型

直接来看怎么用LangChain调用text模型,调用text模型的情况是只需要完成单次的文本相关的任务,比如让大模型给我们的花店取个名,代码如下:

import os 
from langchain_openai import ChatpenAI

# 定义并加载模型,temperature表示回答的随机性,值越大,每次的答案越不相同;max_tokens是返回的最大token数
llm = ChatOpenAI(
    model=os.environ.get("LLM_MODELEND"),
    temperature=0.8,
    max_tokens=60,
)
response = llm.predict("请给我的花店起个名")

print(response)

结果如下:

image.png

通过 LangChain 调用 Chat 模型

和调用text模型相比,调用Chat模型更加适合多次一问一答的场景,它可以结合上下文信息给出回答,并且Chat模型中有三个角色,分别是system,user和assistant

  • system:让模型扮演一个角色,让模型理解自己在对话中的角色和任务,如扮演一个程序员、律师或者一个知识丰富的AI助手等。
  • user:一般是用户发出的问题。
  • assistant:表示模型的回复。

调用的代码如下:

import os
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage

# 定义并加载模型
chat = ChatOpenAI(
    model=ps.environ("LLM_MODELEND"),
    temperature=0.8,
    max_tokens=60
)

# 定义聊天的角色,分别是system和user角色
messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的店起个名")
]

# 得到结果
response = chat(messages)

# 打印结果中的文本部分
print(response.content)

结果如下:

image.png

还可以探究一下content对结果的影响,如果对模型说:你是一名出色的律师,然后让模型给出一些避免花店陷入法律风险的建议,结果如下:

以下是一些给花店避免法律风险的建议:
1. **合同与协议**:与供应商、员工、客户等签订明确的合同和协议,明确各方的权利和义务。
2. **知识产权保护**:确保花店的名称、标志、设计等知识产权受到保护。
3. **合规经营**:遵守相关法律法规,包括商业登记、税务等方面的规定。
4. **员工管理**:依法签订劳动合同,保障员工权益,避免劳动纠纷。
5. **产品质量与安全**:确保所售花卉和相关产品的质量和安全。
6. **广告与宣传**:确保广告内容真实、准确,不涉及虚假宣传。
7. **客户隐私保护**:妥善处理客户的个人信息,遵守隐私法规。
8. **租赁与场地**:与房东签订清晰的租赁合同,明确租赁条款和责任。
9. **保险覆盖**:购买适当的商业保险,以应对可能的风险和损失。
10. **纠纷解决机制**:建立有效的纠纷解决机制,如协商、调解或仲裁。
11. **培训与教育**:对员工进行法律培训,提高法律意识。
12. **定期审查**:定期审查花店的运营和管理,确保符合法律要求。
13. **法律咨询**:如有需要,寻求专业律师的法律咨询和建议。
14. **记录保存**:妥善保存相关的业务记录和文件,以备日后参考。
15. **关注法律法规变化**:及时了解并适应相关法律法规的变化。

总结

本次学习主要是LangChain的入门,了解了LangChain是怎么调用大模型API的,在此基础上完成一些简单的任务,并且学习了调用模型时设置的一些常见参数。