尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Fabric Contexts 与 Sessions 实战指南:对话状态管理与可复用提示词注入

Fabric Contexts 与 Sessions 实战指南:对话状态管理与可复用提示词注入 Fabric Contexts 与 Sessions 实战指南对话状态管理与可复用提示词注入【免费下载链接】FabricFabric is an open-source framework for augmenting humans using AI. It provides a modular system for solving specific problems using a crowdsourced set of AI prompts that can be used anywhere.项目地址: https://gitcode.com/GitHub_Trending/fa/FabricFabric 通过Contexts上下文与Sessions会话两套机制管理对话状态与可复用的提示词数据Context 将命名文本以系统消息形式注入对话开头Session 则持久化完整的消息历史。本文基于 docs/contexts-and-sessions-tutorial.md 展开结合仓库源码internal/core/chatter.go、internal/plugins/db/fsdb 与 internal/server深入讲解二者在 CLI 与 REST API 中的实际用法、底层存储结构与完整调用链读完后你将能熟练使用 Fabric 构建带状态的多轮对话并能为自己的项目扩展 Context/Session 能力。Context 与 Session 的核心概念Context注入对话开头的命名文本Context上下文是 Fabric 在每次对话开始时注入的一段命名文本其内容作为一条system 消息参与模型推理。它可以承载任意可复用的提示词内容例如偏好的写作风格或语气规范领域知识背景医疗、法律、金融等对助手行为的固定指令如始终用中文回答。在磁盘层面Context 存储在~/.config/fabric/contexts目录下每个文件名即 Context 名称文件内容即注入文本。从源码看internal/plugins/db/fsdb/db.go 中 Contexts 实体的定义没有指定文件扩展名这意味着你可以使用任意扩展名或无扩展名的纯文本文件db.Contexts ContextsEntity{ StorageEntity{Label: Contexts, Dir: db.FilePath(contexts)}}而 Sessions 实体的定义则显式指定了.json扩展名internal/plugins/db/fsdb/db.godb.Sessions SessionsEntity{ StorageEntity{Label: Sessions, Dir: db.FilePath(sessions), FileExtension: .json}}Session持久化的对话消息历史Session会话用于追踪一次对话的完整消息历史。当你指定一个会话名称时Fabric 会加载该会话已有的全部消息若存在追加本轮新增的用户消息与模型回复将最新历史写回磁盘。Sessions 以JSON 格式存储在~/.config/fabric/sessions目录下。从源码看internal/plugins/db/fsdb/sessions.go 中 Session 的数据结构为type Session struct { Name string Messages []*chat.ChatCompletionMessage vendorMessages []*chat.ChatCompletionMessage }vendorMessages是内部字段用于向模型供应商发送消息时剔除meta角色的消息internal/plugins/db/fsdb/sessions.go。CLI 命令行实战Context 相关命令Fabric 的 CLI 为 Context 提供了四个核心辅助命令对应定义位于 internal/cli/flags.go命令短选项说明--context name-C选择要使用的 Contextdescription: Choose a context from the available contexts默认值为空字符串--listcontexts-x列出所有可用的 ContextList all contexts--printcontext name—打印指定 Context 的内容Print context--wipecontext name-w删除指定 ContextWipe context典型用法# 列出所有可用的 context fabric --listcontexts # 查看名为 writer 的 context 内容 fabric --printcontext writer # 在对话中使用 writer context fabric --context writer 请审阅我下面的段落 # 删除不再需要的 context fabric --wipecontext old-context--printcontext的底层实现在 internal/plugins/db/fsdb/contexts.go它先调用Get从磁盘加载 Context再将Content打印到标准输出。Session 相关命令Session 同样有四个辅助命令定义于 internal/cli/flags.go命令短选项说明--session name—附加到指定会话Choose a session from the available sessions--listsessions-X列出所有存储的会话List all sessions--printsession name—打印指定会话内容Print session--wipesession name-W删除指定会话Wipe session典型用法# 列出所有会话 fabric --listsessions # 打印某个会话的完整历史 fabric --printsession mychat # 开始/继续一个名为 mychat 的会话 fabric --session mychat 继续上一轮的分析 # 清理历史会话 fabric --wipesession old-chat会话不存在时会自动创建——无需预先初始化。internal/plugins/db/fsdb/sessions.go 的Get方法会先通过ValidateStorageName校验名称合法性然后检查文件是否存在存在则通过LoadAsJson加载消息数组不存在则打印创建新会话提示并返回一个空 Session。日常使用场景Context 与 Session 的分工二者服务于不同的日常需求Context复用提示词文本如偏好风格、领域知识、助手指令。它是静态的、可跨会话共享的。Session维持持续的对话历史让 Fabric 记住之前轮次的交流内容。它是动态的、按会话隔离的。实战工作流示例创建 Context 文件手动在~/.config/fabric/contexts/writer中写入你的写作规范例如语气、句式偏好、禁止事项等。结合 Pattern 使用Context 与 Pattern 可以叠加——Context 注入通用指令Pattern 注入任务型提示词。例如# writer context summarize pattern 命名会话 fabric --context writer --pattern summarize --session mychat 请总结这份会议纪要延续会话下一次直接使用同一会话名继续对话模型会基于完整历史作答fabric --session mychat 基于上次总结再提取三条行动项提示--output-session标志可将整个会话包括临时会话输出到输出文件便于审计与存档该标志同样定义于 internal/cli/flags.go。Context 与 Session 的交互机制当 Fabric 处理一次聊天请求时其核心调用链如下internal/core/chatter.go 的BuildSession方法加载会话若指定了SessionName从数据库读取已有 Session否则新建空 Session。加载 Context若指定了ContextName调用o.db.Contexts.Get(name)获取其文本内容。加载 Pattern若指定了PatternName获取 Pattern 模板含变量替换。拼接系统消息通过joinPromptSections将 Context 内容与 Pattern 内容拼接为系统消息若还指定了策略Strategy策略提示词会置于最前若指定了非英文的Language还会追加用指定语言回答的强化指令。注入与请求系统消息以system角色追加到 Session连同历史消息一起发送给模型。回写会话模型回复以assistant角色session.Append(...)追加并在Send的收尾阶段internal/core/chatter.go通过SaveSession写回磁盘使后续调用延续同一状态。原文档中的关键代码片段对应源码如下internal/core/chatter.go 与 internal/core/chatter.go// if a context name is provided, retrieve it from the database var contextContent string if request.ContextName ! { var ctx *fsdb.Context if ctx, err o.db.Contexts.Get(request.ContextName); err ! nil { err fmt.Errorf(i18n.T(chatter_error_find_context), request.ContextName, err) return } contextContent ctx.Content }systemMessage : joinPromptSections(contextContent, patternContent)注意joinPromptSectionsinternal/core/chatter.go会 trim 各段内容、丢弃空段并以换行拼接——因此即使某个段为空也不会产生多余的空系统消息。REST API 端点详解Fabric 的 REST 服务器暴露了 Context 与 Session 的 CRUD 端点。路由注册位于 internal/server/serve.goNewContextsHandler(r, fabricDb.Contexts) NewSessionsHandler(r, fabricDb.Sessions)原文档列出的四个基础端点GET /contexts/:name– 获取指定 ContextPOST /contexts/:name– 保存指定 Context请求体为原始文本GET /contexts/names– 列出所有 Context 名称GET /sessions/:name– 获取指定 SessionPOST /sessions/:name– 保存指定 SessionGET /sessions/names– 列出所有 Session 名称注意实际仓库中的端点多于文档所列。两个实体共用泛型处理器StorageHandlerinternal/server/storage.go自动注册了以下完整路由方法路径说明GET/{entity}/:name获取单项GET/{entity}/names列出所有名称DELETE/{entity}/:name删除单项GET/{entity}/exists/:name检查是否存在PUT/{entity}/rename/:oldName/:newName重命名POST/{entity}/:name保存请求体即内容其中{entity}对应contexts或sessions。示例# 列出所有 context curl http://localhost:8080/contexts/names # 读取名为 writer 的 context curl http://localhost:8080/contexts/writer # 写入/覆盖一个 context请求体为纯文本 curl -X POST http://localhost:8080/contexts/writer \ --data-binary 你是一名严谨的中文技术编辑…… # 检查会话是否存在 curl http://localhost:8080/sessions/exists/mychat # 读取会话完整 JSON含全部消息数组 curl http://localhost:8080/sessions/mychat存储层安全设计从源码看存储层有明确的安全防护internal/server/storage.goHTTP 处理器会先调用ValidateStorageName定义于 internal/plugins/db/fsdb/storage.go校验名称非法名称返回400合法但读取失败的错误则统一返回500并仅输出泛化错误信息避免将底层绝对文件路径泄露给客户端internal/server/storage.go。开发者视角文件系统存储实现从磁盘加载 Contextinternal/plugins/db/fsdb/contexts.go// Get Load a context from file func (o *ContextsEntity) Get(name string) (ret *Context, err error) { var content []byte if content, err o.Load(name); err ! nil { return } ret Context{Name: name, Content: string(content)} return }Load由基类StorageEntity实现internal/plugins/db/fsdb/storage.go本质是读取~/.config/fabric/contexts/name文件。Configure方法internal/plugins/db/fsdb/storage.go会在启动时MkdirAll创建目录因此首次运行无需手动建目录。会话的加载与保存internal/plugins/db/fsdb/sessions.gofunc (o *SessionsEntity) Get(name string) (session *Session, err error) { if err ValidateStorageName(name); err ! nil { return nil, err } session Session{Name: name} if o.Exists(name) { err o.LoadAsJson(name, session.Messages) } else { fmt.Printf(i18n.T(sessions_creating_new), name) } return } func (o *SessionsEntity) SaveSession(session *Session) (err error) { return o.SaveAsJson(session.Name, session.Messages) }底层SaveAsJson/LoadAsJsoninternal/plugins/db/fsdb/storage.go负责 JSON 序列化/反序列化文件即~/.config/fabric/sessions/name.json。Session.Append在vendorMessages非空时会同步维护两份消息列表确保发给模型的消息始终剔除 meta 角色internal/plugins/db/fsdb/sessions.go。完整的发送调用链Chatter.Sendinternal/core/chatter.go的流程为BuildSession组装含 Context/Pattern/Strategy 的会话session.GetVendorMessages()取出发往模型的净消息流式SendStream或非流式Send调用模型供应商回复追加为 assistant 消息若session.Name ! 则SaveSession持久化。测试验证仓库包含针对 Context 与 Session 的单元测试可帮助你理解预期行为internal/plugins/db/fsdb/contexts_test.go验证ContextsEntity.Get能从磁盘加载并返回Name与Contentinternal/plugins/db/fsdb/sessions_test.go验证会话的获取/创建语义internal/server/path_traversal_test.go覆盖存储名称校验与路径穿越防护。运行测试go test ./internal/plugins/db/fsdb/... ./internal/server/...小结Context 提供可复用的系统级指令Session 维护持续的对话历史二者在 internal/core/chatter.go 的BuildSession中合流Context 文本与 Pattern 文本拼接为 system 消息与完整 Session 历史一同发往模型回复再回写 Session。正是这套机制让 Fabric 得以构建富状态的、可与大语言模型进行多轮深入交互的应用。从 CLI 的--context/--session一族命令到 REST 的/contexts/*与/sessions/*端点再到fsdb的文件系统存储实现整条链路设计清晰、扩展方便是理解 Fabric 对话引擎的关键入口。【免费下载链接】FabricFabric is an open-source framework for augmenting humans using AI. It provides a modular system for solving specific problems using a crowdsourced set of AI prompts that can be used anywhere.项目地址: https://gitcode.com/GitHub_Trending/fa/Fabric创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表