丹爷:用Python打造属于你的AI编程助理(完整实战 + 核心原理剖析)
1)通过ast模块扫描项目文件;2)利用LangChain和FAISS实现代码语义搜索;3)基于transformers生成函数注释;4)集成静态分析工具检查代码规范。该助手可私有化部署,专为开发者理解个人项目代码而设计,相比通用AI工具能提供更精准的上下文相关帮助。文章提供了完整实现代码,包括项目扫描器、代码索引器、注释生成器等核心组件,开发者可将其集成到命令行或IDE中使用。
丹爷:用Python打造属于你的AI编程助理(完整实战 + 核心原理剖析)
转载请标明出处:
https://dujinyang.blog.csdn.net/
本文出自:【奥特曼超人的博客】
编程
在编程这条路上,孤独是常态。无数次我们陷入复杂逻辑、报错信息、重复劳动的黑洞,只希望身边有个伙伴,能懂代码、能查 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
+ 微调的 CodeT5
或 CodeLlama
进行函数注释生成。
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
实现,复杂可集成 pylint
、mypy
。
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
的支持
其它博文:
- 《Linux系统运维实战:彻底修复systemctl误操作与高效部署安全检测工具》
- 《丹爷:快来看python如何恢复Windows的数据》
- 《丹爷:来!打地鼠游戏,咱们一起来开发》
- 《丹爷:飞机与飞天蛇的超能碰撞(Python运行源码含截图))》
- 《丹爷:打飞机小游戏开发全流程(Python3.7兼容,含运行截图)》
- 《丹爷:python处理xls和xlsx表格时的版本兼容和乱码问题》
- 《用 Python 写个贪吃蛇游戏,丹爷上线》
- 《Python与C++开发格斗游戏:周董 vs 丹爷》
- 《丹爷的 Python 与 C++ 跨界冒险:从自动化到游戏开发的魔法之旅》
- 《周董和丹爷:让 Python 和 C++ 一起“搞事情”,实现高效数据处理和分析》
- 《丹爷的 Python 逆袭之路:从咸鱼到自动化办公女王》
- 《周董不服 :丹爷的Python编程对决》
- 《周董的 Python 冒险:与丹爷的Py编程对决》
- 《深度学习魔法入门:周董与丹爷的成长冒险之旅》
相关阅读:
《python深度学习之视频修复系统的应用案例》
《Python 与 C++ 结合加速 AI 计算:性能优化与实战案例》
《C++中的数据结构:程序员的“工具箱”与吐槽大会》
《C++ 协程(Coroutines):高效异步编程新纪元》
《C++智能指针及其在资源管理中的应用(智能指针Smart Pointer)》
《项目中C++链表的常见错误与优化策略:代码示例》
《扩展C++中算法中的终极字符串神器:后缀数组(Suffix Array)》
《AI中涉及到的算法汇总(精华)》
《别让黑客偷走你的“网银密码”——网络安全那些事儿!》
《DU网络安全意识指南》
《服务器虚拟化:技术概述与应用》
感兴趣的后续可以关注专栏或者公众号:
《黑客的世界》
作者:奥特曼超人Dujinyang
来源:CSDN
原文:https://dujinyang.blog.csdn.net/
版权声明:本文为博主杜锦阳原创文章,转载请附上博文链接!
更多推荐
所有评论(0)