pyfilesystem jinja2 loader 实现prompt-poet 提示词模板管理
效果实际与fsspec jinaj2 laoder类似,就是一个集成测试
pyfilesystem loader 实现
- pyfs_loader.py
import fs
import jinja2
from jinja2.loaders import BaseLoader
class PyFilesystemLoader(BaseLoader):
def __init__(self, fs_url,**kwargs):
self.fs = fs.open_fs(fs_url)
self.search_path = kwargs.get("search_path", None)
def get_source(self, environment, template):
path = template
if self.search_path:
path = self.search_path + "/" + template
print("path with search_path",path)
if not self.fs.exists(path):
raise jinja2.TemplateNotFound(template)
with self.fs.open(path, 'r') as f:
source = f.read()
return source, path, lambda: self.fs.getinfo(path).modified
def list_templates(self):
return [f.path for f in self.fs.walk.files(self.search_path if self.search_path else "/")]
- 业务使用
目前没发布pip 仓库可以通过直接git 模式安装
pip install git+https://github.com/rongfengliang/jinja2_pyfilesystem_loader
因为目前prompt-poet 暂时不支持自定义loader ,临时解决方法就是自己修改template_registry.py 中的_load_template 方法
关于loader 部分修改如下
from pyfs_loader import PyFilesystemLoader
loader = PyFilesystemLoader("osfs://",search_path=template_dir)
env = j2.Environment(loader=loader)
目录结构
集成prompt-poet
from prompt_poet import Prompt
def mydemo():
return "demo"
template_data = {
"character_name": "Character Assistant",
"username": "dalong",
"mydemo": mydemo
}
prompt = Prompt(
template_path="prompt/demo/app.yaml.j2",
template_data=template_data
)
print(prompt.messages)
效果
说明
实现上比较简单,就是利用了pyfilesystem的能力,可以实现比较灵活的处理,目前来说简单场景直接使用官方的本地基本就够用 了,其他模式的loader 可以实现灵活的存储以及集成使用,期待官方支持自定义loader
参考资料
https://github.com/PyFilesystem/pyfilesystem2
https://docs.pyfilesystem.org/en/latest/concepts.html
https://github.com/character-ai/prompt-poet
https://github.com/rongfengliang/jinja2_pyfilesystem_loader