聊天模型 Chat models
note
请前往集成,了解与聊天模型提供商的内置集成的文档。
聊天模型是语言模型的一种变体。虽然聊天模型在内部使用语言模型,但它们提供的接口有所不同。它们不是提供一个“输入文本,输出文本”的API,而是提供一个以“聊天消息”作为输入和输出的接口。
聊天模型的API还比较新,所以我们还在摸索正确的抽象。
开始使用
设置
要开始,我们需要安装OpenAI的Python包:
pip install openai
访问API需要一个API密钥,您可以通过创建一个帐户并前往此处获取。一旦我们有了密钥,我们将希望通过运行以下命令将其设置为环境变量:
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()
消息 Messages
聊天模型接口基于消息而不是原始文本。目前在LangChain中支持的消息类型有AIMessage
、HumanMessage
、SystemMessage
和ChatMessage
,其中ChatMessage
接受一个任意角色参数。大多数情况下,您只需要处理HumanMessage
、AIMessage
和SystemMessage
。
__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}}