重写定位:不是普通 Python 入门笔记,而是面向 AI 工程师 / AI 应用工程师 / AI 解决方案顾问的工程化复盘文档。
覆盖文件:/Users/hejunkai/Documents/AI工程师/28天每日背诵文档/Day01_Python基础.html
生成时间:2026-06-09 14:05
| 学习模块 | 视频 / 分 P / 章节 | 建议观看重点 |
|---|---|---|
| 变量 | 2025年B站Python全套教程:只看变量相关分P | 重点看变量如何承接用户问题、团队名、月份、模型回答等业务流程中的中间状态。 |
| 数据类型 | 2025年B站Python全套教程:只看数据类型相关分P | 重点看 str / int / float / bool / list / dict / None 如何表达业务数据、接口参数和AI处理结果。 |
| 函数 | 2025年B站Python全套教程:只看函数相关分P | 重点看如何把金额计算、筛选、汇总、写文件封装成可复用能力。 |
| 模块化 | 2025年B站Python全套教程:只看模块化相关分P | 重点看为什么真实项目不能把所有代码都堆在一个文件里。 |
| 文件读写 | 2025年B站Python全套教程:只看文件读写相关分P;补充 Python JSON 解析专题:JSON 上/中/下 | 重点看 json.load / json.dump、encoding='utf-8'、ensure_ascii=False、indent=2。 |
如果视频分P标题和当前描述不完全一致,请按关键词“变量 / 数据类型 / 函数 / 模块化 / 文件读写 / JSON解析”人工定位,不要全刷。
一句话理解:变量不是简单的“容器”,而是业务流程中的中间状态名称。AI工程里,用户问题、团队名、月份、接口返回、RAG检索结果、模型回答,都需要用变量承接。变量名要表达业务含义,比如 user_question、team_name、month,而不是 a、b、x。
AI 工程里为什么必须会:这几个变量对应企业AI问答流程:用户提问被保存为 user_question,系统从问题中识别出 team_name 和 month,后续查询业务数据,最后把模型生成的结果保存为 model_answer。
项目里怎么用:
user_question = "查询4月份星辰战队合同金额"
team_name = "星辰战队"
month = "2026-04"
model_answer = "4月份星辰战队合同金额为48万元"
面试时怎么说:面试时我会说:Python变量在AI应用里主要用来承接业务流程中的状态,比如用户输入、接口参数、检索结果和模型输出。虽然Python是动态类型语言,但工程项目里变量命名必须清晰,否则接口联调和Agent工具调用很容易混乱。
面试官追问怎么答:追问:Python变量是动态类型,会不会导致项目不稳定?回答:会有这个风险,所以工程里要靠清晰命名、Pydantic校验、类型注解、测试和日志来降低风险。
一句话理解:数据类型决定一份业务数据应该如何表达。str适合用户问题、Prompt、模型回答;int/float适合金额、数量、评分、相似度;bool适合是否命中规则、是否需要人工确认;list适合多条合同、多条检索结果;dict适合一条结构化业务记录;None表示接口无返回、字段缺失或查询为空。
AI 工程里为什么必须会:dict表示一条合同记录,list表示多条合同记录。API返回JSON后,Python里通常会转成dict/list;RAG检索结果通常是list,每个片段是dict;AI表格一行数据也可以理解为一个dict。
项目里怎么用:
record = {
"customer_name": "无锡某制造企业",
"team_name": "星辰战队",
"month": "2026-04",
"contract_amount": 480000,
"paid_amount": 320000,
"sales_name": "张三"
}
records = [record]
面试时怎么说:面试时我会说:企业AI项目里最常见的数据结构是list和dict,因为它们最接近JSON和AI表格。dict表达一条结构化记录,list表达多条记录,这也是后续FastAPI接口、Agent Tool参数和RAG检索结果处理的基础。
面试官追问怎么答:追问:为什么不用字符串拼接保存所有数据?回答:字符串不方便校验、筛选和计算。结构化数据才能被接口、工作流和Agent稳定处理。
一句话理解:函数是把一段可重复逻辑封装成一个独立能力。一个函数最好只做一件事,例如计算未收款、筛选合同、汇总金额、写入JSON。AI工程里,数据清洗、字段映射、接口调用、模型调用、RAG检索都应该封装成函数。
AI 工程里为什么必须会:这个函数的输入是合同金额和已收款金额,输出是未收款金额。它是一个最小业务能力,后续可以被FastAPI接口调用,也可以包装成Agent Tool,甚至成为悟空技能后端工作流中的一个计算节点。
项目里怎么用:
def calculate_unpaid_amount(contract_amount, paid_amount):
return contract_amount - paid_amount
面试时怎么说:面试时我会说:函数是AI工程里最小的可复用业务能力。Tool Calling、Agent工具、Skill后端,本质上都需要把业务逻辑封装成清晰的函数或接口,让模型或工作流在合适的时候调用。
面试官追问怎么答:追问:函数和Agent Tool有什么关系?回答:Agent Tool可以理解为带有名称、描述和参数Schema的函数。函数负责真正执行逻辑,模型只负责判断什么时候调用。
一句话理解:模块化是把项目拆成不同职责的文件和目录。初学者可以把代码写在一个文件里,但真实AI工程项目必须拆模块,否则接口、RAG、Agent、Prompt、数据处理混在一起,后续无法维护。
AI 工程里为什么必须会:main.py负责启动入口或FastAPI路由;services放业务逻辑;utils放通用工具;schemas放请求/响应模型;data放测试数据;prompts放提示词模板;outputs放运行结果。
项目里怎么用:
project/
├── main.py
├── services/
│ └── finance_service.py
├── utils/
│ └── file_utils.py
├── schemas/
│ └── request_schema.py
├── data/
│ └── contracts.json
├── prompts/
│ └── rag_prompt.txt
└── outputs/
└── day01_result.json
面试时怎么说:面试时我会说:模块化不是为了显得复杂,而是为了复用、维护、测试和多人协作。FastAPI项目、RAG项目、Agent项目都需要把接口层、业务层、工具层、数据层拆开。
面试官追问怎么答:追问:业务逻辑为什么不应该全写在FastAPI接口函数里?回答:接口函数应该负责接收请求和返回响应,核心业务逻辑应放到service里,方便复用、测试和后续被Agent Tool调用。
一句话理解:文件读写不是简单的open/read/write。AI工程里经常要读取JSON测试数据、Prompt模板、知识库文件、日志、配置文件,也要把模型结果、评测结果和接口结果写出来。企业项目早期常用本地JSON/CSV模拟数据,后续再替换成数据库或API。
AI 工程里为什么必须会:encoding="utf-8"用于正确处理中文;json.load用于把JSON文件读成Python对象;json.dump用于把Python对象写回JSON;ensure_ascii=False避免中文乱码;indent=2让输出更适合人阅读。
项目里怎么用:
import json
with open("data/contracts.json", "r", encoding="utf-8") as f:
contracts = json.load(f)
with open("outputs/day01_result.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
面试时怎么说:面试时我会说:文件读写是RAG、接口测试、数据清洗、Prompt管理的基础。比如RAG要读取知识库文件,接口联调要保存测试JSON,Agent运行要记录工具结果和日志。
面试官追问怎么答:追问:为什么测试阶段可以用文件模拟数据库?回答:因为早期重点是验证业务流程和AI调用链路,JSON文件成本低、可控、便于演示;等流程跑通后再替换成SQLite、MySQL或真实API。
一句话解释:变量给业务流程中的关键信息命名。
为什么重要:AI应用通常是多步骤链路:用户提问、意图识别、参数提取、接口查询、模型回答。如果没有清晰变量,流程会混乱。
在 AI 工程里的使用场景:FastAPI接口参数、Agent Tool入参、RAG检索结果、悟空技能节点输入输出。
面试表达:我会把变量理解成AI流程中的状态承接点,而不是简单容器。
一句话解释:dict表示一条结构化记录,list表示多条记录。
为什么重要:企业AI应用要处理的不是单个字符串,而是客户、合同、订单、库存、文档片段等结构化数据。
在 AI 工程里的使用场景:API返回JSON、AI表格一行数据、RAG检索片段、制造业订单列表。
面试表达:我会用dict/list把业务数据结构化,方便筛选、汇总、传给接口或模型。
一句话解释:函数把可重复逻辑封装成独立能力。
为什么重要:AI工程不是把所有逻辑写死在Prompt里,很多计算、查询、校验都应该由函数或接口完成。
在 AI 工程里的使用场景:金额计算、字段映射、接口调用、RAG检索、Tool Calling。
面试表达:我会先把业务能力写成函数,再根据需要包装成FastAPI接口、Agent Tool或悟空技能。
一句话解释:文件让测试数据、Prompt、结果和日志可以被保存和复用。
为什么重要:企业项目早期不一定马上接数据库,先用JSON/CSV模拟数据能快速验证AI流程。
在 AI 工程里的使用场景:RAG文档读取、Prompt模板管理、接口测试JSON、结果输出、日志记录。
面试表达:我会先用本地文件跑通业务闭环,再逐步替换成SQLite、MySQL或真实业务系统API。
业务背景:客户希望查询某个销售团队某个月的合同金额、已收款金额和未收款金额。今天用最基础的 Python 能力完成最小闭环。
建议代码文件:/Users/hejunkai/Documents/AI工程师/28天每日背诵文档/Day01_合同收款数据处理小项目/day01_contract_summary.py
输出结果文件:运行后生成 day01_result.json
import json
from pathlib import Path
# 1. 用变量保存用户问题、团队名称、月份
user_question = "查询4月份星辰战队合同金额、已收款金额和未收款金额"
team_name = "星辰战队"
month = "2026-04"
# 2. 用 list + dict 保存多条合同数据
contracts = [
{
"customer_name": "无锡某制造企业A",
"team_name": "星辰战队",
"month": "2026-04",
"contract_amount": 480000,
"paid_amount": 320000,
"sales_name": "张三"
},
{
"customer_name": "苏州某自动化公司",
"team_name": "星辰战队",
"month": "2026-04",
"contract_amount": 260000,
"paid_amount": 260000,
"sales_name": "李四"
},
{
"customer_name": "常州某电子厂",
"team_name": "星辰战队",
"month": "2026-05",
"contract_amount": 180000,
"paid_amount": 50000,
"sales_name": "王五"
},
{
"customer_name": "无锡某新能源企业",
"team_name": "先锋战队",
"month": "2026-04",
"contract_amount": 390000,
"paid_amount": 100000,
"sales_name": "赵六"
},
{
"customer_name": "江阴某装备制造厂",
"team_name": "星辰战队",
"month": "2026-04",
"contract_amount": 120000,
"paid_amount": 0,
"sales_name": "张三"
}
]
def calculate_unpaid_amount(contract_amount, paid_amount):
"""计算未收款金额:合同金额 - 已收款金额。"""
return contract_amount - paid_amount
def enrich_unpaid_amount(records):
"""为每条合同记录补充 unpaid_amount 字段。"""
enriched = []
for record in records:
new_record = record.copy()
new_record["unpaid_amount"] = calculate_unpaid_amount(
new_record["contract_amount"],
new_record["paid_amount"]
)
enriched.append(new_record)
return enriched
def filter_contracts(records, target_team_name, target_month):
"""筛选指定团队和月份的合同记录。"""
result = []
for record in records:
if record["team_name"] == target_team_name and record["month"] == target_month:
result.append(record)
return result
def summarize_contracts(records):
"""汇总合同金额、已收款金额、未收款金额。"""
total_contract_amount = 0
total_paid_amount = 0
total_unpaid_amount = 0
for record in records:
total_contract_amount += record["contract_amount"]
total_paid_amount += record["paid_amount"]
total_unpaid_amount += record["unpaid_amount"]
return {
"contract_count": len(records),
"total_contract_amount": total_contract_amount,
"total_paid_amount": total_paid_amount,
"total_unpaid_amount": total_unpaid_amount
}
def build_answer(question, target_team_name, target_month, matched_records, summary):
"""生成结构化结果,后续可交给大模型生成自然语言回答。"""
return {
"user_question": question,
"query_condition": {
"team_name": target_team_name,
"month": target_month
},
"matched_records": matched_records,
"summary": summary,
"model_answer_draft": (
f"{target_month} {target_team_name}共有{summary['contract_count']}条合同,"
f"合同总额{summary['total_contract_amount']}元,"
f"已收款{summary['total_paid_amount']}元,"
f"未收款{summary['total_unpaid_amount']}元。"
)
}
def write_json_file(data, output_path):
"""把结果写入 JSON 文件,方便接口、工作流或AI表格后续读取。"""
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
with open(output_path, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def main():
enriched_contracts = enrich_unpaid_amount(contracts)
matched_records = filter_contracts(enriched_contracts, team_name, month)
summary = summarize_contracts(matched_records)
result = build_answer(user_question, team_name, month, matched_records, summary)
write_json_file(result, "day01_result.json")
print(result["model_answer_draft"])
if __name__ == "__main__":
main()
| 操作任务 | 要求 | 验收方式 |
|---|---|---|
| 写变量保存用户问题、团队名、月份 | 使用 user_question、team_name、month 这类有业务含义的变量 | 能解释每个变量在企业AI问答流程里的作用 |
| 设计 list + dict 合同数据 | 至少5条合同记录,每条包含 customer_name、team_name、month、contract_amount、paid_amount、unpaid_amount、sales_name | 能说明dict是一条记录,list是多条记录 |
| 封装 calculate_unpaid_amount 函数 | 输入合同金额和已收款金额,返回未收款金额 | 能用多条数据测试计算正确 |
| 封装 filter_contracts 函数 | 按 team_name 和 month 筛选合同数据 | 能筛出星辰战队2026-04的3条记录 |
| 封装 summarize_contracts 函数 | 汇总合同总额、已收款总额、未收款总额 | 输出合同总额860000、已收款580000、未收款280000 |
| 写入 day01_result.json | 使用 json.dump,ensure_ascii=False,indent=2 | 文件中中文不乱码,结构清晰可读 |
| 说明升级路径 | 说明如何升级成FastAPI接口、Agent Tool、悟空技能或AI表格问答 | 能把Python基础自然连接到AI工程落地 |
变量不是简单容器,而是业务流程中的状态承接点。user_question保存原始问题,team_name和month保存从问题中抽取出来的查询条件,后续接口查询、AI表格筛选、Agent Tool调用都依赖这些变量。
用户问题适合str,合同金额适合int或float,是否需要人工确认适合bool,多条合同记录适合list,一条合同记录适合dict。None可以表示接口无返回、查询为空或字段缺失。
record = {
"customer_name": "无锡某制造企业",
"team_name": "星辰战队",
"month": "2026-04",
"contract_amount": 480000,
"paid_amount": 320000,
"unpaid_amount": 160000,
"sales_name": "张三"
}
records = [record]def calculate_unpaid_amount(contract_amount, paid_amount):
return contract_amount - paid_amount
print(calculate_unpaid_amount(480000, 320000)) # 160000project/ ├── main.py ├── services/finance_service.py ├── utils/file_utils.py ├── schemas/request_schema.py ├── data/contracts.json ├── prompts/rag_prompt.txt └── outputs/day01_result.json
import json
with open("data/contracts.json", "r", encoding="utf-8") as f:
contracts = json.load(f)
with open("outputs/day01_result.json", "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)标准结果:筛选出3条星辰战队2026-04记录,合同总额860000元,已收款580000元,未收款280000元,输出JSON文件中包含查询条件、匹配记录、summary和model_answer_draft。
Python基础支撑AI工程的数据处理、接口调用和工具封装。变量保存流程状态,dict/list承接JSON和AI表格数据,函数封装可复用业务能力,模块化保证项目可维护,文件读写用于测试数据、Prompt、知识库和结果输出。合同收款项目可以进一步升级成FastAPI接口、Agent Tool或悟空技能。
| 易忘点 | 正确理解 | 错误理解 |
|---|---|---|
| 变量命名 | 变量名要表达业务含义,如team_name、month | 用a、b、x、y导致后续流程看不懂 |
| dict/list | dict是一条记录,list是多条记录 | dict和list随便混用 |
| 金额类型 | 金额用于计算时应使用int/float | 金额写成“48万元”字符串再计算 |
| 函数职责 | 一个函数最好只做一件事 | 一个函数里又筛选又汇总又写文件又调模型 |
| 模块化 | 接口层、业务层、工具层要分开 | 所有代码都写在main.py |
| JSON写中文 | json.dump用ensure_ascii=False避免中文转义 | 看到中文变成\u开头也不管 |
| 测试数据 | 早期可用JSON模拟数据库 | 必须一开始就接真实ERP才算项目 |
| Agent Tool | Tool底层仍然要有函数或API执行 | 大模型自己会真的执行Python函数 |