掘金 人工智能 09月16日
LazyLLM:让AI自动生成代码注释与API文档
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文作者作为一名开发者,分享了使用LazyLLM工具进行代码文档自动生成的实测过程。LazyLLM能够扫描Python代码库,自动生成函数注释和API文档,极大地提高了开发效率。文章详细介绍了环境准备、对话机器人、Web界面交互,以及核心的自动文档生成实验,包括单文件和批量扫描两种模式。作者还演示了如何让LazyLLM直接将注释写入源代码,实现“代码即文档”的效果。LazyLLM的优势在于上手快、效率高、文档风格统一且灵活,是本地智能代码助手的理想选择。

🚀 **环境准备与基础功能验证:** 作者首先介绍了LazyLLM的本地环境搭建过程,包括创建虚拟环境、克隆代码库和安装依赖。随后,通过一个简单的对话机器人示例,验证了LazyLLM的核心模型(如通义千问)能够正常工作,并展示了其命令行和Web界面的交互方式,为后续更复杂的实验奠定基础。

🛠️ **核心功能:自动生成函数注释与API文档:** 文章的重点在于LazyLLM在代码文档生成方面的应用。作者详细演示了如何通过提供Python代码片段,让LazyLLM自动生成清晰的函数用途、参数说明和返回值文档。实验涵盖了对单个Python文件和整个代码目录的扫描,并展示了生成的文档内容,突显了其在提升开发效率和规范代码方面的价值。

📝 **进阶应用:代码即文档:** 为了进一步提升开发体验,作者尝试了让LazyLLM直接将生成的注释(docstrings)写入源代码。这一功能使得开发者能够在代码编辑器中即时查看和理解函数功能,无需额外切换文档,真正实现了“代码即文档”的目标,极大地简化了多人协作和代码维护的流程。

💡 **LazyLLM的优势与总结:** 作者总结了LazyLLM的几项显著优势,包括上手快、效率高、生成的文档风格统一且高度灵活。作者认为LazyLLM不仅是一个聊天SDK,更是一个可落地的本地智能代码助手,能够为开发者节省大量编写注释和整理文档的时间,促进团队协作,是现代开发流程中的有力工具。

作为一名经常需要写代码的开发者,我常常被一个问题困扰:写代码本身并不难,但写清晰的函数注释和 API 文档却很费时间。尤其在多人协作项目里,如果缺少规范的注释,新人接手代码往往需要花大量时间理解。

最近,我尝试用 LazyLLM 来做一个小实验:让它自动扫描代码库,生成函数注释和接口文档。下面分享一下我基于 LazyLLM 的实测过程。


环境准备

首先在本地新建了一个虚拟环境 lazyllm-venv311,以便和其他项目隔离。激活环境后,可以在命令行的开头看到 (lazyllm-venv311) 的提示。

从 GitHub 下载 LazyLLM 的代码:

git clone https://github.com/LazyAGI/LazyLLM.git

安装基础依赖:

pip install -r requirements.txt

选择一个平台获取 api key


第一个小实验:对话机器人

LazyLLM 的入门 demo 是一个聊天机器人。代码非常简单:

import lazyllmchat = lazyllm.OnlineChatModule(    source="qwen",       # 指定使用通义千问    api_key="sk-xxxx"    # 这里换成你自己的 key)while True:    query = input("query(enter 'quit' to exit): ")    if query == "quit":        break    res = chat.forward(query)    print(f"answer: {res}")

运行后,我在控制台输入“你好”,模型马上就回复了“你好!有什么我可以帮你的吗?”。到这里,说明 LazyLLM 已经正常跑起来了。


使用 Web 界面

除了命令行方式,LazyLLM 还自带了一个 Web 界面模块 WebModule,可以快速把对话机器人跑在浏览器里,更直观地交互。

示例代码如下:

import lazyllmchat = lazyllm.OnlineChatModule(source="qwen", api_key="sk-xxxx")lazyllm.WebModule(chat, port=23333).start().wait()

这里的 WebModule 接受两个参数:

运行后,在浏览器访问 http://localhost:23333,就能看到一个简洁的聊天页面,可以直接和模型对话。

⚠️ 注意:如果访问失败,通常是因为端口被占用、代理/防火墙拦截,可以在终端查看报错信息并调整。

这个小功能让我想到:LazyLLM 不仅能写后端逻辑,还能几行代码就搭好一个可视化 Demo,对于想做快速原型的开发者非常友好。


核心实验:自动生成函数注释与 API 文档

除了聊天和 Web 界面,LazyLLM 还可以构建 本地 Agent,实现对 Python 文件的扫描与自动文档生成。我的实验流程如下:

    指定本地 Python 文件(例如 snake.py)。读取文件内容将代码作为上下文交给模型自动生成函数注释和 API 文档

示例代码

import lazyllm# 初始化在线聊天模块chat = lazyllm.OnlineChatModule(source="qwen", api_key="sk-xxxx")def generate_doc(file_path):    # 读取本地 Python 文件    with open(file_path, "r", encoding="utf-8") as f:        code = f.read()        # 提示模型生成函数注释和 API 文档    prompt = f"""你是一个代码文档生成助手。请为以下 Python 代码自动生成清晰的函数注释和 API 文档,包括:- 函数用途- 参数说明- 返回值说明代码如下:{code}"""    # 调用模型生成文档    res = chat.forward(prompt)    return resif __name__ == "__main__":    doc = generate_doc(r"E:\python\LazyLLM\snake.py")  # 指定本地文件    print("=== 自动生成的注释与文档 ===")    print(doc)

输入示例:贪吃蛇(snake.py)

import pygameimport randomdef create_food(snake_body, screen_width, screen_height, block_size):    while True:        x = random.randrange(0, screen_width, block_size)        y = random.randrange(0, screen_height, block_size)        if (x, y) not in snake_body:            return (x, y)def move_snake(direction, snake_body, grow=False):    head_x, head_y = snake_body[0]    if direction == "UP":        new_head = (head_x, head_y - 20)    elif direction == "DOWN":        new_head = (head_x, head_y + 20)    elif direction == "LEFT":        new_head = (head_x - 20, head_y)    else:        new_head = (head_x + 20, head_y)    snake_body.insert(0, new_head)    if not grow:        snake_body.pop()    return snake_body

模型输出示例(自动生成单个文件函数注释)

=== 自动生成的注释与文档 ===以下是为你提供的 Python 代码生成的函数注释和 API 文档:---## `create_food(snake_body, screen_width, screen_height, block_size)`### 用途该函数用于在游戏区域内随机生成一个食物的位置,确保该位置不在蛇的身体上。### 参数说明- `snake_body``List[Tuple[int, int]]`    表示蛇身体各个部分的坐标列表,每个元素是一个 (x, y) 坐标元组。- `screen_width``int`    游戏窗口的宽度(像素)。- `screen_height``int`    游戏窗口的高度(像素)。- `block_size``int`    蛇的每个身体块和食物的大小(通常为 20 像素)。### 返回值- `Tuple[int, int]`  返回一个不在蛇身体上的随机坐标 (x, y),用于放置食物。---## `move_snake(direction, snake_body, grow=False)`### 用途根据当前的方向移动蛇,并更新蛇的身体位置。如果蛇吃到了食物,则蛇身增长。        ### 参数说明- `direction``str`  蛇的移动方向,可以是 `"UP"``"DOWN"``"LEFT"``"RIGHT"`。- `snake_body``List[Tuple[int, int]]`  表示蛇身体各个部分的坐标列表,第一个元素为蛇头。- `grow``bool`,可选  是否增长蛇身,默认为 `False`。当蛇吃到食物时应设为 `True`。### 返回值- `List[Tuple[int, int]]`  返回更新后的蛇身体坐标列表。---### 示例用法```python# 初始化蛇身(假设每个块大小为20)snake = [(100, 100), (120, 100), (140, 100)]# 向右移动,不增长snake = move_snake("RIGHT", snake)# 生成食物food_pos = create_food(snake, 600, 400, 20)


如果你希望扫描整个目录下所有 .py 文件、批量生成注释和 API 文档的版本,也是可以实现的,这样就像一个本地的“小型代码文档 Agent”。

代码示例如下:

import lazyllmimport os# 初始化在线聊天模块chat = lazyllm.OnlineChatModule(source="qwen", api_key="sk-xxxx")def generate_doc_from_code(code):    """    给定一段 Python 代码,调用模型生成函数注释和 API 文档。    """    prompt = f"""你是一个代码文档生成助手。请为以下 Python 代码自动生成清晰的函数注释和 API 文档,包括:- 函数用途- 参数说明- 返回值说明代码如下:{code}"""    return chat.forward(prompt)def scan_directory_and_generate_docs(directory=r"E:\python\LazyLLM"):    """    扫描目录下所有 .py 文件,生成文档并保存到同目录的 _docs 文件夹中    """    output_dir = os.path.join(directory, "_docs")    os.makedirs(output_dir, exist_ok=True)    for root, _, files in os.walk(directory):        for file in files:            if file.endswith(".py"):                file_path = os.path.join(root, file)                print(f"正在处理: {file_path}")                                # 读取代码                with open(file_path, "r", encoding="utf-8") as f:                    code = f.read()                # 调用模型生成文档                doc = generate_doc_from_code(code)                # 保存文档                output_file = os.path.join(output_dir, file.replace(".py", "_doc.txt"))                with open(output_file, "w", encoding="utf-8") as f:                    f.write(doc)                print(f"文档已保存: {output_file}\n")if __name__ == "__main__":    scan_directory_and_generate_docs()  # 默认扫描 E:\python\LazyLLM

✅ 功能说明:

1.自动扫描 E:\python\LazyLLM 下的所有 .py 文件(包括子目录)。2.为每个文件生成函数注释和 API 文档。3.文档统一保存到 _docs 文件夹里。

模型输出示例(自动生成多个文件函数注释)


进阶实验:将注释直接写入源代码

前面的实验里,我们让模型生成了函数注释和 API 文档,但这些是单独保存成文本文件的。如果能让模型直接把注释写回到源代码中,就能在代码编辑器里立刻看到,体验更接近“代码即文档”。

示例代码

import lazyllmimport os# 初始化在线聊天模块chat = lazyllm.OnlineChatModule(source="qwen", api_key="sk-xxxx")def add_comments_to_code(code):    """    调用模型,为代码中的函数生成 docstring 并直接插入到源文件中。    """    prompt = f"""你是一个代码注释助手。请在以下 Python 源代码中,自动为每个函数和类添加清晰的 docstring,包括:- 函数/类的用途- 参数说明- 返回值说明要求直接在代码中插入,不要输出额外解释。代码如下:{code}"""    return chat.forward(prompt)def rewrite_file_with_comments(file_path, output_path=None):    """    读取 Python 文件,生成带注释的新代码,并写回文件。    """    with open(file_path, "r", encoding="utf-8") as f:        code = f.read()    # 调用模型生成带注释的新代码    commented_code = add_comments_to_code(code)    # 如果没有指定输出文件,就覆盖原文件    if output_path is None:        output_path = file_path    with open(output_path, "w", encoding="utf-8") as f:        f.write(commented_code)    print(f"注释已写入文件: {output_path}")if __name__ == "__main__":    test_file = r"E:\python\LazyLLM\snake.py"    rewrite_file_with_comments(test_file, output_path=test_file.replace(".py", "_commented.py"))

输入示例:原始 snake.py

import pygameimport randomdef create_food(snake_body, screen_width, screen_height, block_size):    while True:        x = random.randrange(0, screen_width, block_size)        y = random.randrange(0, screen_height, block_size)        if (x, y) not in snake_body:            return (x, y)def move_snake(direction, snake_body, grow=False):    head_x, head_y = snake_body[0]    if direction == "UP":        new_head = (head_x, head_y - 20)    elif direction == "DOWN":        new_head = (head_x, head_y + 20)    elif direction == "LEFT":        new_head = (head_x - 20, head_y)    else:        new_head = (head_x + 20, head_y)    snake_body.insert(0, new_head)    if not grow:        snake_body.pop()    return snake_body

模型输出示例(自动插入注释后的 snake_commented.py

import pygameimport randomdef create_food(snake_body, screen_width, screen_height, block_size):    """    创建一个随机位置的食物,确保食物的位置不在蛇的身体上。    参数:    snake_body (list): 蛇身体的坐标列表    screen_width (int): 游戏窗口的宽度    screen_height (int): 游戏窗口的高度    block_size (int): 蛇身每一节的大小    返回:    tuple: 食物的坐标 (x, y)    """    while True:        x = random.randrange(0, screen_width, block_size)        y = random.randrange(0, screen_height, block_size)        if (x, y) not in snake_body:            return (x, y)def move_snake(direction, snake_body, grow=False):    """    根据当前方向移动蛇,并更新蛇的身体坐标。    参数:    direction (str): 蛇的移动方向,可以是 "UP", "DOWN", "LEFT", "RIGHT"    snake_body (list): 蛇身体的坐标列表    grow (bool): 是否增长蛇的身体(吃食物时为 True)    返回:    list: 更新后的蛇身体坐标列表    """    head_x, head_y = snake_body[0]    if direction == "UP":        new_head = (head_x, head_y - 20)    elif direction == "DOWN":        new_head = (head_x, head_y + 20)    elif direction == "LEFT":        new_head = (head_x - 20, head_y)    else:        new_head = (head_x + 20, head_y)    snake_body.insert(0, new_head)    if not grow:        snake_body.pop()    return snake_body


✅ 功能说明:

    自动调用模型,在函数内部插入符合规范的 docstring;可以选择覆盖源文件,或者生成新的 _commented.py 文件;在编辑器里就能直接看到函数注释,无需再切换到文档文件夹。

这样就实现了“代码即文档”的效果。

总结

整个体验过程下来,我主要做了以下尝试:先在本地搭好虚拟环境,安装并配置 LazyLLM,然后用它跑了一个简单的对话机器人,验证模型可以正常工作。然后我试着用 Web 界面快速和模型交互,感觉直观又方便。最核心的实验是让它扫描 Python 文件,自动生成函数注释和 API 文档,不管是单个文件还是整个目录,都能自动生成清晰的函数用途、参数说明和返回值文档,几秒钟就完成了以前需要手动写很久的工作。

用下来,我觉得 LazyLLM 有几个明显优势:上手快、效率高,生成的文档风格统一,而且非常灵活,可以直接在本地用,也能扩展成更复杂的代码辅助工具。对我这种经常写代码的人来说,省下了不少写注释和整理文档的时间,也让团队协作更加顺畅。总体来说,它不仅是一个聊天 SDK,更像是一个本地可落地的智能代码助手。

📺 想更深入掌握 LazyLLM 的使用技巧?

B站上线了一套免费视频课程,手把手带你从入门到实战,快速上手智能代码开发!
👉 点击观看:LazyLLM 实战教程 - 从零搭建智能代码助手

💡 欢迎关注公众号【LazyLLM】
获取更多 AI 开发技巧、最新工具评测和实战案例!定期分享编程干货与独家资源~

一起交流

如果你也尝试了 LazyLLM,欢迎在评论区分享你的使用体验或遇到的问题!

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

LazyLLM 代码生成 AI助手 函数注释 API文档 Python 开发效率 智能代码助手 代码即文档
相关文章