langchain基础
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

更多推荐




所有评论(0)