Project 5: Large Language Models: Prompt Engineering

Due: 2025.12.14.

Pacman in a maze


简介

在过去的吃豆人项目中, 我们设计了搜索算法让智能体找到出口, 利用强化学习让智能体逃避Ghost并完成目标。时至今日,大语言模型已经融入了我们的生活。

在这一节中, 我们将尝试调用 阿里云百炼 平台上的 通义千问系列 模型, 让它作为吃豆人的“大脑”来帮我们完成每一个动作的决策。

注意:本项目的目的不是编写复杂的算法, 而是学习如何通过提示词提升模型的能力。你将通过设计提示 (Prompt), 引导LLM成为一个出色的吃豆人玩家。这就是提示词工程 (Prompt Engineering)。

本次作业所需的文件为:Lab5.zip

你需要编辑的文件

文件作用
llmAgents.py大语言模型智能体的主要代码。你需要在此处编写Prompt。

环境准备

为了运行阿里云 Qwen 模型,你需要配置Python环境并安装相关依赖库。

conda create -name pacman python=3.11
pip install numpy pygame openai pycryptodome
conda activate pacman

环境变量配置

为了防止 API Key 泄露,我们通过环境变量来安全地读取Key,而不是将其直接写在代码里。

1. 获取 API Key

请前往 阿里云百炼控制台 注册并获取 API Key。对注册六个月以内的用户,该平台为大多数模型提供免费额度(详见 模型列表),因此理论上你无需充值。

为了平衡响应速度和推理能力,本次作业代码默认配置使用 qwen-turbo 模型。你也可以在代码中自行修改为其他模型进行尝试。

2. 设置环境变量

在你的终端中执行以下命令。请将 sk-xxx 替换为你的真实 Key,YOUR_ID 替换为你的学号。学号仅用于日志文件命名。

Windows (PowerShell)

$env:DASHSCOPE_API_KEY="sk-123456..."
$env:STUDENT_ID="221220000"

Windows (CMD)

set DASHSCOPE_API_KEY=sk-123456...
set STUDENT_ID=221220000

macOS / Linux

export DASHSCOPE_API_KEY=sk-123456...
export STUDENT_ID=221220000

注意: 每次关闭终端后环境变量会失效。下次重新打开终端运行代码前,需要再次执行上述命令。

任务

本次作业的核心任务是完成 llmAgents.py 中的 createPrompt 函数。

请注意,为了保证程序能够正确提取动作并执行,代码末尾拼接了控制模型输出格式的 format_prompt请不要修改该部分

在编写 Prompt 时,你可以部分或全部使用以下与当前游戏状态相关的变量,我们已通过get_game_data 函数提取为列表:

  • layout_list: 地图布局列表,例如 ["(0,0)=Wall", "(1,0)=Pacman"...]
  • pacman_pos: 吃豆人当前坐标 [x, y]
  • ghost_pos: 所有鬼魂的坐标列表 [[x, y], ...]
  • score: 当前得分
  • food_count: 剩余豆子数量
  • legal_actions: 当前合法的移动方向 ['North', 'South', ...]
    def createPrompt(self,state):
        """        
        --- DETAILS OF game_data---
        
        1. layout_list: (List of Strings) ["(0,0)=Wall", "(1,0)=Pacman"...]
        2. pacman_pos: (List of Integers) [x, y]
        3. ghost_pos: (List of Lists) [[x, y], [x, y]]
        4. score: (Integer)
        5. food_count: (Integer)
        6. legal_actions: (List of Strings) ['North', 'South', ...]

        --- SUGGESTED BASIC PROMPT STRUCTURE ---
        
        1. Role & Goal: "You are Pacman. Eat food and avoid ghosts."
        2. State Analysis: "Analyze the game state provided above."
        
        --DO NOT MODIFY THE format_prompt--
        """
        game_data = self.get_game_data(state)
        
        prompt = f"""
        "*** YOUR PROMPT HERE ***" 
        
        """
     
                        
当你完成后,运行下面的指令来测试你的prompt效果,你应该看到控制台打印出蓝色的发送内容和红色的模型回复。程序会在 log/ 目录下自动生成以你的学号结尾的日志文件。最终, 你应当能观察到吃豆人最终赢得了胜利。
python pacman.py -l smallGrid -p LLMPacmanAgent -g DirectionalGhost -k 1

Tips:

如果你多次尝试依然失败,可能需要自行查阅并尝试以下 Prompt Engineering 相关的技术:

  • CoT (Chain of Thought): 要求模型在给出动作前,先输出它的思考过程
  • ToT (Tree of Thoughts): 让模型模拟不同方向的后果,进行自我评估后再做决定。
  • Role Playing: 明确设定模型的身份设定。

代码提交与评分

请你打包提交 llmAgents.pylog/ 文件夹下的一份日志文件。确保日志文件以你的学号结尾。请注意:由于大语言模型的输出不可复现,我们可能会参考日志文件进行评分。最终提交的压缩包需要命名为"学号_姓名.zip"。

                    学号_姓名.zip
                    │
                    ├── llmAgents.py
                    └── YYYYMMDD-HHMMSS_学号.log
                    

致谢

本次项目相关代码基于UC Berkeley CS188课程改写。所有使用及改写均遵循相关协议。感谢他们为社区做出的贡献。