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

posted on 2024-10-18 06:29  荣锋亮  阅读(13)  评论(0编辑  收藏  举报

导航