提示词是模型的输入,通过编写提示词可以和模型进行交互。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)版本后可以正常回答,结果如下
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')
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')
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能
请关注
LLM硬着陆
公众号,共同学习进步