个人笔记之Langchain快速入门(二) | 豆包MarsCode AI 刷题

119 阅读6分钟

书接上回,我们继续看看内容。

第三节

from langchain_openai import ChatOpenAI

langchain_openai

  • 属于 LangChain 的生态系统扩展,专门封装了与 OpenAI 模型的交互逻辑。
  • 目的:简化与 OpenAI Chat API 的调用,隐藏底层的接口细节,提供更直观的高层 API。
  • 优势:可以无缝集成 LangChain 的其他工具,如记忆模块(memory)或工具链(tools)。

为什么要使用langchain?和openai的库有什么区别?

OpenAI 官方 Python 库
  • 定位:专注于直接调用 OpenAI 提供的 API。

  • 功能

    • 提供底层访问接口,例如 completions.create(文本补全)和 chat.completions.create(聊天补全)。
    • 直接控制生成内容的参数(如 temperaturemax_tokens 等)。
  • 适用场景

    • 单一任务,如生成内容、完成一句话、问答等。
    • 用户对 API 调用逻辑非常熟悉,并愿意手动管理对话上下文等内容。
LangChain
  • 定位:一个高层框架,专注于构建复杂的对话式应用

  • 功能

    • 上下文管理:自动维护对话历史和上下文,无需手动管理 messages 列表。
    • 工具集成:支持通过工具(Tools)执行复杂操作,例如数据库查询、API 调用、计算等。
    • 链式调用:可以设计一系列任务链,模型输出可以自动作为下一个步骤的输入。
    • 多模型支持:不仅限于 OpenAI,可以集成其他模型(如 Hugging Face、Cohere)。
    • 记忆功能:通过 Memory 模块保存对话历史,支持长期上下文的任务。
  • 适用场景

    • 构建复杂的对话式应用,如虚拟助理、知识问答系统。
    • 跨多个工具协作的任务(如从数据库中查询数据后再用模型总结结果)。

ChatOpenAI 实例化

llm = ChatOpenAI(
    model=os.environ.get("LLM_MODELEND"),
    temperature=0.8,
    max_tokens=600,
)
  • model=os.environ.get("LLM_MODELEND")

    • 从环境变量中动态获取模型名称(如 gpt-3.5-turbogpt-4)。
    • 灵活性:允许在不同场景中快速切换模型。
  • temperature=0.8

    • 控制生成内容的随机性和创造力:

      • 0.8 是一个较高的值,适合创意类任务(如命名、文案生成)。
      • 越高的值会增加生成结果的多样性。
  • max_tokens=600

    • 限制生成回复的最大长度,防止输出过长或消耗过多 token。
    • 适合任务:命名任务通常不会需要较长的输出,600 token 是足够的限制。

调用 predict 方法

response = llm.predict("请给我的花店起个名")
  • predict 方法

    • ChatOpenAI 的高层方法,用于快速生成单次任务的结果。

    • 输入:只需要一个简单的字符串提示("请给我的花店起个名")。

    • 内部逻辑predict 方法封装了 OpenAI Chat API 的调用,无需显式构建 messages 列表。

    • 特点

      • 适合简化任务:无须多轮对话,只关心单次生成的结果。
      • 如果需要多轮对话,predict 方法可能不足够,需配合 LangChain 的记忆模块。

第四节

重复的部分不再赘述。

调用库

from langchain.schema import HumanMessage, SystemMessage

langchain.schema

  • 提供了定义消息结构的工具。
  • HumanMessage:代表用户的输入消息。
  • SystemMessage:用来指定系统角色或约束模型的行为。

实例化与构建对话信息

chat = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0.8, max_tokens=600)
messages = [
    SystemMessage(content="你是一个很棒的智能助手"),
    HumanMessage(content="请给我的花店起个名"),
]

  • 模型实例化

    • ChatOpenAI 是 LangChain 提供的一个高层封装,用于调用 OpenAI 的聊天模型。

    • 参数:

      • model=os.environ.get("LLM_MODELEND"):从环境变量中动态获取模型名称,方便配置。
      • temperature=0.8:设置生成内容的随机性(偏创意性任务)。
      • max_tokens=600:限制输出的最大长度。
  • 构建消息列表

    • 使用 SystemMessageHumanMessage 定义对话的上下文:

      • SystemMessage:设定系统角色,指引模型行为,这里让 AI 扮演“很棒的智能助手”。
      • HumanMessage:表示用户输入,要求模型为花店起名字。

前后程序有什么区别?

后面的程序使用了 ChatOpenAI 初始化模型时,构造了一个 messages 列表,其中包含 SystemMessageHumanMessage,明确了对话的上下文。模型实例化后,通过 chat(messages) 调用传递消息列表。前一个程序则直接将用户输入作为字符串传递给 predict(),没有显式地构建 SystemMessageHumanMessage,适合处理单一用户输入。

后面的程序通过显式构造系统消息和用户消息,适合更复杂的上下文管理,特别是在多轮对话中,能够清晰地定义模型的行为和用户的请求。而前一个程序则适用于简单的单轮对话或直接任务,不需要明确管理消息角色。

后面的程序需要调用 chat(messages) 并且可能要进一步处理返回结果,而前一个程序通过 predict() 方法直接返回模型的生成内容,简化了响应的处理过程。

为什么我们不直接设计LLM?

直接构建 LLM(大语言模型)虽然看起来能够提供完全的控制权,但实际应用中调用 API 更加高效和可行。首先,训练一个大语言模型需要大量的计算资源、时间和资金。即使使用已有的模型,部署和维护也涉及到硬件、优化、更新等一系列复杂的问题。而通过调用 API,我们可以借助云端的强大计算力和更新能力,避免了这些繁琐的步骤。

其次,调用 API 让开发者专注于应用层面,而不必关心底层模型的实现和更新。OpenAI 和其他平台提供的 API 已经经过优化和测试,确保了模型的性能和准确性。通过 API,我们可以利用最新的研究成果和版本更新,减少了手动调整模型参数和维护版本的工作。

再者,调用 API 是一种按需付费的方式,避免了大规模部署带来的资源浪费。我们可以根据实际需求调整调用频率和计算资源,做到成本控制和高效使用。而如果自己部署模型,需要事先购买昂贵的硬件,并承担持续的维护成本。

最后,API 的易用性和集成性使得开发更为高效。平台通常提供了完善的文档和工具,简化了与模型的交互过程。对于大多数开发者来说,调用 API 可以大大节省开发时间,让他们能更快地实现想法并将其应用到实际场景中。

综合来看,调用 API 相较于自己构建 LLM,不仅在成本、时间和资源管理上更具优势,还能让开发者更专注于创新和应用层面。因此,调用 API 成为大多数开发者的首选方案。