一架梯子,一头程序猿,仰望星空!
LangChain教程(Python版本) > 内容正文

LangChain 聊天模型


聊天模型(Chat Models)

聊天模型是语言模型的一种变体。虽然聊天模型在底层使用的也是语言模型,但它们所公开的接口有些不同。它们不是通过 “输入文本,输出文本” API 公开接口,而是通过 “聊天消息” 作为输入和输出的接口,聊天模型的整个交互过程类似互相发送聊天消息的过程。

聊天模型入门

本章节基于OpenAI模型进行讲解。

配置

langChain默认没有安装模型依赖,这里首先安装 OpenAI 的 Python 包:

pip install openai

访问 API 需要一个 API 密钥,可以通过环境变量配置,下面是linux环境变量设置方式

export OPENAI_API_KEY="..."

如果您不想设置环境变量,可以通过在初始化 OpenAI LLM 类时直接通过 openai_api_key 命名参数传递密钥:

from langchain.chat_models import ChatOpenAI

chat = ChatOpenAI(openai_api_key="...")

否则,可以不带任何参数初始化:

from langchain.chat_models import ChatOpenAI
chat = ChatOpenAI()

消息

聊天模型接口基于消息而不是原始文本。LangChain 当前支持的消息类型包括 AIMessageHumanMessageSystemMessageChatMessage,其中 ChatMessage 需要一个任意的角色参数。大多数情况下,你只会处理 HumanMessageAIMessageSystemMessage

__call__

消息输入 -> 消息输出

你可以通过将一个或多个消息传递给聊天模型,模型会返回一条消息。

from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

chat([HumanMessage(content="将这个句子从英语翻译成法语:我喜欢编程。")])
# 模型返回
AIMessage(content="J'aime programmer.", additional_kwargs={})

OpenAI 的聊天模型支持多个消息作为输入。有关更多信息,请参见此处。以下是将系统消息和用户消息发送到聊天模型的示例:

messages = [
    SystemMessage(content="你是一个有帮助的助手,可以把英语翻译成法语。"),
    HumanMessage(content="我喜欢编程。")
]
chat(messages)
# 模型返回
AIMessage(content="J'aime programmer.", additional_kwargs={})

generate

批量调用,更丰富的输出

你可以使用generate批量给模型发送消息。这会返回一个带有额外message参数的LLMResult

batch_messages = [
    [
        SystemMessage(content="你是一个有帮助的助手,可以把英语翻译成法语。"),
        HumanMessage(content="我喜欢编程。")
    ],
    [
        SystemMessage(content="你是一个有帮助的助手,可以把英语翻译成法语。"),
        HumanMessage(content="我喜欢人工智能。")
    ],
]
result = chat.generate(batch_messages)
result
# 模型返回
LLMResult(generations=[[ChatGeneration(text="J'aime programmer.", generation_info=None, message=AIMessage(content="J'aime programmer.", additional_kwargs={}))], [ChatGeneration(text="J'aime l'intelligence artificielle.", generation_info=None, message=AIMessage(content="J'aime l'intelligence artificielle.", additional_kwargs={}))]], llm_output={'token_usage': {'prompt_tokens': 57, 'completion_tokens': 20, 'total_tokens': 77}})

你可以从这个 LLMResult 查询诸如令牌使用情况之类的内容

result.llm_output
{'token_usage': {'prompt_tokens': 57,
      'completion_tokens': 20,
      'total_tokens': 77}}


关联主题