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可达鸭"每天分享大模型相关知识。最后,感谢大家的阅读,祝大家工作生活愉快!

相关文章

Python新手的福音,涵盖20+种初学者必练项目!这本实战书太火了

对学Python的新手同学来说,最最最想要的干货是什么?是大量可以练手的项目啊。俗话说,三天不练手生,三天不念口生。#技术派的书架#在知乎上有一个关于"Python的练手项目”的问题,有6W人关注,...

247个Python实战案例:从入门到进阶(含源码)

Python是目前最热门的编程语言之一。由于其可读性和对初学者的友好性,已被广泛使用。那么要想学会并掌握Python,可以实战的练习项目是必不可少的。这247个实战案例让你告别枯燥,60秒学会一个小例...

从零开始学习 Python!6《项目实战》教你玩转 Python 项目

大家好啊!今天我们要聊一个超级有趣的话题——Python学习的实战项目!作为一个编程小白,你可能会觉得学完基础语法之后,完全不知道该怎么实战。别担心,老铁!这这篇文章就是为你量身定制的!为什么要做 P...

Python 30 天实战:数据分析实战全流程

在前面的学习中,我们已经分别掌握了 NumPy、Pandas 和 Matplotlib 这三个强大库的基础及部分进阶知识,今天我们将迎来一个综合性的实战练习,通过对真实世界数据集的处理、分析与可视化,...

Python+微信小程序开发实战(超清完结)

获课:97java.xyz/5101/标题:Python+微信小程序开发实战:从入门到精通引言随着移动互联网的快速发展,微信小程序因其便捷性和广泛的用户基础,成为开发者们关注的焦点。Python作为一...

实战:用python写个小游戏!(详细解释,建议收藏)

前言:今天为大家带来的内容是实战:用python写个小游戏!(详细解释,建议收藏)本文具有不错的参考意义及学习意义,希望大家会喜欢!要是觉得不错记得点赞,转发关注,不迷路哦!引言自从python语言大...