边缘世界 RimWorld

边缘世界 RimWorld

67 个评价
RimTalk Event+
   
奖励
收藏
已收藏
取消收藏
Mod, 1.6
文件大小
发表于
更新日期
115.607 KB
11 月 26 日 上午 1:54
12 月 1 日 上午 4:56
8 项改动说明 ( 查看 )

订阅以下载
RimTalk Event+

描述
让 RimTalk 在生成对话时,能够理解地图上正在发生的主要事件(例如袭击、难民、机械集群、太阳耀斑)。

做到了尽可能轻量化,在实际游戏中对TPS基本无影响。目前没有已知的不兼容问题。可以在存档中途随意添加或移除。

游戏中效果示例

1) 袭击
启用Event+前:
AI基本上只了解:
  • 当前地图上有危险(来自其自身的危险/威胁检查)。
  • 初始袭击信件文本,仅触发一次(开启信件过滤器的情况下)。
  • 少量上下文(最近几条消息、当前小人的状态等)。
过一段时间后/重新读档,原始的袭击信息就会刷掉,AI模型开始进行没有参照物的联想。

启用Event+后:
RimTalk在活跃袭击期间发起对话时,AI现在能知晓事件描述提供的信息,例如:
  • 袭击的派系。
  • 他们如何抵达(地图边缘袭击、中心空投等)。
  • 他们为何攻击(污染报复、任务相关等)。
对话可以基于实际情况,而不是偏离主题,陷入纯粹的想象。

2) 难民 / 访客任务
启用Event+前:
AI只知道地图上有标记为"借住者"的额外小人,但它并不真正理解:
  • 他们是临时的友好访客、寻求庇护的难民,还是皇权贵族等等(有时模型甚至会把他们误认为殖民者)。
  • 他们会停留多久。
  • 他们与特定的任务相关联,该任务有相关的期望和可能的后果。

启用Event+后:
AI能清楚地了解:
  • 他们的身份。
  • 他们将在殖民地停留的天数,以及已经过去了多少天。
  • 他们的名字和任务提供的背景故事。

模组工作原理

由于RimTalk的设计主要将对话焦点放在角色周围环境上,它无法可靠地"感知"地图上正在发生的事件。当一个事件触发时,它可能会触发仅一次相关对话(如果启用了信件过滤器)。此后,小人们基本上对大多数正在进行的事件一无所知。本模组旨在填补这一空白,告诉RimTalk地图上仍在发生的事件。

每当RimTalk 要求LLM生成对话时,此模组会:
  • 查找影响当前地图的进行中事件(如难民任务、太阳耀斑、机械集群)。
  • 从每个事件中获取信息:标题、接受任务的时间、相关小人名称以及事件描述。
  • 如果RimTalk判定殖民地处于危险中,则添加最近的威胁及其详细信息(袭击、围攻等)。
  • 构建一个简洁的"进行中事件"信息块,并将其附加到RimTalk的提示词中。

这样,模型就能看到类似以下的内容:

[Ongoing events] Pickles the Destitute [accepted ~1.3 days ago | characters: Pickles] A desperate refugee named Pickles is staying at your colony for 15 days… Poor Drifters [accepted ~0.4 days ago | characters: Casces, Felix, Petronas] 3 desperate refugees are staying for 9 days. They work and fight for free… [Event list end]

*debug信息中可能显示为英文,并不影响正常工作。

这为模型提供了更准确、更丰富的上下文来进行更符合情景的对话。

模组局限性

因为追求极致轻量化,因此确实存在一些限制,例如:
  • 目前模组不会捕捉杂项、持续时间短的事件,如枯萎病、货舱坠毁等。
    包含太多的、对叙事效果微乎其微的事件会使发送到模型请求变得相当臃肿,且浪费令牌。

    目前还在思考如何在不引入过多臃肿、不可靠功能的情况下包含(+压缩)尽可能更多的事件信息。

  • 某些事件描述(尤其是难民/访客任务)可能相当冗长,因此在存在这类事件时,模组可能会向请求发送明显较多的文本(参见令牌使用/性能说明)

    好处是对话能更准确和生动;坏处是可能会消耗更多令牌。💵

令牌使用 / 性能说明

由于此模组会向LLM发送额外文本,会略微增加令牌使用量。

预估:
  • 每个请求最多添加约1200个字符的事件文本;在中文语境下一般不会达到。
  • 极端情况(巨量事件同时发生)下可能消耗最多~1200额外令牌。
  • 在一般游戏过程中(1-2个相关进行中事件),发送的文本会短得多,通常消耗约100~300个令牌或更少

灵感来源 & 已确认兼容

最后无论如何还是要感谢Juicy开发了出色的RimTalk模组。
热门讨论 查看全部(2)
0
11 月 29 日 下午 6:50
置顶: Bug Reports / Suggestions
SaltGin
31 条留言
SaltGin  [作者] 8 小时以前 
For now, the text compression feature is beyond what I can reliably implement, so I’m putting it on hold and taking a break before continuing. The current version should be stable, but if you run into any issues or have any suggestions, please let me know.

目前文本压缩功能超出了我能稳定实现的范围,所以暂时决定搁置这一部分,先休息一段时间。当前版本应当是非常稳定的,如果遇到任何问题或有任何建议,随时在评论区/讨论区留言。
SaltGin  [作者] 13 小时以前 
這種情況確實很難辦...其實我這邊也一直在想要怎麼盡量避免這類狀況,目前說實話還沒有找到一個既穩定又通用的做法。不過之後只要有比較好的點子,我這邊還是會持續更新,盡量減少這種狀況。
benny30912 13 小时以前 
我懂了,謝謝大佬。所以其實是維持到威脅消失(但遊戲本身沒辦法判斷威脅來自特定事件),上限是至多0.6天。
我當時的情況是:發生了被激怒之後剛好又來了一個墜落事件(白信封)掉的是敵對派系,導致威脅狀態持續,這確實感覺沒辦法。
SaltGin  [作者] 13 小时以前 
另外補充一下:你看到的 0.6 天其實比較像是一個「保險機制」。並不是說事件相關的內容會在 RimTalk 裡被強調 0.6 天那麼久,而是「在有威脅存在的情況下,這個模組查詢資料時,只會去讀取過去 0.6 天內發生的威脅事件」。

換句話說,它的作用比較像是幫忙把太久以前的威脅自動切掉,理論上反而不太會出現你說的那種情況。
SaltGin  [作者] 14 小时以前 
這個MOD的邏輯是,一旦威脅(比如這裡的美洲獅被激怒)在遊戲裡被判定為解除,模組就會立刻停止往 LLM 填入相關的威脅資訊。

至於會出現「討論半天美洲獅」的情況,一方面是受 RimTalk 本身的上下文視窗影響。比如說,如果前 6 則對話裡都有提到美洲獅,那後面的對話很高機率也會一直帶到美洲獅相關的內容,就會需要在提示詞那邊自己多加一些限制,讓 LLM 盡量不要重複同一件事講太久。

另外也有可能是因為同時裝了其他記憶類的模組,比方說 Expand Memory。我自己覺得它的想法是好的,不過目前看起來整體實作還不算很穩定,有時候就比較容易出現這種「一直圍繞同一件事討論很久」的狀況。
SaltGin  [作者] 14 小时以前 
@benny30912 主要是因為 Rimworld 實際上並沒有一個可以判定「特定某個威脅」是否已經解除,或者現在這個威脅到底是跟哪一次最近的威脅事件綁在一起的機制;遊戲基本上只知道「現在是危險狀態」或「現在是安全的」

而且再加上很多威脅事件的持續時間差異很大,沒辦法很籠統地下結論說,比如「動物被激怒」就一定只會持續一小段時間。這一點是目前最棘手的地方。就算真的把威脅事件的持續時間全部暴露在XML,也還是得先做大量的審視和思考
benny30912 17 小时以前 
大佬,請問設計上為什麼將威脅事件的持續時間設成固定而不是持續到威脅解除(或解除後一小段時間)?
因為襲擊持續0.6天合理,但美洲獅被激怒一槌打死了,小人卻討論半天
或是可以基於不同事件設定持續時間/把威脅事件的持續時間暴露在xml中?
SaltGin  [作者] 12 月 1 日 上午 4:51 
Source is now available on github: https://github.com/SaltGin/RimTalkEventPlus/
SaltGin  [作者] 11 月 29 日 下午 1:06 
@OCEAN 修好了,现在所有隐藏的事件一律不会显示
SaltGin  [作者] 11 月 29 日 下午 12:46 
@OCEAN 我看一下 应该很好解决