Project 5: Large Language Models: Prompt Engineering

简介
在过去的吃豆人项目中, 我们设计了搜索算法让智能体找到出口, 利用强化学习让智能体逃避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 ***"
"""
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.py 和 log/ 文件夹下的一份日志文件。确保日志文件以你的学号结尾。请注意:由于大语言模型的输出不可复现,我们可能会参考日志文件进行评分。最终提交的压缩包需要命名为"学号_姓名.zip"。
学号_姓名.zip
│
├── llmAgents.py
└── YYYYMMDD-HHMMSS_学号.log
致谢
本次项目相关代码基于UC Berkeley CS188课程改写。所有使用及改写均遵循相关协议。感谢他们为社区做出的贡献。