Python+Deepseek实战:零基础也能批量生成项目,轻松获高薪offer
文/IT可达鸭
图/IT可达鸭、网络
一、前言
你是不是也曾陷入这样的困境:简历空白、项目经验为零,面对心仪的高薪职位却无从下手?面试官问起“做过什么项目”时,只能支支吾吾地转移话题。别担心,你并不孤单!事实上,很多技术大牛的第一步,也并非一帆风顺。
但今天,我要告诉你一个秘密:没有项目经验,并不意味着你无法逆袭! 在这个AI驱动的时代,工具的力量超乎你的想象。通过Python编程语言与Deepseek的强大能力结合,我们可以轻松自动生成高质量的项目,快速填补简历上的空白。更重要的是,这些项目不仅能帮你通过简历筛选,还能让你在面试中侃侃而谈,展现出真正的技术潜力!
无论你是刚入门的小白,还是想转型的技术爱好者,这篇文章都会手把手教你如何用最简单的方式打造属于自己的“硬核项目”。读完之后,你会发现,高薪Offer其实离你并不遥远——只需要一点创意、一些代码,再加上一点点行动力!
准备好了吗?让我们一起开启这段改变职业生涯的旅程吧!
二、环境准备
1. 创建虚拟环境(使用Anaconda)
conda create --name ds_py310 python=3.10.12
activate ds_py310
2. 安装相关包
pip install langchain==0.3.13 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install langchain-community==0.3.13 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install openai==1.58.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install dashscope==1.20.14 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install ollama==0.4.7 -i https://pypi.tuna.tsinghua.edu.cn/simple
3. 安装ollama,下载模型
ollama run deepseek-r1:8b
ollama run bge-m3:latest
三、Python+本地deepseek自动生成项目源码
实测效果:
源码:
1. 导入相关包
import json
import time
import re
import functools
from datetime import datetime
from typing import Dict, List, Optional
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.language_models import BaseLLM
from langchain.llms import Ollama
from tqdm import tqdm
2. 定制prompt
给它一个主题,生成n种项目类型,每种项目类型生成n个项目,这里为了测试方便,把n设置为2.
# topic相关的项目大纲prompt
prompt_proj_catalog = """
你是一个高级开发者,正在帮初学者整理"{topic}"相关的开发项目,请生成项目大纲,要求:
1. 包含2个项目类型
2. 每个项目类型包含2个项目
3. 使用JSON格式返回,包含topic字段和projs数组
4. projs数组中每个元素包含proj_type_name和proj_type_list数组
5. proj_type_list数组中包含proj_name、function、point
示例格式:
{{
topic: "项目主题"
proj_type_list:[
{{
"proj_type_name": "项目类型",
"proj_list": [
{{
"proj_name": "项目名称",
"function": "实现的功能",
"point": "涉及技术点"
}}
]
}}
]
}}
"""
# 单个项目prompt
# todo: 后续可以拓展其他编程语言
prompt_proj_detail = """
你是一个高级开发者,正在帮初学者整理开发项目,请给出'{topic}'的相关材料。
要求:
1. 包含完整的python代码
2. 有相应的解释说明
4. 使用Markdown格式
当前项目:{proj_name}
项目类型:{proj_type_name}
实现的功能:{function}
涉及技术点:{point}
"""
3. 项目生成器
# 项目生成器
class ProjectGenerator:
def __init__(self, llm: BaseLLM):
self.llm = llm
self.json_parser = JsonOutputParser()
self.timings = {} # 存储各阶段耗时数据
self.section_timings = []
self.current_title = ""
self.contents = []
def timing_decorator(func):
"""耗时统计装饰器"""
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
start_time = time.time()
result = func(self, *args, **kwargs)
elapsed = time.time() - start_time
self.timings[func.__name__] = elapsed
return result
return wrapper
def replace_think(self, content):
"""过滤掉思维链"""
return re.sub(r".*? ", "", content, flags=re.DOTALL)
@timing_decorator
def generate_outline(self, topic: str) -> Dict:
# 步骤1:生成项目大纲
outline_prompt = PromptTemplate.from_template(prompt_proj_catalog)
chain = outline_prompt | self.llm | self.replace_think | self.json_parser
max_retries = 3
for _ in range(max_retries):
try:
result = chain.invoke({"topic": topic})
# 验证必要字段
assert "topic" in result
assert "proj_type_list" in result and len(result["proj_type_list"]) > 0
assert "proj_type_name" in result["proj_type_list"][0]
assert "proj_list" in result["proj_type_list"][0] and len(result["proj_type_list"][0]["proj_list"]) > 0
assert "proj_name" in result["proj_type_list"][0]["proj_list"][0]
assert "function" in result["proj_type_list"][0]["proj_list"][0]
assert "point" in result["proj_type_list"][0]["proj_list"][0]
return result
except (json.JSONDecodeError, AssertionError) as e:
print(result)
print(f"项目大纲生成错误,重试中... ({_+1}/{max_retries})")
continue
raise ValueError("项目生成失败,请检查模型输出")
def generate_content(self, outline: Dict) -> List[Dict]:
# 步骤2:逐个项目生成代码
self.current_topic = outline["topic"]
all_contents = []
total_projects = self._count_total_projects(outline)
print("总项目数:" + str(total_projects))
with tqdm(total=total_projects, desc="生成内容", unit="project") as self.progress_bar:
proj_type_counters = {0: 0} # 项目类型计数器初始化
for proj_list in outline["proj_type_list"]:
all_contents += self._process_project_list(proj_list, level=0, counters=proj_type_counters.copy())
proj_type_counters[0] += 1 # 项目类型计数器递增
return all_contents
def generate_markdown(self, contents: List[Dict]) -> str:
# 步骤3:生成markdown文件
# 标题
md = [f"# {self.current_title}\n\n"]
type_num = 1
for item in contents:
if item["type"] == "proj_type":
# 项目类型使用 level+1 的#数量
heading_level = item['level'] + 1
md.append(f"{'#' * heading_level} {type_num} {item['proj_type_name']}\n")
proj_idx = 1
for proj in item["projs"]:
# 项目标题使用 level+2 的#数量
proj_level = item['level'] + 2
md.append(f"{'#' * proj_level} {type_num}.{proj_idx} {proj['proj_name']}\n")
md.append(f"{'#' * proj_level} {proj['function']}\n")
md.append(f"{'#' * proj_level} {proj['point']}\n")
md.append(proj["content"] + "\n\n")
proj_idx += 1
type_num += 1
return "\n".join(md)
def _count_total_projects(self, outline: Dict) -> int:
"""计算总项目数"""
count = 0
for proj in outline["proj_type_list"]:
count += len(proj.get("proj_list", []))
return count
def _process_project_list(self, proj_list: Dict, level: int = 0,
counters: dict = None) -> List[Dict]:
if counters is None:
counters = {0: 0}
# 更新当前层级计数器
current_level = level
counters[current_level] = counters.get(current_level, 0) + 1
# 项目类型名称
proj_type_name = proj_list['proj_type_name']
# 处理同一个项目类型的每个项目
projs = []
for proj in proj_list["proj_list"]:
projs.append({
"proj_name": proj.get("proj_name"),
"function": proj.get("function"),
"point": proj.get("point"),
"content": self._generate_proj_content(proj.get("proj_name"), proj.get("proj_type_name"), proj.get("function"),
proj.get("point"), level)
})
self.progress_bar.update(1)
return [{
"type": "proj_type",
"proj_type_name": proj_type_name,
"level": level,
"projs": projs
}]
def _generate_proj_content(self, proj_name: str, proj_type_name: str, function: str, point: str, level: int) -> str:
# 生成单个项目内容,并统计时长
start_time = time.time()
prompt = PromptTemplate.from_template(prompt_proj_detail)
try:
# 过滤掉思维链
chain = prompt | self.llm | self.replace_think
content = chain.invoke({
"topic": self.current_topic,
"proj_name": proj_name,
"proj_type_name": proj_type_name,
"function": function,
"point": point,
"level": level
})
# 记录生成时间
elapsed = time.time() - start_time
self.section_timings.append(elapsed)
self.progress_bar.set_postfix({
"last_proj_time": f"{elapsed:.1f}s",
"avg_time": f"{sum(self.section_timings)/len(self.section_timings):.1f}s"
})
return content
except Exception as e:
print(f"生成失败:{str(e)}")
return ""
def print_statistics(self):
"""打印统计信息"""
print("\n生成统计:")
print(f"大纲生成耗时:{self.timings.get('generate_outline', 0):.1f}s")
print(f"内容生成总耗时:{sum(self.section_timings):.1f}s")
print(f"平均每个项目耗时:{sum(self.section_timings)/len(self.section_timings):.1f}s")
print(f"最长项目生成耗时:{max(self.section_timings):.1f}s")
print(f"总生成字数:{sum(len(c['content']) for item in self.contents for c in item['projs'])}")
4. 串起整个流程
# 整体流程
def project_generator(model="deepseek-r1:8b", topic="益智游戏"):
# 初始化本地模型
llm = Ollama(model=model)
generator = ProjectGenerator(llm)
current_time = datetime.now().strftime("%Y%m%d%H%M%S")
file_name = "《" + topic + "---相关项目》_" + current_time + ".md"
try:
# 总计时
total_start = time.time()
# 生成大纲
outline = generator.generate_outline(topic)
print("++++++++++++++++++++++++++")
print("大纲内容:")
print(outline)
print("++++++++++++++++++++++++++")
# 生成内容
start_content = time.time()
contents = generator.generate_content(outline)
generator.contents = contents # 保存内容用于统计
# 生成Markdown
start_md = time.time()
md = generator.generate_markdown(contents)
# 总耗时
total_time = time.time() - total_start
# 保存文件
current_time = datetime.now().strftime("%Y%m%d%H%M%S")
with open(file_name, "w", encoding="utf-8") as f:
f.write(md)
# 打印统计
generator.print_statistics()
print(f"\n总耗时:{total_time:.1f}秒")
print(f"Markdown生成耗时:{time.time()-start_md:.1f}s")
print("生成完成!输出文件:" + file_name)
except Exception as e:
print(f"生成失败:{str(e)}")
5.调用函数
测试:使用deepseek生成多个项目,主题是“益智游戏”
project_generator(model="deepseek-r1:8b", topic="益智游戏")
效果:
四、结语
技术的世界从来不怕“小白”,只怕停下学习的脚步。今天的你已经迈出了关键一步,未来还有更多有趣的技术等待你去解锁。如果你觉得这篇文章对你有帮助,不妨点个赞、收藏或分享给更多志同道合的朋友,让更多人一起加入AI开发的行列!
如果有疑问在后台私信我,有问必答。持续关注"IT可达鸭",每天分享大模型相关知识。最后,感谢大家的阅读,祝大家工作生活愉快!