【人工智能】AI应用开发框架LangChain与大模型

403 阅读5分钟

【人工智能】AI应用开发框架LangChain与大模型

Leonardo_Phoenix_Use_a_pattern_of_a_circuit_board_or_integrate_0

在当今AI技术飞速发展的背景下,LangChain作为一个应用开发框架,与ChatGPT几乎同步出现在人们的视野中。LangChain最初以一个接口工具的身份出现,主要目的是解决大型语言模型与数据库、API、文件系统等外部数据源之间的接口问题,使开发者能够更便捷地调用GPT模型,并将模型的输出与外部信息相结合。

LangChain六大组件

LangChain的发展历程

  1. 初期定位:LangChain最初是一个简单的接口工具,专注于解决大型语言模型与外部数据源的对接问题。这使得开发者可以更加轻松地集成GPT模型,提高开发效率。
  2. 功能扩展:随着时间的推移,LangChain的功能逐渐丰富,开始支持与多种外部数据源的交互,如数据库、API等。这不仅提升了数据处理的灵活性,也为构建复杂的AI应用奠定了基础。
  3. 多模型处理:LangChain进一步发展,支持多模型处理不同任务,并通过链条(Chains)的方式将这些任务连接起来。这种架构使得开发者可以构建更加复杂和高效的AI应用。

LangChain的六大组件

LangChain的六大组件是其核心组成部分,包括但不限于:

  • 模型:支持多种语言模型,如GPT系列。
  • 数据源:支持与多种数据源的对接,如数据库、API等。
  • 工具:提供丰富的工具集,用于处理各种任务。
  • 链条:通过链条将多个任务连接起来,形成复杂的流程。
  • 代理:代理(Agents)可以根据任务需求自动选择合适的工具和模型。
  • 执行器:执行器(Executors)负责调度和执行任务。

LangChain安装与快速入门

简单示例

我使用的是通义千问

如何获取通义的key大家先百度哈~后面我会补

import os
from openai import OpenAI
​
# 初始化OpenAI客户端
client = OpenAI(
    api_key=os.getenv("DASHSCOPE_API_KEY"),  # 如何获取API Key:https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
​
# 创建对话完成请求
completion = client.chat.completions.create(
    model="qwen-plus",  # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
    messages=[{"role": "user", "content": "你是谁?"}]
)
​
# 打印模型的回复
print(completion.choices[0].message.content)

这里是加了chains,大多写法都是这样

class QwenTurboTongyi(Tongyi):
    model_name = "qwen-turbo"class QwenMaxTongyi(Tongyi):
    model_name = "qwen-max"def xiao_hei_zi(question):
    llm = QwenTurboTongyi(temperature=1)
    template = '''
        你的名字是小黑子,当有人问问题的时候,你都会在回答的开头加上'唱,跳,rap,篮球!\n\n',然后再回答{question}, 内容尽量详细
    '''
    prompt = PromptTemplate(
        template=template,
        input_variables=["question"]
    )
    chain = RunnableSequence(prompt | llm)
    question = question.strip()
    res = chain.invoke({"question": question})
    print(res)

使用LangChain的代理调用工具

前面代码需要特殊手段,主要是huggingface不好链接上
# ---- 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"
print("正在初始化图像字幕生成模型...")
​
# 初始化处理器和工具模型
processor = BlipProcessor.from_pretrained(hf_model)
model = BlipForConditionalGeneration.from_pretrained(hf_model)
print("初始化图像字幕生成模型成功")
​
# ---- Part II 定义图像字幕生成工具类
class ImageCapTool(BaseTool):
    """
    ImageCapTool 类用于根据图像的 URL 生成图像的文字描述。
    """
    name = "Image captioner"
    description = "使用该工具可以生成图片的文字描述,需要传入图片的URL."
​
    def _run(self, url: str):
        """
        根据传入的图像 URL 生成图像的文字描述。
        
        参数:
            url (str): 图像的 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):
        """
        ImageCapTool 类的异步运行方法,当前未实现。
        
        参数:
            query (str): 查询字符串。
        
        异常:
            NotImplementedError: 如果调用此方法,将抛出 NotImplementedError 异常。
        """
        raise NotImplementedError("This tool does not support async")
​
# ---- Part III 初始化并运行LangChain智能体
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 = "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 请为这张图创作合适的中文推广文案")
LangChain的工作机制
  • 大模型的思考过程:大模型通过理解和推理来决定执行什么操作以及执行的顺序。它会根据输入的提示文本生成相应的输出。
  • LangChain调用大模型时的提示文本:LangChain在调用大模型时,会将具体的任务描述和上下文信息作为提示文本传递给模型。模型根据这些信息生成相应的输出。
  • 代理(Agent) :代理是一种智能体,可以根据任务需求自动选择合适的工具和模型。代理通过推理和决策来确定如何执行任务。
  • AgentExecutor Chain:AgentExecutor Chain 是一种特殊的链条,用于调度和执行代理的任务。它可以根据任务的复杂度和需求,动态地选择和组合不同的工具和模型。
  • 工具调度:LangChain通过AgentExecutor Chain来调度工具。代理会根据任务的需求,选择合适的工具并调用它们,从而完成复杂的任务。

总结

LangChain作为一个强大的AI应用开发框架,不仅简化了大型语言模型与外部数据源的对接,还提供了丰富的工具和组件,使得开发者可以更高效地构建复杂的AI应用。通过理解和利用LangChain的核心机制,开发者可以更好地发挥AI技术的潜力,创造更多有价值的应用。

引用

豆包MarsCode AI练中学 - 沸点 - 掘金

LangChain 实战课: README.md - MarsCode

LangChain 实战课 - 掘金小册 - 掘金小册