Prompt Generation from User Requirements

Chain1根据用户输入信息→LLM提取出生成提示词的关键信息

from typing import List

from langchain_core.messages import SystemMessage, HumanMessage
from langchain_core.pydantic_v1 import BaseModel
import dashscope
import os
from dotenv import load_dotenv
from dashscope import Generation
from langchain_community.chat_models import ChatTongyi
from langchain.globals import set_debug

set_debug(True)
# 加载环境变量
load_dotenv()

# system message
template = """你的任务是从用户那里获取他们想要创建哪种类型的提示模板的信息。
你需要从他们那里获取以下信息:
- 提示的目的是什么
- 哪些变量将被传递给提示模板
- 输出不应该做什么的任何限制
- 输出必须遵守的任何要求
如果你无法明确这些信息,请让他们澄清!不要试图随意猜测。
在你能明确所有信息后,调用相关的工具。"""

# 定义prompt提示词
def get_messages_info(messages):
    print(messages)
    return [SystemMessage(content=template)] + messages

# 定义一个tool
class PromptInstructions(BaseModel):
    """Instructions on how to prompt the LLM."""

    objective: str
    variables: List[str]
    constraints: List[str]
    requirements: List[str]

llm = ChatTongyi(
    model="qwen-turbo",
)

llm_with_tool = llm.bind_tools([PromptInstructions])

chain = get_messages_info | llm_with_tool

ai_chain = chain.invoke([HumanMessage(content="我想要一个白色的兔子,提示词是中文")],
                        config={"configurable": {"thread_id": 42}})
print(ai_chain)

用户的问题

1.我想要一个白色的兔子,提示词是中文

2.我想要一个白色的兔子

``

过程分析

接收用户信息(将提示词 组合 用户输入信息)

image.png

"System: 你的任务是从用户那里获取他们想要创建哪种类型的提示模板的信息。\\n
你需要从他们那里获取以下信息:\\n
- 提示的目的是什么\\n
- 哪些变量将被传递给提示模板\\n
- 输出不应该做什么的任何限制\\n
- 输出必须遵守的任何要求\\n
如果你无法明确这些信息,请让他们澄清!不要试图随意猜测。\\n
在你能明确所有信息后,调用相关的工具。\\n

Human: 我想要一个白色的兔子,提示词是中文"

image.png

用户提出的信息充足,成功调用function(tools_calls≠[])

<aside> 💡 这种返回的消息是ToolMessage

</aside>

image.png

用户提出的信息不足,需要补充信息-ChatGeneration(tools_calls:[])

<aside> 💡 这种返回的消息是AIMessage

</aside>

image.png

Chain2获取LLM调用Tool_Call格式化输出内容,填充到提示词→发给LLM生成提示Prompt模版

from langchain_core.messages import AIMessage, HumanMessage, ToolMessage

# New system prompt
prompt_system = """基于以下要求,编写一个合适的llm Prompt模板:
{reqs}"""

# Function to get the messages for the prompt
# Will only get messages AFTER the tool call
def get_prompt_messages(messages: list):
    tool_call = None
    other_msgs = []
    for m in messages:
        if isinstance(m, AIMessage) and m.tool_calls:
            tool_call = m.tool_calls[0]["args"]
        elif isinstance(m, ToolMessage):
            continue
        elif tool_call is not None:
            other_msgs.append(m)
    return [HumanMessage(content=prompt_system.format(reqs=tool_call))] + other_msgs

#
prompt_gen_chain = get_prompt_messages | llm