ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

llama.cpp PEG 解析器实战指南:流式解析模型输出、构建 AST 与生成 GBNF 文法

llama.cpp PEG 解析器实战指南:流式解析模型输出、构建 AST 与生成 GBNF 文法 llama.cpp PEG 解析器实战指南流式解析模型输出、构建 AST 与生成 GBNF 文法【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp本文基于 llama.cpp 的官方开发文档 docs/development/parsing.md系统讲解common库中的 PEGPackrat/Earley 风格解析器如何用组合子combinators以 DSL 方式构建模型输出解析器如何通过标签节点生成带语义的 AST以及如何将同一套 PEG 定义转换为 GBNF 文法约束采样。读完本文你将能够自行编写针对特定模型输出格式的解析器并理解它与聊天模板、语法约束生成之间的协作关系。一、定位两套类型前缀与三大特性llama.cpp 的common库内置了一个专为解析模型输出设计的 PEG 解析器。文档明确将其分为两类 APIcommon_peg_*前缀通用类型面向通用解析场景可用于解析模型输出也可用于解析用户提供的正则模式等其它用途。核心实现位于 common/peg-parser.h 与 common/peg-parser.cppcommon_chat_peg_*前缀面向模型输出的专用助手封装了聊天消息的 builder 与 mapper。核心实现位于 common/chat-peg-parser.h 与 common/chat-peg-parser.cpp。文档列出的三大核心特性在源码中都能找到直接对应流式输入的部分解析partial parsing。解析结果类型common_peg_parse_result_type定义了三种状态FAIL、SUCCESS、NEED_MORE_INPUT见 common/peg-parser.h 第 66-70 行。当模型输出尚未到达终止符时解析器不会报错而是返回NEED_MORE_INPUT并保留已确认的 AST 节点——在 common/peg-parser.cpp 中可以看到大量COMMON_PEG_PARSE_RESULT_NEED_MORE_INPUT的返回点分别覆盖字面量、重复、字符类等各组合子的输入可能还没完分支。每个 AST 节点还带有is_partial标志common_peg_ast_node::is_partialmapper 在提取数据时会跳过尚未闭合的部分节点例如 common/chat-peg-parser.cpp 中if (!node.is_partial)的大量判断。这正是逐 token 流式解析得以工作的基础。内置 JSON 解析器。builder 直接提供json()、json_object()、json_array()、json_string()、json_number()、json_bool()、json_null()、json_string_content()、json_member(key, p)等组合子此外源码中还有文档未展开的 Python 值解析器python_value()、python_dict()等以及marker()、quoted_string()等工具见 common/peg-parser.h 第 451-489 行。带语义标签的 AST 生成tagged nodes。通过tag(tag, p)组合子给子解析器打上语义标签多个节点可共享同一标签解析完成后用 mapper 按标签从 AST 中抽取结构化数据如reasoning_content、content、arguments。AST 由common_peg_ast_arena管理节点包含rule、tag、start/end、text、children与is_partial字段并提供find_by_tag/find_by_rule辅助检索。二、完整示例解析带 JSON 参数的工具调用以下是文档给出的示例演示如何解析先输出正文、再输出 【免费下载链接】llama.cppLLM inference in C/C项目地址: https://gitcode.com/GitHub_Trending/ll/llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表