作为一名经常需要写代码的开发者,我常常被一个问题困扰:写代码本身并不难,但写清晰的函数注释和 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 lazyllm
chat = 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 lazyllm
chat = 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 res
if __name__ == "__main__":
doc = generate_doc(r"E:\python\LazyLLM\snake.py") # 指定本地文件
print("=== 自动生成的注释与文档 ===")
print(doc)
输入示例:贪吃蛇(snake.py)
import pygame
import random
def 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 lazyllm
import 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 lazyllm
import 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 pygame
import random
def 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 pygame
import random
def 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,欢迎在评论区分享你的使用体验或遇到的问题!