作为一名经常需要写代码的开发者,我常常被一个问题困扰:写代码本身并不难,但写清晰的函数注释和 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 接受两个参数:
- chat:我们上面创建的聊天模块port:Web 服务监听的端口号(这里是 23333)
运行后,在浏览器访问 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,欢迎在评论区分享你的使用体验或遇到的问题!
