<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>LLM on 无铃怎么系铃</title>
        <link>https://reimunai.github.io/tags/llm/</link>
        <description>Recent content in LLM on 无铃怎么系铃</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>无铃怎么系铃-reimunai</copyright>
        <lastBuildDate>Tue, 20 Jan 2026 19:24:51 +0800</lastBuildDate><atom:link href="https://reimunai.github.io/tags/llm/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>在Unity用LLM大模型&#43;FSM有限状态机构建智能敌人AI</title>
        <link>https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/</link>
        <pubDate>Tue, 20 Jan 2026 19:24:51 +0800</pubDate>
        
        <guid>https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/</guid>
        <description>&lt;h2 id=&#34;引入&#34;&gt;引入
&lt;/h2&gt;&lt;p&gt;从老师给出的题目中选出该课题后。首先便浮现以下几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;要在什么类型游戏下使用LLM实现敌人的AI？&lt;/li&gt;
&lt;li&gt;AI要全权接管敌人AI，还是介入部分，又要介入哪个部分呢？&lt;/li&gt;
&lt;li&gt;因为LLM返回结果需要一定时间，且结果有不确定性，要怎么解决？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在第一个问题上，我最终选择2d俯视角射击游戏。他对于我们而言足够简单，特别是在有AI辅助编写代码下，可以快速完成原型开发。而在关键的敌人身上也只有移动和射击两个基本操作，但是却可以设计出足够复杂的行为来体现LLM的作用。&lt;br&gt;
随后我采用有限状态机混合LLM的方式来驱动敌人的行动。现阶段LLM肯定不能时时刻刻调用来确定敌人的行动，应该像人体一样：感官收集信息，由大脑进行决策，又有小脑，脊髓和肌肉记忆负责简单动作和反射。设计感知模块，决策模块，执行模块，由LLM担任敌人AI的指挥官。&lt;br&gt;
最后通过提示词设计，让LLMAPI返回Json格式结果，限定了其输出，一定程度上保证了结果的准确性。同时在客户端验证结果，设计非法回复处理。&lt;/p&gt;
&lt;h2 id=&#34;开发环境搭建&#34;&gt;开发环境搭建
&lt;/h2&gt;&lt;p&gt;由于小组里共有三人可以负责程序的开发，我决定引入开源项目来解决敌人寻路问题。先是了解到unity的packages中有ai.navigation包集成了A*的实现，可以简化敌人寻路AI开发。又发现navigation对于2d游戏的实现不佳。通过网络搜索和询问AI最后引入了navmeshplus来支持2d寻路。&lt;br&gt;
所以最终初始环境为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;unity 2022.3.6f1c1&lt;/li&gt;
&lt;li&gt;package unity.ai.navigation&amp;quot;: &amp;ldquo;1.1.7&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;com.h8man.2d.navmeshplus&amp;rdquo;: &amp;ldquo;&lt;a class=&#34;link&#34; href=&#34;https://github.com/h8man/NavMeshPlus.git#master%22&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/h8man/NavMeshPlus.git#master&#34;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;项目架构设计&#34;&gt;项目架构设计
&lt;/h2&gt;&lt;h3 id=&#34;2d俯视角游戏基本设置&#34;&gt;2d俯视角游戏基本设置
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;PlayerController&lt;/strong&gt;&lt;br&gt;
基本玩家控制脚本，只有移动和射击两种操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SmoothFllowCamera&lt;/strong&gt;&lt;br&gt;
简单相机跟踪&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HealthInteractor&lt;/strong&gt;&lt;br&gt;
即可以处理玩家又可以处理敌人的血量变化和交互的脚本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bullet&lt;/strong&gt;&lt;br&gt;
子弹预制体的MonoBehaviour脚本&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;llm-api调用&#34;&gt;LLM API调用
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DeepSeekChatManager&lt;/strong&gt;
调用DeepSeep大模型API的模块。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;核心模块敌人ai&#34;&gt;核心模块，敌人AI
&lt;/h3&gt;&lt;p&gt;参考人类思考和行动的方式，进行了分层设计，大致为感知，决策，执行层。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;中间桥梁感知层&lt;strong&gt;EnvPerceiver&lt;/strong&gt;&lt;br&gt;
通过该脚本检测环境信息，包装为自然语言传递给下流决策层进行决策，和给执行层锁定追踪对象，寻找掩体。
&lt;img src=&#34;https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image-1.png&#34;
	width=&#34;623&#34;
	height=&#34;315&#34;
	srcset=&#34;https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image-1_hu_37da71e15471d7fe.png 480w, https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image-1_hu_bdf8939da5f0502d.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;197&#34;
		data-flex-basis=&#34;474px&#34;
	
&gt;&lt;/li&gt;
&lt;li&gt;顶层决策层&lt;strong&gt;LLMPlanner&lt;/strong&gt;&lt;br&gt;
接收感知层信息，调用LLMAPI调用模块，传达命令给执行层。&lt;br&gt;
&lt;img src=&#34;https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image.png&#34;
	width=&#34;620&#34;
	height=&#34;191&#34;
	srcset=&#34;https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image_hu_e6615a89558d6ed8.png 480w, https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image_hu_b7004912b7c0b75a.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;324&#34;
		data-flex-basis=&#34;779px&#34;
	
&gt;&lt;/li&gt;
&lt;li&gt;底层执行层，共两层
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;StrategyExecuter&lt;/strong&gt;&lt;br&gt;
&lt;img src=&#34;https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image-2.png&#34;
	width=&#34;637&#34;
	height=&#34;484&#34;
	srcset=&#34;https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image-2_hu_6a0b146a038357f6.png 480w, https://reimunai.github.io/p/%E5%9C%A8unity%E7%94%A8llm%E5%A4%A7%E6%A8%A1%E5%9E%8B-fsm%E6%9C%89%E9%99%90%E7%8A%B6%E6%80%81%E6%9C%BA%E6%9E%84%E5%BB%BA%E6%99%BA%E8%83%BD%E6%95%8C%E4%BA%BAai/image-2_hu_c9e8411aa069c4e3.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;alt text&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;131&#34;
		data-flex-basis=&#34;315px&#34;
	
&gt;&lt;br&gt;
接收命令，发出状态切换的指令。&lt;/li&gt;
&lt;li&gt;低级执行层，预编写的各种状态
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;IdleState&lt;/strong&gt;待机状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RetreatState&lt;/strong&gt;撤退状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChaseState&lt;/strong&gt;追击状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WanderState&lt;/strong&gt;游荡状态&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;最终结果&#34;&gt;最终结果
&lt;/h2&gt;&lt;h2 id=&#34;实际开发中的难点&#34;&gt;实际开发中的难点
&lt;/h2&gt;&lt;p&gt;根据自己开发的部分和小组成员的反馈。在AI辅助开发情况下，难度不高。主要是未考虑其他条件和提供给AI的实际项目上下文不足导致的bug。如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API调用没有使用异步或者协程导致阻塞主线程。&lt;/li&gt;
&lt;li&gt;空引用不存在的模块。&lt;/li&gt;
&lt;li&gt;API调用超时，非法输出处理。通过引入状态延续，默认状态机制解决。&lt;br&gt;
实际最困难的部分，反而是状态机部分。撤退状态开始时涉及了掩体躲避和反击，但是用AI编写的代码不和预期，最终因为时间关系，只能改为单纯尝试远离玩家的设计。
还有一些参数的设置问题，为了控制API调用频率，降低成本。我们引入了API调用频率控制的参数。太慢显得敌人呆呆，太快消耗token。最后引入根据环境是否高压，动态控制思考调用频率，即减少token消耗，又保留敌人的高智能。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结
&lt;/h2&gt;&lt;p&gt;这次架构设计让我深刻理解了“确定性系统”与“非确定性 AI”的结合之道。通过将 LLM 限制在“策略层”，我们既获得了智能的战术决策，又保留了传统代码的稳定性。&lt;br&gt;
但是还有一些未来可以改进优化的地方。&lt;br&gt;
最开始是准备引入unityPackage的ML-Agent包，在底层执行使用强化学习让敌人行为更智能。考虑到DDL要到了，需要的python方面AI编码和训练时间，最终没有加入。&lt;br&gt;
目前只有一个敌人，而且代码只考虑孤军作战的情况。放多几个敌人是没有相应的合作行为。未来或许可以加入指挥官系统，考虑多ai合作。&lt;br&gt;
考虑给LLM更多的权限，比如更多状态，放开状态参数调整权限，让有限状态产生更多变化。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
