|
1 | 1 | +++ |
2 | 2 | date = '2025-08-28T8:00:00+08:00' |
3 | 3 | draft = false |
4 | | -title = 'Prompt Origanization' |
| 4 | +title = 'Prompt Organization' |
5 | 5 | tags = ['Prompt', 'LLMs'] |
6 | 6 | +++ |
7 | 7 |
|
@@ -52,8 +52,8 @@ def get_prompt(role: str, query: str) -> list[dict]: |
52 | 52 | 对比 f-string, 模板字符串更加灵活, 且可以只传入部分值 |
53 | 53 |
|
54 | 54 |
|
55 | | -### Jinja2 |
56 | | -Jinja2 是一个现代的设计者友好的, 仿照 Django 模板的 Python 模板语言. 它速度快, 被广泛使用, 并且提供了可选的沙箱模板执行环境保证安全: |
| 55 | +### Jinja |
| 56 | +Jinja 是一个现代的设计者友好的, 仿照 Django 模板的 Python 模板语言. 它速度快, 被广泛使用, 并且提供了可选的沙箱模板执行环境保证安全: |
57 | 57 | 例如下面这个 `.j2` 文件内容, 构造了一个用于少样本提示的模板 |
58 | 58 | ```Jinja |
59 | 59 | {% if examples %} |
@@ -99,13 +99,13 @@ def get_prompt(user_input: str) -> list[dict]: |
99 | 99 |
|
100 | 100 | return messages |
101 | 101 | ``` |
102 | | -使用 Jinja2 模板文件的好处是: |
| 102 | +使用 Jinja 模板文件的好处是: |
103 | 103 | 1. 方便组织提示词文件, 例如这里是将提示词文件放在 `ProjectRoot/app/module/prompt` 里面, 模板文件放在 `prompt/template` 里面, 在提示词文件中导入模板文件十分方便, 文件组织清晰, 代码可读性高, 且方便扩展 |
104 | | -2. 提示词灵活性更好, 对比 string.Template, Jinja2 模板不仅可以填充变量, 还可以在模板中插入循环和条件判断等语法, 使得代码中只需提供一个字典格式的数据即可, 无需在代码里拼凑提示词, 也方便和 RAG 系统结合使用 |
| 104 | +2. 提示词灵活性更好, 对比 string.Template, Jinja 模板不仅可以填充变量, 还可以在模板中插入循环和条件判断等语法, 使得代码中只需提供一个字典格式的数据即可, 无需在代码里拼凑提示词, 也方便和 RAG 系统结合使用 |
105 | 105 |
|
106 | | -虽然 Jinja2 对比 string.Template 性能上要差一些, 但是 LLM 应用真正花时间的地方是模型的推理部分, 相比之下提示词渲染的时间几乎可以忽略不计. 如果提示词非常多, Jinja2 还提供了异步渲染功能, 可以结合异步框架进一步提升性能. |
| 106 | +虽然 Jinja 对比 string.Template 性能上要差一些, 但是 LLM 应用真正花时间的地方是模型的推理部分, 相比之下提示词渲染的时间几乎可以忽略不计. 如果提示词非常多, Jinja 还提供了异步渲染功能, 可以结合异步框架进一步提升性能. |
107 | 107 |
|
108 | 108 | ### Wrapping Up |
109 | | -上面就是近期使用的一些构造提示词的方法, 分别是 `f-string`、`string.Template` 和 `Jinja2`. |
110 | | -当然也有像 `langchain_core.prompts.prompt.PromptTemplate` 这样专用框架提供的提示词模板功能, 但是为了支持 LangChain LCEL 语法等原因, 导致其类型设计十分抽象, 且 LangChain 对新模型和新功能的支持比较缓慢, 加上版本不稳定, 接口经常变动, 故没有考虑使用 LangChain 框架提供的功能.(实际上, langchain 也支持使用 Jinja2 模板) |
| 109 | +上面就是近期使用的一些构造提示词的方法, 分别是 `f-string`、`string.Template` 和 `Jinja`. |
| 110 | +当然也有像 `langchain_core.prompts.prompt.PromptTemplate` 这样专用框架提供的提示词模板功能, 但是为了支持 LangChain LCEL 语法等原因, 导致其类型设计十分抽象, 且 LangChain 对新模型和新功能的支持比较缓慢, 加上版本不稳定, 接口经常变动, 故没有考虑使用 LangChain 框架提供的功能.(实际上, langchain 也支持使用 Jinja 模板) |
111 | 111 | 总之, 上面介绍的提示词构造方法各有优劣, 应该根据你项目的复杂度, 自行选择合适的提示词构造方式. |
0 commit comments