Prompt 工程实践:让 LLM 更听话的技巧

Prompt 工程这个词听起来很高大上,但它本质上就是"怎么跟模型说话才能让它给出你想要的结果"。这篇文章分享一些实际项目里积累的经验。 明确角色和背景 给模型一个清晰的角色定位: # 模糊 "帮我写一段代码" # 清晰 "你是一个 Python 高级工程师,专注于性能优化。 帮我优化以下函数,要求: 1. 保持功能不变 2. 减少不必要的循环 3. 添加类型注解 4. 代码风格遵循 PEP 8" 角色描述告诉模型应该以什么视角和知识储备来回答。 Few-shot:给例子比给说明更有效 告诉模型你想要什么格式,最好的方式是给例子: 将以下文本分类为:正面/负面/中性 示例: - "这个产品质量很好" → 正面 - "一般般,没什么特别" → 中性 - "完全是浪费钱" → 负面 现在分类以下文本: - "还行,比预期好一点点" Few-shot 比描述规则更直观,模型更容易理解你的意图。 Chain of Thought:让模型"想一想再说" 对于需要推理的任务,让模型展示推理过程: # 直接问(效果差) "一个工厂每天生产 500 个零件,工人效率提升 20% 后, 需要多少天生产 18000 个零件?" # 加上 "一步一步思考"(效果好) "一个工厂每天生产 500 个零件,工人效率提升 20% 后, 需要多少天生产 18000 个零件?请一步一步计算。" “Let’s think step by step” 或"一步一步思考"这类指令能显著提升推理准确率,这是有论文支撑的结论。 ...

2023-12-05 · 1 min · Kada Liao

Python 虚拟环境管理:从 venv 到 uv

Python 的包管理历史是一部混乱史。这篇文章梳理一下各种工具的演变,以及我现在的实践选择。 为什么需要虚拟环境 不同项目依赖不同版本的库。不用虚拟环境,所有包都装在系统 Python 里,版本冲突是迟早的事: 项目 A:需要 Django 3.2 项目 B:需要 Django 4.2 → 只能装一个,两个项目不能同时开发 虚拟环境为每个项目创建独立的 Python 环境,依赖互不干扰。 各种工具的演变 venv(Python 3.3+ 内置) python -m venv .venv source .venv/bin/activate # macOS/Linux .venv\Scripts\activate # Windows pip install requests pip freeze > requirements.txt 最基础,不需要额外安装,但功能简单,requirements.txt 不区分开发依赖和生产依赖。 virtualenv + pip-tools pip install pip-tools # requirements.in(只写直接依赖) requests>=2.28 flask>=2.0 # 生成锁定版本的 requirements.txt pip-compile requirements.in # 安装 pip-sync requirements.txt pip-compile 解决了依赖锁定的问题,是很长一段时间内的最佳实践。 Poetry poetry new my-project poetry add requests poetry add pytest --group dev poetry install # pyproject.toml 管理所有配置 Poetry 把依赖管理、打包、发布整合在一起,pyproject.toml 是单一配置文件。问题是速度慢,解析依赖时间长。 ...

2021-10-05 · 1 min · Kada Liao

Python 类型注解实战:让代码更可维护

Python 是动态语言,但这不意味着不需要类型。类型注解让 IDE 提示更准确、代码意图更清晰、重构更安全。 基础语法 # 变量注解 name: str = "Kada" age: int = 30 scores: list[float] = [9.5, 8.8, 9.2] # Python 3.9+ # 函数注解 def greet(name: str, times: int = 1) -> str: return f"Hello, {name}! " * times # 返回 None def log(message: str) -> None: print(message) 常用类型 from typing import Optional, Union, List, Dict, Tuple, Any # Optional:可以是 None def find_user(user_id: int) -> Optional[str]: ... # Union:多种类型之一(Python 3.10 可以用 X | Y) def process(data: Union[str, bytes]) -> str: ... # Python 3.10+ def process(data: str | bytes) -> str: ... # 字典和列表(Python 3.9+ 可以直接用小写) def get_config() -> dict[str, Any]: ... # Tuple:固定长度和类型 def get_coordinates() -> tuple[float, float]: ... TypedDict:给字典加类型 JSON 数据经常用字典传递,TypedDict 让字典有类型检查: from typing import TypedDict class UserInfo(TypedDict): id: int name: str email: str age: int | None # 可选字段 def create_user(info: UserInfo) -> None: print(info["name"]) # IDE 有提示,且知道是 str 类型 dataclass:更结构化的数据类 比 TypedDict 更进一步,dataclass 是带类型的数据容器: ...

2021-04-08 · 2 min · Kada Liao