分类目录:《自然语言处理从入门到应用》总目录
聊天模型是语言模型的一种变体。虽然聊天模型在内部使用语言模型,但它们公开的接口略有不同。它们不是提供一个"输入文本,输出文本"的API,而是提供一个以"聊天消息"作为输入和输出的接口。 聊天模型的API还比较新,因此我们仍在确定正确的抽象层次。本问将介绍如何开始使用聊天模型,该接口是基于消息而不是原始文本构建的:
dart
from langchain.chat_models import ChatOpenAI
from langchain import PromptTemplate, LLMChain
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
AIMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(temperature=0)
通过向聊天模型传递一个或多个消息,可以获取聊天完成的结果。响应将是一个消息。LangChain目前支持的消息类型有AIMessage
、HumanMessage
、SystemMessage
和ChatMessage
,其中ChatMessage接受一个任意的角色参数。大多数情况下,我们只需要处理HumanMessage
、AIMessage
和SystemMessage
:
dart
chat([HumanMessage(content="Translate this sentence from English to French. I love programming.")])
输出:
dart
AIMessage(content="J'aime programmer.", additional_kwargs={})
OpenAI的聊天模型支持多个消息作为输入。更多信息请参见这里。以下是向聊天模型发送系统消息和用户消息的示例:
dart
messages = [
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="I love programming.")
]
chat(messages)
输出:
dart
AIMessage(content="J'aime programmer.", additional_kwargs={})
您还可以进一步生成多组消息的完成结果,使用generate
方法实现。该方法将返回一个带有额外message
参数的LLMResult
。
dart
batch_messages = [
[
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="I love programming.")
],
[
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="I love artificial intelligence.")
],
]
result = chat.generate(batch_messages)
result
输出:
dart
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
中获取诸如标记使用情况之类的信息:
dart
result.llm_output
输出:
dart
{'token_usage': {'prompt_tokens': 57,
'completion_tokens': 20,
'total_tokens': 77}}
PromptTemplates
我们可以使用模板来构建MessagePromptTemplate
。我们可以从一个或多个MessagePromptTemplate
构建一个ChatPromptTemplate
。我们还可以使用ChatPromptTemplate
的format_prompt
方法,它将返回一个PromptValue
,我们可以将其转换为字符串或消息对象,具体取决于我们是否希望将格式化后的值作为输入传递给LLM或Chat模型的输入。为了方便起见,模板上公开了一个from_template
方法。如果您要使用此模板,代码如下所示:
dart
template="You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template="{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])
# 获取格式化后的消息的聊天完成结果
chat(chat_prompt.format_prompt(input_language="English", output_language="French", text="I love programming.").to_messages())
输出:
dart
AIMessage(content="J'adore la programmation.", additional_kwargs={})
如果我们想直接更直接地构建MessagePromptTemplate
,我们可以在外部创建一个PromptTemplate
,然后将其传递进去,例如:
dart
prompt=PromptTemplate(
template="You are a helpful assistant that translates {input_language} to {output_language}.",
input_variables=["input_language", "output_language"],
)
system_message_prompt = SystemMessagePromptTemplate(prompt=prompt)
LLMChain
我们可以以与以前非常相似的方式使用现有的LLMChain,即提供一个提示和一个模型:
dart
chain = LLMChain(llm=chat, prompt=chat_prompt)
chain.run(input_language="English", output_language="French", text="I love programming.")
输出:
dart
"J'adore la programmation."
Streaming
通过回调处理,ChatOpenAI支持流式处理。
dart
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
chat = ChatOpenAI(streaming=True, callbacks=[StreamingStdOutCallbackHandler()], temperature=0)
resp = chat([HumanMessage(content="Write me a song about sparkling water.")])
输出:
dart
Verse 1:
Bubbles rising to the top
A refreshing drink that never stops
Clear and crisp, it's pure delight
A taste that's sure to excite
Chorus:
Sparkling water, oh so fine
A drink that's always on my mind
With every sip, I feel alive
Sparkling water, you're my vibe
Verse 2:
No sugar, no calories, just pure bliss
A drink that's hard to resist
It's the perfect way to quench my thirst
A drink that always comes first
Chorus:
Sparkling water, oh so fine
A drink that's always on my mind
With every sip, I feel alive
Sparkling water, you're my vibe
Bridge:
From the mountains to the sea
Sparkling water, you're the key
To a healthy life, a happy soul
A drink that makes me feel whole
Chorus:
Sparkling water, oh so fine
A drink that's always on my mind
With every sip, I feel alive
Sparkling water, you're my vibe
Outro:
Sparkling water, you're the one
A drink that's always so much fun
I'll never let you go, my friend
Sparkling
参考文献:
[1] LangChain 🦜️🔗 中文网,跟着LangChain一起学LLM/GPT开发:https://www.langchain.com.cn/
[2] LangChain中文网 - LangChain 是一个用于开发由语言模型驱动的应用程序的框架:http://www.cnlangchain.com/