自然语言处理从入门到应用——LangChain:模型(Models)-[聊天模型(Chat Models):基础知识]

分类目录:《自然语言处理从入门到应用》总目录


聊天模型是语言模型的一种变体。虽然聊天模型在内部使用语言模型,但它们公开的接口略有不同。它们不是提供一个"输入文本,输出文本"的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目前支持的消息类型有AIMessageHumanMessageSystemMessageChatMessage,其中ChatMessage接受一个任意的角色参数。大多数情况下,我们只需要处理HumanMessageAIMessageSystemMessage

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。我们还可以使用ChatPromptTemplateformat_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/

相关推荐
开MINI的工科男11 分钟前
深蓝学院-- 量产自动驾驶中的规划控制算法 小鹏
人工智能·机器学习·自动驾驶
AI大模型知识分享1 小时前
Prompt最佳实践|如何用参考文本让ChatGPT答案更精准?
人工智能·深度学习·机器学习·chatgpt·prompt·gpt-3
张人玉3 小时前
人工智能——猴子摘香蕉问题
人工智能
草莓屁屁我不吃3 小时前
Siri因ChatGPT-4o升级:我们的个人信息还安全吗?
人工智能·安全·chatgpt·chatgpt-4o
小言从不摸鱼3 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
AI科研视界4 小时前
ChatGPT+2:修订初始AI安全性和超级智能假设
人工智能·chatgpt
霍格沃兹测试开发学社测试人社区4 小时前
人工智能 | 基于ChatGPT开发人工智能服务平台
软件测试·人工智能·测试开发·chatgpt
小R资源4 小时前
3款免费的GPT类工具
人工智能·gpt·chatgpt·ai作画·ai模型·国内免费
artificiali7 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python
酱香编程,风雨兼程7 小时前
深度学习——基础知识
人工智能·深度学习