什么是 Prompt Tool

Prompt Tool 是 UR-2.0 中用于构建语言模型输入的组件。每个 Prompt Tool 由 @app.prompt 装饰定义,其主要职责是根据问题、检索段等输入,加载模板文件并生成标准化的 PromptMessage,可直接传递给 LLM 模型进行生成。

如何实现一个 Prompt Tool?

实现一个 Prompt Tool 通常包含以下三个步骤:

Step 1:准备 Prompt 模板

请将你的 prompt 模板保存为 .jinja 结尾的文件,例如:
/images/jinja.svgprompt/qa_rag_boxed.jinja
Please answer the following question based on the given documents.
Think step by step.
Provide your final answer in the format \boxed{YOUR_ANSWER}.

Documents:
{{documents}}

Question: {{question}}

Step 2:在 Prompt Server 中实现 Tool

调用我们提供的 load_prompt_template 方法加载模板,并在 Prompt Server 中实现一个工具函数(Tool)用于组装 prompt:
servers/prompt/src/prompt.py
@app.prompt(output="q_ls,ret_psg,template->prompt_ls")
def qa_rag_boxed(
    q_ls: List[str], ret_psg: List[str | Any], template: str | Path
) -> list[PromptMessage]:
    template: Template = load_prompt_template(template)
    ret = []
    for q, psg in zip(q_ls, ret_psg):
        passage_text = "\n".join(psg)
        p = template.render(question=q, documents=passage_text)
        ret.append(p)
    return ret

Step 3:在 Pipeline 中使用该 Tool

  1. 在 YAML 配置文件中注册 Prompt Server 并调用你实现的 Tool:
/images/yaml.svgservers/prompt/parameter.yaml
# MCP Server
servers:
  generation: servers/generation
  prompt: servers/prompt

# MCP Client Pipeline
pipeline:
- prompt.qa_rag_boxed
- generation.generate
  1. 构建后,修改运行时参数,指定你的模板文件路径:
/images/yaml.svgservers/prompt/parameter.yaml
prompt:
  template: prompt/qa_rag_boxed.jinja

为多个工具绑定不同模板

servers/prompt/src/prompt.py
@app.prompt(output="q_ls,ret_psg,template1->prompt_ls")
def qa_rag_boxed(
    q_ls: List[str], ret_psg: List[str | Any], template: str | Path
) -> list[PromptMessage]:
    xxxx

@app.prompt(output="q_ls,ret_psg,template2->prompt_ls")
def qa_rag_boxed_2(
    q_ls: List[str], ret_psg: List[str | Any], template: str | Path
) -> list[PromptMessage]:
    xxxx
为上述两个工具分别绑定模板路径,在 servers/prompt/parameter.yaml 中添加:
/images/yaml.svgservers/prompt/parameter.yaml
template1: prompt/qa_boxed.jinja
template2: prompt/qa_boxed.jinja
这样可以确保不同工具在执行时使用独立的模板,互不干扰。