【langchain手把手2】构造Prompt模版

提示词是模型的输入,通过编写提示词可以和模型进行交互。LangChain中提供了许多模板和函数用于模块化构建提示词。开发者可以:

  • 模块化构建:通过模板和函数,LangChain允许用户以模块化的方式构建提示词,这意味着可以重复使用某些构建块来创建新的提示词,从而提高效率和一致性。
  • 灵活性:模板可以提供灵活的方法来生成提示词,允许用户根据需要调整和定制提示词,以适应不同的场景和需求。
  • 复用性:通过模板,LangChain 允许提示词的复用,这意味着一旦创建了一个有效的提示词模板,它可以被多次用于不同的上下文,而无需从头开始编写。
  • 通用模板:这些模板可能用于生成适用于各种模型的通用提示词。
  • 聊天提示词模板:专门设计用于聊天机器人或对话系统的模板,这些模板可能包含特定的结构或语言风格,以适应对话交互的特点。
  • 调用模型的方式:LangChain可能支持不同的模型调用方式,提示词模板会根据调用方式的不同而有所区别,以确保最佳性能和交互效果。

参考官方API文档:https://api.python.langchain.com/en/latest/core_api_reference.html#module-langchain_core.prompts

示例文档:https://python.langchain.com/v0.1/docs/modules/model_io/prompts/quick_start/

接上一节,依旧以星火模型为例。

#星火认知大模型调用秘钥信息,请前往讯飞开放平台控制台(https://console.xfyun.cn/services/bm35)查看
SPARKAI_APP_ID = '*'
SPARKAI_API_SECRET = '*'
SPARKAI_API_KEY = '*'
#星火认知大模型Spark3.5 Max的URL值,其他版本大模型URL值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_URL = 'wss://spark-api.xf-yun.com/v1.1/chat'
# SPARKAI_URL = 'wss://spark-api.xf-yun.com/v3.1/chat' # Spark Pro
#星火认知大模型Spark3.5 Max的domain值,其他版本大模型domain值请前往文档(https://www.xfyun.cn/doc/spark/Web.html)查看
SPARKAI_DOMAIN = 'general' # 这里选用星火Lite
# SPARKAI_DOMAIN = 'generalv3' # Spark Pro

Prompt templates可以理解为预先定义好的参数化的prompt,可以动态传入不同的参数值而成为prompt;它是一个模版,可以包含命令、少样本示例、具体上下文和特定的问题。LangChain封装好了很多相关的工具可以让我们方便地使用prompt。

示例1:Use PromptTemplate to create a template for a string prompt.

# Use PromptTemplate to create a template for a string prompt.
from langchain_core.prompts import PromptTemplate

prompt_template = PromptTemplate.from_template(
    "Tell me a {adjective} joke about {content}."
)
prompt_template.format(adjective="funny", content="chickens")

输出

'Tell me a funny joke about chickens.'

示例2:通过ChatPromptTemplate去形成多轮对话

形成Prompt,包含各种角色信息,问题是你的名字叫什么,再隔了一次问答之后看看模型是否能正确回答

# 每条聊天消息都与内容和一个名为role的附加参数相关联。例如,在OpenAI聊天完成API中,聊天消息可以与AI助手、人类或系统角色相关联。
# 以下根据官方代码实现一个多轮对话

from langchain_core.prompts import ChatPromptTemplate

chat_template = ChatPromptTemplate.from_messages(
    [
        # 星火的三个角色是system、human、assistant
        ("system", "You are a helpful AI bot. Your name is {name}."),
        ("human", "Hello, how are you doing?"), # 上轮问题
        ("assistant", "I'm doing well, thanks!"), # 上轮回答
        ("human", "{user_input}")
    ]
)

messages = chat_template.format_messages(name="LLM硬着陆", newName="哈哈", user_input="What is your name?")

print(messages)

输出:

[SystemMessage(content='You are a helpful AI bot. Your name is LLM硬着陆.'), HumanMessage(content='Hello, how are you doing?'), AIMessage(content="I'm doing well, thanks!"), HumanMessage(content='What is your name?')]

引入星火模型进行对话

# 引入星火模型
from langchain_community.chat_models.sparkllm import ChatSparkLLM

chatLLM = ChatSparkLLM(
    api_key=SPARKAI_API_KEY,
    api_secret=SPARKAI_API_SECRET,
    app_id=SPARKAI_APP_ID,
    spark_api_url=SPARKAI_URL, # 默认3.5,这里需要配置一下
    spark_llm_domain=SPARKAI_DOMAIN, # 默认3.5,这里需要配置一下
    top_k=6 # 取值为[1,6],默认为4,为了每次结果的随机性,这里设成最大
)

chatLLM(messages)

输出

`AIMessage(content='My name is iFLYTEK Spark. How can I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 20, 'completion_tokens': 17, 'total_tokens': 37}}, id='run-7665b56a-f4c4-421d-a76e-e0b81f39b808-0')`

发现并没有正确回答,研究对照之后,发现prompt_tokens明显不对,切换到Spark Pro(3.1)/Spark Max(3.5)版本后可以正常回答,结果如下

  • Spark Lite:AIMessage(content='My name is iFLYTEK Spark. How can I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 20, 'completion_tokens': 17, 'total_tokens': 37}}, id='run-7665b56a-f4c4-421d-a76e-e0b81f39b808-0')
  • Spark Pro:AIMessage(content='My name is LLM硬着陆. How may I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 35, 'completion_tokens': 15, 'total_tokens': 50}}, id='run-52a592e9-a688-4418-ae1d-206844e21713-0')
  • Spark Max:AIMessage(content='My name is LLM硬着陆. How may I assist you today?', response_metadata={'token_usage': {'question_tokens': 5, 'prompt_tokens': 35, 'completion_tokens': 15, 'total_tokens': 50}}, id='run-f3b9bb20-acfc-4b2c-acb3-32c9d1c6e919-0')

Spark Pro和Spark Max都能正常回答问题。可以从结果上看到,Lite的prompt_tokens受到了限制,不支持多轮对话。

这样,通过ChatPromptTemplate就构造了一个多轮会话的Prompt。一个简单的示例,此外通过Prompts能

  • 连接特征库
  • 自定义propmt模版
  • 少样本prompt模版
  • 输出模版
  • MessagePromptTemplate
  • 部分prompt模版
  • prompt组合
  • prompt序列化
  • prompt模版校验

请关注LLM硬着陆公众号,共同学习进步

在这里插入图片描述

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值