LazyLLM部署日志
开源尝试!
1 配置虚拟环境
在 VSCode 中为项目配置 Python 3.10 虚拟环境(命名为lazyllm
),可以按照以下步骤操作,利用已有的 Anaconda 环境:
步骤 1:创建 Python 3.10 虚拟环境
- 打开 VSCode 终端(Ctrl+` 或 终端 > 新建终端)
- 使用 Anaconda 创建指定 Python 版本的虚拟环境:
bash
conda create -n lazymllm python=3.10
y
确认安装
步骤 2:激活虚拟环境
创建完成后,激活这个环境:
bash
conda activate lazymllm
激活后,终端提示符前会显示(lazyllm)
,表示当前使用该环境
步骤 3:在 VSCode 中选择虚拟环境
- 打开命令面板:Ctrl+Shift+P(或 F1)
- 输入并选择:
Python: 选择解释器
- 在列表中找到并选择:
Python 3.10 (lazyllm) ...
- 通常路径类似:
conda环境路径/envs/lazyllm/python.exe
- 通常路径类似:
步骤 4:验证配置
- 在项目中新建或打开一个 Python 文件
- 在终端中运行:
bash
python --version
Python 3.10.x
步骤 5:(可选)保存环境配置
VSCode 会自动在项目根目录创建.vscode/settings.json
文件,记录所选解释器,确保团队成员或下次打开时使用相同环境。
这样配置后,你的项目就会使用 Python 3.10 环境,与本地的 Python 3.13 环境隔离开来,解决版本兼容性问题。如果需要安装依赖包,只需在激活lazyllm
环境后使用pip install
或conda install
命令即可。【一般常是requirements】
【P.S. 本地没有配置好CUDA环境,如果需要GPU支持下更高性能的功能体验,pip install deepspeed 重新安装好,安装下来比较费时间,本次我就略过了,以后可尝试下!】
2 fork分支
后续:规范开发与提交 PR 的流程
至此,你已完成 “重新来过” 的所有准备(之前只是clone到本地没有完成fork,不是很好的参与开源呢...),后续开发可按开源协作的标准流程操作:
- 同步原仓库最新代码(每次开发前执行,避免基于旧代码修改):
bash
git fetch upstream # 拉取原仓库最新更新 git merge upstream/main # 合并到本地 main 分支
- 创建新分支开发(不直接修改 main 分支):
bash
git checkout -b feature/你的功能名 # 如 feature/add-rag-demo
- 修改代码 → 提交 → 推送到你的 fork 仓库:
bash
git add . # 添加修改的文件 git commit -m "feat: 新增 RAG 演示功能" # 清晰备注修改内容 git push origin feature/你的功能名 # 推送到你的 fork 仓库
- 在 GitHub 上提交 PR:打开你的 fork 仓库页面,会看到 “Compare & pull request” 按钮,点击后按提示填写 PR 说明,提交给原仓库即可。、
3 配置好环境变量(虚拟环境下,不污染本地)
将当前lazyllm加入模块搜索路径
一、先明确:什么时候需要手动添加搜索路径?
默认情况下,如果你在 项目根目录(F:\LazyLLM
) 下运行代码(比如 python examples/rag_demo.py
),Python 会自动将当前目录(F:\LazyLLM
)加入模块搜索路径,此时无需手动配置,import lazyllm
能正常生效。
只有以下场景才需要手动添加搜索路径:
- 你在 非项目根目录 下运行代码(比如在
F:\
根目录下执行import lazyllm
); - 你在 Jupyter Notebook、PyCharm 等 IDE 中导入
lazyllm
时,IDE 提示 “模块未找到”; - 你需要在 其他 Python 环境(如全局环境、非项目虚拟环境) 中调用
lazyllm
模块。
-----------------------
永久添加(仅当前虚拟环境生效,推荐)
通过修改虚拟环境的 site-packages
目录,让 Python 每次启动时自动加载路径,不影响全局环境:
激活虚拟环境后,执行以下命令,找到
site-packages
目录路径:bash
# 查看 Python 安装路径(虚拟环境的 Python 路径) where python
输出类似:
F:\Miniconda3\envs\lazyllm-venv\python.exe
,则site-packages
目录为:F:\Miniconda3\envs\lazyllm-venv\Lib\site-packages
。在
site-packages
目录下,新建一个.pth
后缀的文件(如lazyllm_path.pth
):- 直接在文件管理器中导航到上述
site-packages
目录; - 右键 → 新建 → 文本文档,重命名为
lazyllm_path.pth
(注意删除.txt
后缀,若看不到后缀,需在 “文件夹选项” 中取消 “隐藏已知文件类型的扩展名”)。
- 直接在文件管理器中导航到上述
用记事本打开
lazyllm_path.pth
,写入你的lazyllm
项目根目录路径(如F:\LazyLLM
),保存并关闭。验证生效:
bash
# 关闭当前终端,重新激活虚拟环境 conda activate lazyllm-venv # 进入 Python 交互环境 python import lazyllm # 无报错则永久生效
4 配置API密钥
我用的是免费的 Qwen3 API 密钥(哈哈哈...其实效果还可以!反应时间稍微有点慢!)
1.set 密钥,(如果是Linux系统是export)
在 Linux 或 macOS 系统 下,通过 export
命令设置环境变量;而你执行的 set QWEN_API_KEY=...
是 Windows 系统 下设置环境变量的命令。两者是不同系统下设置环境变量的语法,作用是一致的 —— 都是把 API 密钥配置到系统环境中,让程序能读取到。
如果要对应到图片里的代码风格(Linux/macOS 语法),在 Windows 系统的 PowerShell(更接近 Linux 终端体验的环境,若你用的是普通 cmd 则还是用 set
)中,可写成:
bash
$env:LAZYLLM_SENSENOVA_API_KEY = ""
但需要注意:
- 图片里的环境变量名是
LAZYLLM_SENSENOVA_API_KEY
,而你之前用的是QWEN_API_KEY
,要确认项目里实际需要的环境变量名(是对接 “sensenova” 相关接口,还是 “Qwen” 模型接口),保证变量名和项目要求一致。 - 若你用的是普通 Windows
cmd
终端,还是得用set
语法
2.在源代码仓库文件里面查找import * 导入的模块,编写测试脚本
查看模块结构打开
LazyLLM\lazyllm\__init__.py
文件,查看其中是否有LLM
类的定义,或导出的模块列表(例如是否通过from .llm import *
导出了模型相关功能)。参考官方示例检查项目的
examples
目录(如examples/qwen_demo.py
),看看官方是如何导入和使用 Qwen 模型的,模仿其写法即可。确认模型名称不同项目对模型的命名可能不同(如
qwen-3b
、qwen-plus
等),需与你使用的免费 API 支持的模型名一致。
如果问题仍存在,可以提供 lazyllm/__init__.py
的内容或项目官方文档链接,以便更精准地定位问题。
【不会写就仿照free qwen3的官网测试示例】
import os
import requests# 检查 API 密钥是否存在
api_key = os.getenv('QWEN_API_KEY')
print("API 密钥是否存在:", api_key is not None)if not api_key:print("请先设置 QWEN_API_KEY 环境变量")
else:try:# 接口地址(与 curl 中的 url 一致)url = ""# 请求头(与 curl 中的 header 一致)headers = {"Authorization": f"Bearer {api_key}", # 注意格式是 "Bearer 密钥""Content-Type": "application/json"}# 请求数据(与 curl 中的 data 一致)data = {"model": "free:Qwen3-30B-A3B", # 模型名必须完全匹配"messages": [{"role": "user", "content": "你好,请介绍一下自己"}]}# 发送 POST 请求(模拟 curl 的 --request POST)response = requests.post(url, json=data, headers=headers)response.raise_for_status() # 若 HTTP 错误(如 401、404)会抛出异常# 解析响应(获取模型返回的内容)result = response.json()print("模型响应:", result["choices"][0]["message"]["content"])except Exception as e:print("请求错误:", e)# 打印详细响应内容,方便排查问题(如密钥错误、模型不存在等)if 'response' in locals():print("接口返回详情:", response.text)
3.写个demo测试交互
代码
import os
import requestsdef main():# 获取API密钥api_key = os.getenv('QWEN_API_KEY')if not api_key:print("请先设置环境变量 QWEN_API_KEY(终端执行:set QWEN_API_KEY=你的密钥)")return# 接口配置(与你的免费API匹配)api_url = " "model_name = "free:Qwen3-30B-A3B"# 维护对话历史(关键:保留上下文需要传递历史消息)messages = []print("欢迎使用交互式对话(输入 'quit' 退出)")while True:# 获取用户输入query = input("\n请输入你的问题: ")if query.lower() == "quit":print("对话结束,再见!")break# 将用户输入添加到历史记录messages.append({"role": "user", "content": query})try:# 发送请求(携带历史消息以支持上下文)response = requests.post(url=api_url,headers={"Authorization": f"Bearer {api_key}","Content-Type": "application/json"},json={"model": model_name,"messages": messages # 传递全部历史,实现上下文关联})response.raise_for_status() # 检查HTTP错误# 解析模型响应result = response.json()answer = result["choices"][0]["message"]["content"]print(f"回答: {answer}")# 将模型回复添加到历史记录(下次请求会携带,保持上下文)messages.append({"role": "assistant", "content": answer})except Exception as e:print(f"请求错误: {e}")if 'response' in locals():print(f"接口详情: {response.text}")# 出错时清空当前轮次的输入(避免影响后续对话)messages.pop()if __name__ == "__main__":main()
关键说明:
对话历史维护:通过
messages
列表保存所有历史消息(用户输入和模型回复),每次请求时将整个列表传给 API,实现上下文关联(例如:你问 “它是什么?”,模型会结合上一句 “介绍下 Python” 来理解 “它” 指的是 Python)。适配第三方 API:完全遵循你的免费 API 的接口格式(与
curl
示例一致),无需依赖lazyllm.OnlineChatModule
,避免因模块不支持第三方接口导致的错误。交互逻辑:
- 循环等待用户输入,输入
quit
退出对话。 - 每次请求失败时,会移除当前用户输入(
messages.pop()
),避免错误消息影响后续对话。
- 循环等待用户输入,输入
运行方法:
- 确保已安装
requests
(若未安装,执行pip install requests
)。 - 在终端设置 API 密钥:
bash
set QWEN_API_KEY=
- 运行脚本:
bash
python interactive_chat.py
这样就能实现类似示例中的交互式对话功能,且完全适配你使用的第三方免费 Qwen3 API,无需依赖特定模块的 source
配置。如果需要调整对话长度(避免历史消息过多),可以在 messages
列表长度超过一定数量时,删除最早的几条记录。
---------------
实现了部署!ok!