转载请标明出处:
https://dujinyang.blog.csdn.net/
本文出自:【奥特曼超人的博客】


杜锦阳dujinyangAIChatgpt编程

编程

在编程这条路上,孤独是常态。无数次我们陷入复杂逻辑、报错信息、重复劳动的黑洞,只希望身边有个伙伴,能懂代码、能查 Bug、能生成注释、还能时不时给出一点灵感。

今天,丹爷要带你亲手用 Python 打造一个:“属于你自己的 AI 编程助理”

不同于ChatGPT、Copilot的联网方式,我们打造的是一个私有化、本地化、了解你项目的AI助手,它:

  • 会自动读取你的项目结构;
  • 能理解每个函数、类、变量的作用;
  • 可以回答“你自己的项目”的问题;
  • 能静态分析、自动写注释、甚至尝试修复简单 Bug。

是的,它不万能,但它属于你。


🧠 启发:你是否有过这些经历?

  • 项目写大了,函数越来越多,看自己代码都快不认识;
  • 被项目负责人喊去重构上百个函数,懵了;
  • 某模块报错,debug 查了 2 小时,最后是个命名写错;
  • GPT 问它时,却因为没有上下文,答非所问?或者花费每月20美金去CHATGPT4

如果你也经历过,那么恭喜你,你比任何人都更需要一个 “Du 编程助手”。


🔧 系统构建概览

我们将构建这样一套架构:

DuAI
├── DuProjectScanner:扫描项目结构
├── DuCodeIndexer:向量索引,支持语义问答
├── DuCommentGenerator:函数自动注释生成
├── DuBugAnalyzer:静态分析、命名规范检查
├── DuChatInterface:交互入口(终端/GUI)

整套工具你可以以命令行、Gradio网页,甚至 VSCode 插件方式集成进日常开发。


📁 DuProjectScanner:项目结构提取

我们首先使用 ast 提取整个 Python 项目的函数与类定义。

import os
import ast

class DuProjectScanner:
    def __init__(self, project_root):
        self.project_root = project_root

    def DuScanPythonFiles(self):
        py_files = []
        for root, _, files in os.walk(self.project_root):
            for file in files:
                if file.endswith(".py"):
                    py_files.append(os.path.join(root, file))
        return py_files

    def DuExtractDefinitions(self, file_path):
        with open(file_path, "r", encoding='utf-8') as f:
            tree = ast.parse(f.read())

        functions = []
        classes = []
        for node in ast.walk(tree):
            if isinstance(node, ast.FunctionDef):
                functions.append(node.name)
            elif isinstance(node, ast.ClassDef):
                classes.append(node.name)
        return {"file": file_path, "functions": functions, "classes": classes}

调用示例:

scanner = DuProjectScanner("./my_project")
for f in scanner.DuScanPythonFiles():
    print(scanner.DuExtractDefinitions(f))

📚 DuCodeIndexer:项目上下文嵌入与语义问答

我们基于 LangChain + FAISS + 本地模型实现对代码片段的语义搜索和问答。

from langchain.vectorstores import FAISS
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.docstore.document import Document

class DuCodeIndexer:
    def __init__(self, documents):
        self.documents = documents
        self.db = None

    def DuBuildIndex(self):
        embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2")
        self.db = FAISS.from_documents(self.documents, embeddings)

    def DuAskQuestion(self, question, llm):
        from langchain.chains import RetrievalQA
        qa = RetrievalQA.from_chain_type(llm=llm, retriever=self.db.as_retriever())
        return qa.run(question)

    @staticmethod
    def DuLoadDocuments(code_snippets):
        return [Document(page_content=content, metadata={"source": path}) for path, content in code_snippets]

🧾 DuCommentGenerator:注释生成器

我们使用 transformers + 微调的 CodeT5CodeLlama 进行函数注释生成。

from transformers import pipeline

class DuCommentGenerator:
    def __init__(self, model="Salesforce/codet5-base"):
        self.generator = pipeline("text2text-generation", model=model)

    def DuGenerateDocstring(self, code: str) -> str:
        prompt = f"Generate Python docstring for the following function:\n{code}"
        result = self.generator(prompt, max_length=256, do_sample=False)[0]["generated_text"]
        return result.strip()

示例:

generator = DuCommentGenerator()
func_code = """
def DuIsValidEmail(email):
    return re.match(r"[^@]+@[^@]+\\.[^@]+", email)
"""
print(generator.DuGenerateDocstring(func_code))

输出:

"""
检查 email 是否是合法邮箱地址格式。
返回 True 或 False。
"""

🐛 DuBugAnalyzer:静态分析 + 规范提醒

简单静态规则检查可用 ast + re 实现,复杂可集成 pylintmypy

import ast

class DuBugAnalyzer:
    def __init__(self, code: str):
        self.tree = ast.parse(code)

    def DuCheckPrintStatements(self):
        return [node.lineno for node in ast.walk(self.tree) if isinstance(node, ast.Call) and getattr(node.func, 'id', '') == 'print']

    def DuCheckShortVariableNames(self, min_length=2):
        short_vars = []
        for node in ast.walk(self.tree):
            if isinstance(node, ast.Name) and len(node.id) < min_length:
                short_vars.append((node.id, node.lineno))
        return short_vars

💬 DuChatInterface:命令行助手原型

class DuChatInterface:
    def __init__(self, indexer, comment_generator):
        self.indexer = indexer
        self.comment_generator = comment_generator

    def DuRunCLI(self):
        print("欢迎来到 Du 编程助理终端!输入 `q` 退出。")
        while True:
            question = input("你想问什么?> ")
            if question.lower() == "q":
                break
            answer = self.indexer.DuAskQuestion(question, llm="gpt-4")  # 也可以换成本地llm
            print("🤖:", answer)

🧠 小总结:为什么值得自己打造?

  • 本地运行、安全私有
  • 理解项目上下文
  • 可以定制,理解你命名风格
  • 不用联网,不怕断网

🧘 丹爷寄语:AI不该是万能的,而应是你的搭子

真正有价值的AI,不是你问一句它答一句,而是 你写一句代码,它知道你接下来会做什么

它不是ChatGPT,但它懂你写的模块;
它不是Siri,但它知道你今晚加班在改什么;
它不会抢你饭碗,它只是陪你debug的一盏灯。

(需要你喂它足够的数据,并不停更正它的结果)


🧭 下一步建议(可拓展功能)

  • ✅ 接入 Gradio 做 Web UI
  • ✅ 接入 VSCode 插件模式
  • ✅ 使用 llama.cpp 本地运行 LLM
  • ✅ 微调自己的代码风格模型
  • ✅ 增加对 .ipynb 的支持

其它博文:


相关阅读:

《python深度学习之视频修复系统的应用案例》
《Python 与 C++ 结合加速 AI 计算:性能优化与实战案例》
《C++中的数据结构:程序员的“工具箱”与吐槽大会》
《C++ 协程(Coroutines):高效异步编程新纪元》
《C++智能指针及其在资源管理中的应用(智能指针Smart Pointer)》
《项目中C++链表的常见错误与优化策略:代码示例》
《扩展C++中算法中的终极字符串神器:后缀数组(Suffix Array)》
《AI中涉及到的算法汇总(精华)》
《别让黑客偷走你的“网银密码”——网络安全那些事儿!》
《DU网络安全意识指南》
《服务器虚拟化:技术概述与应用》


感兴趣的后续可以关注专栏或者公众号:
《黑客的世界》
python2048微信公众号


作者:奥特曼超人Dujinyang
来源:CSDN
原文:https://dujinyang.blog.csdn.net/
版权声明:本文为博主杜锦阳原创文章,转载请附上博文链接!


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐