Sillytavern反代+Wikipedia实现半React prompting分析理论框架切换
Published in sszlzzz的酒馆, 2026
理论基础
本文建立在Yao等人(2022)著名的关于ReAct Prompting的论文ReAct: Synergizing Reasoning and Acting in Language Models上。
测试环境
我使用deepseek-reasoner作为推理模型,使用gemini3.1pro来vibe coding(甚至使用的是客户端而不是vs code插件…),RAG数据库使用gork-4.1-fast-reasoning,我还开了酒馆自带的RAG功能并使用koboldcpp配置qwen3.5-9B-IQ3-XXS。测试卡是“艾格基斯”(是被咸鱼二手贩子倒卖的卡,致歉)
工作逻辑
首先,我在原有的问Sillytavern相关问题的对话中让Gemini基于这篇论文给出摘要。
ReAct拓扑结构(垂直深度):这是一个顺序的马尔可夫决策过程(MDP)循环。模型生成一个想法,停止,执行一个动作,等待外部环境注入观察结果,然后基于注入的上下文继续执行后续操作。
纠错机制:环境反馈。如果模型错误地判断了一个事实,后续的API搜索(动作)将返回“未找到”(观察结果)。此时,模型会生成一个新的想法(“我之前的假设是错误的,我需要搜索不同的术语”),并在生成过程中动态地进行自我纠错。
接下来,我让gemini阅读*【明月秋青写卡】2.2.3.json和我旧的上下文预设文件,让它分析是否已有ReAct结构存在,如果没有,那么思考如何加入这一架构以及其可能缺陷。
非常可行,强烈推荐用于构建复杂的世界。ReAct 将 LLM 从被动的叙事者转变为主动的“世界管理者”。ReAct 循环允许模型“暂停”生成,动态查询您的世界信息/背景设定集,计算骰子点数或检查角色属性,然后再生成文本,而不是让模型盲目地猜测后台发生的事情。 潜在缺点:
- 严重的上下文臃肿(轨迹问题): ReAct 要求模型输出连续的日志Thought -> Action -> Observation。在长时间的聊天过程中,如果这些日志保存在聊天记录中,上下文窗口将被机器人调试文本填满(例如,想法:我需要查看战队规则。行动:搜索[战队规则]。观察:规则 4 规定……)。
- 延迟(多轮执行):用户单次输入可能需要触发 2 到 3 次隐藏的 API 调用才能生成最终叙述。用户会经历 15 到 30 秒的“思考停顿”。
- 格式脆弱性:开源模型(有时甚至是 GPT-4)在发出指令后经常无法停止生成Action。它们可能会Observation自行产生错误信息,而不是等待外部环境返回该信息,从而完全破坏 ReAct 循环。
gemini建议使用宏实现prompting监听和截断,这也是现在酒馆插件的主流方法之一。我首先使其创建了一个硬编码API(这是个主要问题,但我当时只想自己使用这一反代)信息的反向代理python文件react_proxy.py。两个基础工具SEARCH_WIKI和READ_WIKI_PAGE被创建,他们是线性触发关系,也就是先让模型在意识到需要新理论时完成执行搜索维基百科并抓取条目内摘要这两个步骤。两个工具被加入位于上下文预设倒数第三个的底层越狱区块。
SEARCH_WIKI- Use this to search Wikipedia for vague real-world topics to find exact entry titles. (e.g.,::: ACTION_CALL: SEARCH_WIKI | Main theories of sociology :::)READ_WIKI_PAGE- Use this to read the full text of a specific Wikipedia entry. You must use the EXACT title found via SEARCH_WIKI. (e.g.,::: ACTION_CALL: READ_WIKI_PAGE | Sociological theory :::)
对这两个工具进行触发调用的prompts逻辑体现在两个地方。第一个地方是对我旧的预设中原有的要求模型每轮对话都更换至少一个分析框架的区块“理论连贯与累积拓展”的修改。这里第一次规定了工具调用。
[累积认知协议]:您不再需要手动计算理论使用情况。环境中间件会自动跟踪。请阅读上下文顶部的
::: 系统注入 ::: 当前累积理论使用计数。
1. 一致性评估:评估上一轮使用的理论是否仍然适用。如果适用,请继续使用它们以保持一致性。
> 第一条是我在第一次调试后意识到该预设继承了旧预设中强制模型每轮都更换一个理论的强制特性后加入的,鼓励模型不要每轮都换理论。
2. 累积耗尽(3 法则):查看系统注入。任何计数为 3 或更高的理论都将被永久耗尽并严格禁止使用。
> 这是我在发现模型没法记住理论使用次数后引入的计数器逻辑。
3. 认知扩展:如果您的当前理论已耗尽,您必须执行 `SEARCH_WIKI` 以查找新的、与之竞争的学术框架。
> 工具调用prompt。
这里的一个问题是理论无法被复用,但我相信以目前人文社科到临床心理学的理论密度,在单一情境下不太可能找不到其它与已被禁用但适用于新对话情境的理论。
第二个地方则是工具prompts所在的底层越狱板块。在工具定义前,再次注入工具调用prompts。
### [ReAct 协议 - 动态上下文检索]:您已连接到外部环境中间件。您不得凭空臆想关键的社会学数据、世界规则或数学变量。[零信任规则]:您不得凭空臆想或依赖内部预训练数据来理解系统提示中提及的复杂学术理论、社会学框架或历史事实(例如,拉康精神分析、格式塔心理学等)。如果提示要求您应用特定理论,您必须首先使用工具检索其权威定义。要执行操作,请在您的 <thinking> 代码块中输出以下格式,并立即停止生成:`::: ACTION_CALL: [ACTION_NAME] | [QUERY] :::`
对于deepseek-reasoner而言,这两个包括不信任prompts的区块已经足够它触发工具调用了。这里的核心是要求模型识别到特定理论名称后使用调用维基百科抓取工具而不是使用它数据库内的理论文本。
测试后,一个主要问题是模型会在Cot的output中将理论名称记录为理论学术名称-sub理论,这个sub理论通常是不那么统一的概要,所以导致模型在读取时认为这两个sub理论实际上是不同的理论,导致计数失败。为此,我要求gemini加入外部数据库功能,强制每个新聊天在工程文件同一文件夹中创建一个theory_db_聊天名.json的外部表格记录理论使用次数。强制模型在每轮对话前后分别读取和改写这一表格。
"Dramaturgy (sociology)": 2,
"Rational choice theory": 1
这一表格终于没有把“sub理论”的小尾巴给加上了。我认为这一功能可以轻松整合进各类聊天记录向量化的数据库(如神话降临数据库)。
一个新的问题是,当模型认为单轮对话中需要的新理论过多时,可能把所有由MAX_REACT_ITERATIONS定义的迭代次数全部用在工具调用上。因为目前我还没加入让模型单轮迭代抓取多个维基百科条目的功能(一个方向),所以它一轮迭代只能引入一个理论,导致有时它会把最后一次迭代也用作此并导致实际上的output清零。为解决这个问题,我让gemini在反代中内置了迭代计时器功能,强制模型最后一轮迭代不使用工具调用。同时还增加了通过检测input上下文突然减少而识别开始新聊天的机制。log会输出:
🔄 [SYSTEM DETECT] 检测到全新对话 (信标: default),正在重置理论数据库…
反代和酒馆本身的log都被生成在插件子文件夹logs中。
这是一个原始的酒馆插件,它实现了我预期的两个功能:1.在故事情境和分析框架脱节时自动更换理论;2.保证单一理论不会被应用很多论对话(轮数可以通过更改预设中10.理论连贯与累积拓展的默认设置实现)。
未来应用场景
我认为,相同的机制可以被套用在写卡或是根据已存在的世界观(比如流行的使用热门小说,动画,漫画生成角色卡)来写卡上。目前主流的写卡都是用单一心理学/人格理论/职业测试理论来写卡,使用类似的ReAct可以为角色卡和世界观描述引入更丰富的关键词和理论框架,特别是那些涉及一堆角色的卡。
MEGA | Google Drive | Onedrive

发表评论