1 获取阿里云的api

这部分主要是就是关于提示词,有用户语言,系统语言,ai语言。下面我来用例子来学习这些

2 HumanMessage, SystemMessage

from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="qwen-plus",
                 openai_api_key="你的阿里云api",
                 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")

这一步就是初始化一个模型调用的阿里云的qwen-plus,这部分我们可以直接在阿里云的文档中学习。

然后下面我们就设置提示词

from langchain.schema.messages import HumanMessage, SystemMessage
messages = [
    SystemMessage(content="请你作为我的数学课助教,用通俗易懂且间接的语言帮我解释数学原理。"),
    HumanMessage(content="什么是勾股定理?"),
]
response = model.invoke(messages)

print(response.content)

这里我们设置系统提示词为“请你作为我的数学课助教,用通俗易懂且间接的语言帮我解释数学原理”,那么回答的问题就有关于我们的数学问题。

3 Prompt Template

from langchain.prompts import (
    SystemMessagePromptTemplate,
    AIMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

这里导入了三个类,就是用户信息模板,ai信息模板,系统模板。就是说我们先写好一个模板后面只需要补全其中的信息就好了。如下

system_template_text="你是一位专业的翻译,能够将{input_language}翻译成{output_language},并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本,不要有任何其它内容。"
system_prompt_template = SystemMessagePromptTemplate.from_template(system_template_text)

现在我就写了一个系统提示词模板,下面我们看看系统提示词模板长啥样

下面我们再创建一个用户提示词模板

human_template_text="文本:{text}\n语言风格:{style}"
human_prompt_template = HumanMessagePromptTemplate.from_template(human_template_text)

下面我们看下怎么往里面传入参数

就这样,我们创建一个模板之后,只需要改变关键词就可以了,不用全部改变了。

print('你好,{0},{1}'.format('小狗','小猫'))
# 你好,小狗,小猫

这里会不会发现和我们的输出时的format差不多的。

下面就是创建一个模型示例,然后传入参数(model.invoke()就是传入参数)

model = ChatOpenAI(model="qwen-plus",
                 openai_api_key="你的阿里云api",
                 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
response = model.invoke([
    system_prompt,
    human_prompt
])

4 ChatPromptTemplate

这个就是前面的优化版本,把原本的多句,要传入参数两次,集合了一下,传一次,但是一次传好几个。

from langchain.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages(
    [
        ("system", "你是一位专业的翻译,能够将{input_language}翻译成{output_language},并且输出文本会根据用户要求的任何语言风格进行调整。请只输出翻译后的文本,不要有任何其它内容。"),
        ("human", "文本:{text}\n语言风格:{style}"),
    ]
)
prompt_template.input_variables
prompt_value = prompt_template.invoke({"input_language": "汉语", "output_language": "汉语",
                                       "text":"勿以善小而不为,勿以恶小而为之。", "style": "白话文"})
prompt_value
prompt_value.messages
model = ChatOpenAI(model="qwen-plus",
                 openai_api_key="你的阿里云api",
                 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
response = model.invoke(prompt_value)
print(response)

4 ai提示词模板

from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage
from langchain.prompts import FewShotChatMessagePromptTemplate, ChatPromptTemplate
example_prompt = ChatPromptTemplate.from_messages(
    [
        ("human", "格式化以下学生信息:\n姓名 -> {customer_name}\n年龄 -> {customer_age}\n 城市 -> {customer_city}"),
        ("ai", "##学生信息\n- 学生姓名:{formatted_name}\n- 学生年龄:{formatted_age}\n- 学籍所在地:{formatted_city}")
    ]
)

这里我们先写了一个样例模板,类似与训练出一个模型一样,让他就这样输出。

然后初始化一些信息

examples = [
    {
        "customer_name": "张三", 
        "customer_age": "7",
        "customer_city": "郑州",
        "formatted_name": "张三",
        "formatted_age": "7岁",
        "formatted_city": "河南省郑州市"
    },
    {
        "customer_name": "李四", 
        "customer_age": "9",
        "customer_city": "广州",
        "formatted_name": "李四",
        "formatted_age": "9岁",
        "formatted_city": "广东省广州市"
    },
]

再使用函数传入进去

few_shot_template = FewShotChatMessagePromptTemplate(
    example_prompt=example_prompt,
    examples=examples,
)

然后再定义一个模板,这个模板就用于后面传入参数了。前面模板只是传入一个example

final_prompt_template = ChatPromptTemplate.from_messages(
    [
        few_shot_template,
        ("human", "{input}"),
    ]
)

定义一个模板,这个模板就是传入上面那个。

final_prompt = final_prompt_template.invoke({"input": "格式化以下学生信息:\n姓名 -> 王五\n年龄 -13\n 城市 -> 南昌'"})

这里我查看了一下我们已经有的信息,和最后一次问的信息。

然后初始化model,传入信息,再输出

model = ChatOpenAI(model="qwen-plus",
                 openai_api_key="你的阿里云api",
                 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
response = model.invoke(final_prompt)
print(response.content)

输出

5 CommaSeparatedListOutputParser

这个就是别人已经定义好的东西,我们直接调用就好了,例如

from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
    ("system", "{parser_instructions}"),
    ("human", "列出5个{subject}国家的汽车品牌。")
])
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
print(parser_instructions)

输出    Your response should be a list of comma separated values, eg: `foo, bar, baz`

意思就是输出的格式是以,分隔的

final_prompt = prompt.invoke({"subject": "美国", "parser_instructions": parser_instructions})

model = ChatOpenAI(model="qwen-plus",
                 openai_api_key="你的阿里云api",
                 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
response = model.invoke(final_prompt)
print(response.content)

传入参数,初始化模型,输出

6 转化为json格式

from typing import List

from langchain.output_parsers import PydanticOutputParser
from langchain.prompts import ChatPromptTemplate
from langchain.schema import HumanMessage
from langchain_core.pydantic_v1 import BaseModel, Field
from langchain_openai import ChatOpenAI
#%%
class FilmInfo(BaseModel):
    film_name: str = Field(description="电影的名字", example="拯救大兵瑞恩")
    author_name: str = Field(description="电影的导演", example="斯皮尔伯格")
    genres: List[str] = Field(description="电影的题材", example=["历史", "战争"])
    #BaseModel用于创建数据模式,也就是数据的说明书,Field是字段,用于为Basemodel里的属性提供额外的信息和验证条件
#%%
output_parser = PydanticOutputParser(pydantic_object=FilmInfo)
#%%
print(output_parser.get_format_instructions())

这个就是定义了一个模板,然后可以输出按照我们的要求的json格式

定义提示词

prompt = ChatPromptTemplate.from_messages([
    ("system", "{parser_instructions} 你输出的结果请使用中文。"),
    ("human", "请你帮我从电影概述中,提取电影名、导演,以及电影的体裁。电影概述会被三个#符号包围。\n###{film_introduction}###")
])
#%%
film_introduction = """《复仇者联盟4:终局之战》(Avengers: Endgame)是美国科幻电影,改编自美国漫威漫画,漫威电影宇宙(Marvel Cinematic Universe,缩写为MCU)第22部影片。影片由安东尼·罗素和乔·罗素执导,小罗伯特·唐尼、克里斯·埃文斯、马克·鲁法洛、克里斯·海姆斯沃斯、斯嘉丽·约翰逊、杰瑞米·雷纳、保罗·路德、布丽·拉尔森、乔什·布洛林、汤姆·希德勒斯顿、汤姆·赫兰德等主演。

讲述《复仇者联盟3:无限战争》的毁灭性事件过后,宇宙由于疯狂泰坦灭霸的行动而变得满目疮痍。无论前方将遭遇怎样的后果,复仇者联盟都必须在剩余盟友的帮助下再一次集结,以逆转灭霸的所作所为,彻底恢复宇宙的秩序。

该片于2019年4月26日在美国上映,4月24日在中国上映。

截止2019年7月21日,《复仇者联盟4》全球票房达27.89亿美元,获全球影史票房总冠军。
"""
final_prompt = prompt.invoke({"film_introduction": film_introduction,
                              "parser_instructions": output_parser.get_format_instructions()})
print(final_prompt)

加载模型,传入参数,输出结构。

model = ChatOpenAI(model="qwen-plus",
                 openai_api_key="你的阿里云api",
                 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")
response = model.invoke(final_prompt)
print(response.content)

7 链式传播

from langchain_openai import ChatOpenAI
from langchain.output_parsers import CommaSeparatedListOutputParser
from langchain.prompts import ChatPromptTemplate
#%%
prompt = ChatPromptTemplate.from_messages([
    ("system", "{parser_instructions}"),
    ("human", "列出5个{subject}生产的汽车的品牌。")
])
#%%
output_parser = CommaSeparatedListOutputParser()
parser_instructions = output_parser.get_format_instructions()
#%%
model = ChatOpenAI(model="qwen-plus",
                 openai_api_key="你的阿里云api",
                 openai_api_base="https://dashscope.aliyuncs.com/compatible-mode/v1")

这里还是和前面一样,定义了一个系统和用户提示词模板,然后输出提示词模板用逗号分隔。

然后我们可以这样传输

result = output_parser.invoke(model.invoke(prompt.invoke({"subject": "中国", "parser_instructions": parser_instructions})))
result

这里我们可以使用chain特殊的传入格式

chat_model_chain = prompt | model | output_parser
result = chat_model_chain.invoke({"subject": "中国", "parser_instructions": parser_instructions})
result

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐