learn from https://learn.deeplearning.ai/langchain/lesson/2/models,-prompts-and-parsers
这里使用的是 AzureChatOpenAI
from config import api_type, api_key, api_base, api_version, model_name
from langchain.chat_models import AzureChatOpenAI
from langchain import OpenAI, ConversationChain, LLMChain, PromptTemplate
from langchain.prompts import ChatPromptTemplate
from langchain.output_parsers import ResponseSchema
from langchain.output_parsers import StructuredOutputParser
model = AzureChatOpenAI(
openai_api_base=api_base,
openai_api_version=api_version,
deployment_name=model_name,
openai_api_key=api_key,
openai_api_type=api_type,
temperature=0.5,
)
查看源代码,可以看到 AzureChatOpenAI
类是继承的 ChatOpenAI
class AzureChatOpenAI(ChatOpenAI):
"""Wrapper around Azure OpenAI Chat Completion API. To use this class you
must have a deployed model on Azure OpenAI. Use `deployment_name` in the
constructor to refer to the "Model deployment name" in the Azure portal.
sep = '###'
template_string = """
把下面用{sep}包裹的文本用{style}风格表达出来,输出结果不要有{sep}分隔符,使用json格式,key=text。
文本:{sep}{text}{sep}
"""
prompt_template = ChatPromptTemplate.from_template(template_string)
可以看到,提示词模板有三个输出参数
运行以下代码
chatgpt_chain = LLMChain(
llm=model,
prompt=prompt_template,
verbose=True,
)
output = chatgpt_chain.run(sep=sep, text='我家小孩读书不用功,学习习惯不好,我今天打了他一顿', style='古人')
print(type(output))
print(output)
输出:
> Entering new chain...
Prompt after formatting:
Human:
把下面用###包裹的文本用古人风格表达出来,输出结果不要有###分隔符,使用json格式,key=text。
文本:###我家小孩读书不用功,学习习惯不好,我今天打了他一顿###
> Finished chain.
<class 'str'>
{
"text": "吾家之童子,读书不勤,学习之道不得其正。今日吾不得已而责之,以期能改过自新。"
}
输出的内容是字符串
先把模板填好
prompt = prompt_template.format_messages(sep=sep, text='我家小孩读书不用功,学习习惯不好,我今天打了他一顿', style='古人')
prompt
是 list
,里面是 <class 'langchain.schema.messages.HumanMessage'>
output = model(prompt)
print(output.content)
# '{
# "text": "余家稚童讀書不勤,學習習慣不佳,吾今日責之一頓。"
# }'
输出的还是字符串
output_text = ResponseSchema(name='text', description='输出的文本')
event_time = ResponseSchema(name='time', description='事件是什么时候发生的')
people = ResponseSchema(name='people', description='事件发生的人物,使用python list存储')
addr = ResponseSchema(name='addr', description='事件发生地点,如果未知的话,输出未知两个字')
event = ResponseSchema(name='event', description='事件起因')
reponse_schemas = [output_text, event_time, people, addr, event]
output_parser = StructuredOutputParser.from_response_schemas(reponse_schemas)
format_instructions = output_parser.get_format_instructions()
print(format_instructions)
输出
The output should be a markdown code snippet formatted in the following schema, including the leading and trailing "```json" and "```":
```json
{
"text": string // 输出的文本
"time": string // 事件是什么时候发生的
"people": string // 事件发生的人物,使用python list存储
"addr": string // 事件发生地点,如果未知的话,输出未知两个字
"event": string // 事件起因
}
format_instructions
也是一个字符串,它对输出的格式做了说明
那现在改下提示模板:加入输出格式的说明
template_string = """
把下面用{sep}包裹的文本用{style}风格表达出来。
文本:{sep}{text}{sep}
{format_instructions}
"""
prompt_template = ChatPromptTemplate.from_template(template_string)
prompt = prompt_template.format_messages(sep=sep, text='我家小孩读书不用功,学习习惯不好,我今天打了他一顿', style='古人', format_instructions=format_instructions)
output = model(prompt)
输出的是一个 AIMessage
对象
解析
输出结果
output_dict = output_parser.parse(output.content)
print(type(output_dict))
print(output_dict)
print(output_dict['event'])
输出:
<class 'dict'>
{'text': '余家小兒讀書不用功,學習習慣不佳,鄙人今日責打他一頓。',
'time': '古代', 'people': ['我', '小兒'], 'addr': '未知',
'event': '小兒學習不力,需加強教育。'}
小兒學習不力,需加強教育。