伴学笔记1

104 阅读10分钟

LangChain 实战课:释放大语言模型潜能的利器 随着 ChatGPT 和 GPT-4 等大型语言模型的横空出世,AI 技术的发展迎来了新的里程碑。然而,如何有效地利用这些大型语言模型,将其潜能最大化地释放出来,成为了摆在我们面前的一个重要课题。LangChain 作为一种专为开发基于语言模型的应用而设计的框架,为我们提供了强有力的支持。

LangChain 框架不仅支持通过 API 调用大型语言模型,还具备数据感知和代理性等高级功能。通过 LangChain,我们可以将语言模型与其他数据源连接起来,实现对更丰富、更多样化数据的理解和利用。同时,LangChain 还允许语言模型与其环境进行交互,使其能够对其环境有更深入的理解,并能够进行有效的响应。

在 LangChain 实战课中,我们从小北的角度出发,为大家设计了四大模块的课程内容。从启程篇的零基础入门,到基础篇的深入探索 LangChain 六大组件,再到应用篇和实战篇的场景应用和动手实践,我们力求帮助学员们全面掌握 LangChain 的精髓和应用技巧。

LangChain中的具体组件包括:

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

应用篇:积累场景中的智慧

在这个模块中,我们会展示如何将LangChain组件应用到实际场景中。你将学会如何使用LangChain的工具和接口,进行嵌入式存储,连接数据库,引入异步通信机制,通过智能代理进行各种角色扮演、头脑风暴,并进行自主搜索,制定自动策略,尝试不同方案完成任务。

我们将不仅仅是讲解这些组件的功能,还会通过实际应用场景来展示它们是如何互相配合,共同完成复杂任务的。本模块中的很多机制都来源于最新论文,其中对AI智能代理机制的各种使用方式将令你大开脑洞,或许你会哈哈一笑,或许你会击节赞叹,钦佩设计者思路之清奇。

实战篇:动手!

你将学习如何部署一个鲜花网络电商的人脉工具,并开发一个易速鲜花聊天客服机器人。从模型的调用细节,到数据连接的策略,再到记忆的存储与检索,每一个环节都是为了打造出一个更加智能、更加人性化的系统。

至此,你将能够利用LangChain构建出属于自己的智能问答系统,不论是用于企业的应用开发,还是个人的日常应用,都能够得心应手,游刃有余。

实战案例: 应用 1:情人节玫瑰宣传语 情人节到啦,你的花店需要推销红色玫瑰,那么咱们让大语言模型做的第一个应用,就是给咱们生成简短的宣传语。

这个需求极为简单,你直接去ChatGPT网站,或者用文心一言、星火认知等大模型,都做得到。不过,怎样通过LangChain来用程序的方式实现呢?也很容易。

第一步是安装三个包,通过 pip install langchain 来安装LangChain,通过 pip install openai 来安装OpenAI,还需要通过 pip install langchain-openai 以便在 LangChain 中使用 OpenAI 模型。

pip install langchain pip install openai pip install langchain-openai 第二步,你还需要在OpenAI网站注册属于自己的OpenAI Key。(当然,LangChain也支持其他的开源大语言模型,但是推理效果没有GPT那么好,所以我们这个课程里面的大多数示例都是用OpenAI的GPT系列模型来完成。)

完成了上面两个步骤,就可以写代码了。

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) 这里,我们先导入了OpenAI的API Key,然后从LangChain中导入OpenAI的Text模型接口,并初始化这个大语言模型,把我们的需求作为提示信息,传递给大语言模型。

运行程序,我得到了好几个漂亮的文案。而且每次运行都会有新的惊喜。

你也许会觉得,这个应用太简单了,直接去大模型

import os from langchain_openai import ChatOpenAI

llm = OpenAI(model_name="gpt-3.5-turbo-instruct",max_tokens=200)

llm = ChatOpenAI(model=os.environ.get("LLM_MODELEND"))

text = llm.predict("请给我写一句情人节红玫瑰的中文宣传语") print(text) 的网页上问更方便。的确如此,那下面我们再来一个无法直接在网页上完成的应用。

应用2:海报文案生成器 你已经制作好了一批鲜花的推广海报,想为每一个海报的内容,写一两句话,然后post到社交平台上,以期图文并茂。

这个需求,特别适合让AI帮你批量完成,不过,ChatGPT网页可不能读图。下面,我们就用LangChain的“代理”调用“工具”来完成自己做不到的事情。

我们就用一段简单的代码实现上述功能。这段代码主要包含三个部分:

初始化图像字幕生成模型(HuggingFace中的image-caption模型)。 定义LangChain图像字幕生成工具。 初始化并运行LangChain Agent(代理),这个Agent是OpenAI的大语言模型,会自动进行分析,调用工具,完成任务。 不过,这段代码需要的包比较多。在运行这段代码之前,你需要先更新LangChain到最新版本,安装HuggingFace的Transformers库(开源大模型工具),并安装 Pillow(Python图像处理工具包)和 PyTorch(深度学习框架)。

pip install --upgrade langchain pip install transformers pip install pillow pip install torch torchvision torchaudio #---- Part 0 导入所需要的类 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

#---- Part I 初始化图像字幕生成模型

指定要使用的工具模型(HuggingFace中的image-caption模型)

hf_model = "Salesforce/blip-image-captioning-large"

初始化处理器和工具模型

预处理器将准备图像供模型使用

processor = BlipProcessor.from_pretrained(hf_model)

然后我们初始化工具模型本身

model = BlipForConditionalGeneration.from_pretrained(hf_model)

#---- Part II 定义图像字幕生成工具类 class ImageCapTool(BaseTool):

name = "Image captioner"
description = "为图片创作说明文案."

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智能代理

设置OpenAI的API密钥并初始化大语言模型(OpenAI的Text模型)

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 = 'mir-s3-cdn-cf.behance.net/project_mod…' agent.invoke(input=f"{img_url}\n请创作合适的中文推广文案")

根据输入的图片URL,由OpenAI大语言模型驱动的LangChain Agent,首先利用图像字幕生成工具将图片转化为字幕,然后对字幕做进一步处理,生成中文推广文案。

运行结果1:

运行结果2:

运行结果3:

说明:因为temperature=0.2代表模型拥有一定的随机性,所以大模型每次的推理过程生成的文案都不尽相同。

---- 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 = "/cloudide/workspace/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, ) print("初始化大语言模型成功")

使用工具初始化智能体并运行

tools = [ImageCapTool()] agent = initialize_agent( agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, tools=tools, llm=llm, verbose=True, handle_parsing_errors=True, )

img_url = "lf3-static.bytednsdoc.com/obj/eden-cn…"

agent.run(input=f"{img_url}\n请创作合适的中文推广文案")

agent.invoke(input=f"图片链接如下:{img_url}\n 请为这张图创作合适的中文推广文案")

针对上面的鲜花图片,程序进入了AgentExecutor链,开始思考推理,并采取行动——调用Image Cationer工具,接收该工具给出的结果,并根据其返回的内容,再次进行思考推理,最后给出的文案是:“爱,让每一天充满美丽,让每一个心情都充满甜蜜。” 多么浪漫而又富有创意,大模型懂我!

当然,这个过程中还有很多很多的细节,比如大模型是怎么思考的?LangChain调用大模型时传入的具体提示文本是什么?代理是什么?AgentExecutor Chain 是什么?它究竟是怎样调度工具的?你现在可能有很多的疑惑。

在后续的课程中,我会带着你手撕 LangChain 内部源代码,把所有这些一点一滴地剖析清楚。

关于 LangChain,我想向你分享的还有太多太多,短短的开篇词已经无法容纳了。那么,就让我最后告诉你:玩 LangChain,真的很有意思,越深入,越发觉大语言模型是一个无尽的宝藏。在这样的系统中,我们并不是生硬的去设计什么固定的逻辑,而是由语言模型通过理解和推理来决定执行什么操作以及执行的顺序。 ———————————————