开源尝试!

1 配置虚拟环境

在 VSCode 中为项目配置 Python 3.10 虚拟环境(命名为lazyllm),可以按照以下步骤操作,利用已有的 Anaconda 环境:

步骤 1:创建 Python 3.10 虚拟环境

  1. 打开 VSCode 终端(Ctrl+` 或 终端 > 新建终端)
  2. 使用 Anaconda 创建指定 Python 版本的虚拟环境:

    bash

    conda create -n lazymllm python=3.10
    
    按提示输入y确认安装

步骤 2:激活虚拟环境

创建完成后,激活这个环境:

bash

conda activate lazymllm

激活后,终端提示符前会显示(lazyllm),表示当前使用该环境

步骤 3:在 VSCode 中选择虚拟环境

  1. 打开命令面板:Ctrl+Shift+P(或 F1)
  2. 输入并选择:Python: 选择解释器
  3. 在列表中找到并选择:Python 3.10 (lazyllm) ...
    • 通常路径类似:conda环境路径/envs/lazyllm/python.exe

步骤 4:验证配置

  1. 在项目中新建或打开一个 Python 文件
  2. 在终端中运行:

    bash

    python --version
    
    确认输出为Python 3.10.x

步骤 5:(可选)保存环境配置

VSCode 会自动在项目根目录创建.vscode/settings.json文件,记录所选解释器,确保团队成员或下次打开时使用相同环境。

这样配置后,你的项目就会使用 Python 3.10 环境,与本地的 Python 3.13 环境隔离开来,解决版本兼容性问题。如果需要安装依赖包,只需在激活lazyllm环境后使用pip installconda install命令即可。【一般常是requirements】

【P.S. 本地没有配置好CUDA环境,如果需要GPU支持下更高性能的功能体验,pip install deepspeed 重新安装好,安装下来比较费时间,本次我就略过了,以后可尝试下!】

2 fork分支

后续:规范开发与提交 PR 的流程

至此,你已完成 “重新来过” 的所有准备(之前只是clone到本地没有完成fork,不是很好的参与开源呢...),后续开发可按开源协作的标准流程操作:

  1. 同步原仓库最新代码(每次开发前执行,避免基于旧代码修改):

    bash

    git fetch upstream  # 拉取原仓库最新更新
    git merge upstream/main  # 合并到本地 main 分支
    
  2. 创建新分支开发(不直接修改 main 分支):

    bash

    git checkout -b feature/你的功能名  # 如 feature/add-rag-demo
    
  3. 修改代码 → 提交 → 推送到你的 fork 仓库

    bash

    git add .  # 添加修改的文件
    git commit -m "feat: 新增 RAG 演示功能"  # 清晰备注修改内容
    git push origin feature/你的功能名  # 推送到你的 fork 仓库
    
  4. 在 GitHub 上提交 PR:打开你的 fork 仓库页面,会看到 “Compare & pull request” 按钮,点击后按提示填写 PR 说明,提交给原仓库即可。、

3 配置好环境变量(虚拟环境下,不污染本地)

将当前lazyllm加入模块搜索路径

一、先明确:什么时候需要手动添加搜索路径?

默认情况下,如果你在 项目根目录(F:\LazyLLM 下运行代码(比如 python examples/rag_demo.py),Python 会自动将当前目录(F:\LazyLLM)加入模块搜索路径,此时无需手动配置,import lazyllm 能正常生效。

只有以下场景才需要手动添加搜索路径:

  1. 你在 非项目根目录 下运行代码(比如在 F:\ 根目录下执行 import lazyllm);
  2. 你在 Jupyter Notebook、PyCharm 等 IDE 中导入 lazyllm 时,IDE 提示 “模块未找到”;
  3. 你需要在 其他 Python 环境(如全局环境、非项目虚拟环境) 中调用 lazyllm 模块。

-----------------------

永久添加(仅当前虚拟环境生效,推荐)

通过修改虚拟环境的 site-packages 目录,让 Python 每次启动时自动加载路径,不影响全局环境:

  1. 激活虚拟环境后,执行以下命令,找到 site-packages 目录路径:

    bash

    # 查看 Python 安装路径(虚拟环境的 Python 路径)
    where python
    

    输出类似:F:\Miniconda3\envs\lazyllm-venv\python.exe,则 site-packages 目录为:F:\Miniconda3\envs\lazyllm-venv\Lib\site-packages

  2. 在 site-packages 目录下,新建一个 .pth 后缀的文件(如 lazyllm_path.pth):

    • 直接在文件管理器中导航到上述 site-packages 目录;
    • 右键 → 新建 → 文本文档,重命名为 lazyllm_path.pth(注意删除 .txt 后缀,若看不到后缀,需在 “文件夹选项” 中取消 “隐藏已知文件类型的扩展名”)。
  3. 用记事本打开 lazyllm_path.pth,写入你的 lazyllm 项目根目录路径(如 F:\LazyLLM),保存并关闭。

  4. 验证生效:

    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 * 导入的模块,编写测试脚本

  1. 查看模块结构打开 LazyLLM\lazyllm\__init__.py 文件,查看其中是否有 LLM 类的定义,或导出的模块列表(例如是否通过 from .llm import * 导出了模型相关功能)。

  2. 参考官方示例检查项目的 examples 目录(如 examples/qwen_demo.py),看看官方是如何导入和使用 Qwen 模型的,模仿其写法即可。

  3. 确认模型名称不同项目对模型的命名可能不同(如 qwen-3bqwen-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 requests

def 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()
    

关键说明:

  1. 对话历史维护:通过 messages 列表保存所有历史消息(用户输入和模型回复),每次请求时将整个列表传给 API,实现上下文关联(例如:你问 “它是什么?”,模型会结合上一句 “介绍下 Python” 来理解 “它” 指的是 Python)。

  2. 适配第三方 API:完全遵循你的免费 API 的接口格式(与 curl 示例一致),无需依赖 lazyllm.OnlineChatModule,避免因模块不支持第三方接口导致的错误。

  3. 交互逻辑

    • 循环等待用户输入,输入 quit 退出对话。
    • 每次请求失败时,会移除当前用户输入(messages.pop()),避免错误消息影响后续对话。

运行方法:

  1. 确保已安装 requests(若未安装,执行 pip install requests)。
  2. 在终端设置 API 密钥:

    bash

    set QWEN_API_KEY=
    
  3. 运行脚本:

    bash

    python interactive_chat.py
    

这样就能实现类似示例中的交互式对话功能,且完全适配你使用的第三方免费 Qwen3 API,无需依赖特定模块的 source 配置。如果需要调整对话长度(避免历史消息过多),可以在 messages 列表长度超过一定数量时,删除最早的几条记录。

---------------

实现了部署!ok!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐