1. 项目概述:一个为本地大模型应用而生的JavaScript SDK

如果你正在尝试将类似ChatGPT这样的生成式AI能力集成到你的Web应用或桌面应用中,但又不希望将用户数据发送到云端,或者你需要一个完全可控、可离线运行的AI环境,那么你很可能已经听说过LM Studio。它是一个强大的桌面应用,让你可以在自己的电脑上运行各种开源大语言模型。而今天我们要深入探讨的,正是让这一切在代码层面成为可能的核心桥梁—— lmstudio-ai/lmstudio-js

简单来说, lmstudio-js 是一个官方的JavaScript/TypeScript软件开发工具包。它的核心使命,是让你能够通过标准的HTTP API,从任何JavaScript运行环境(无论是Node.js后端、Electron桌面应用,还是现代浏览器)中,无缝地与你本地LM Studio服务中运行的大模型进行对话。这意味着,你可以用几行代码,就构建出一个完全运行在你个人电脑或内网服务器上的“私有ChatGPT”,数据不出本地,响应速度极快,且模型选择完全自由。

这个项目解决的痛点非常明确: 将本地大模型的强大能力,以标准化、易用的方式暴露给前端和全栈开发者 。在过去,如果你想在Web界面里调用本地模型,可能需要自己处理复杂的进程通信、WebSocket连接或者非标准的API格式。 lmstudio-js 将这些底层复杂性全部封装起来,提供了一个与OpenAI API高度兼容的接口。如果你熟悉使用 openai 这个NPM包来调用GPT-4,那么你几乎可以零成本地切换到使用 lmstudio-js 来调用你本地的Llama 3、Mistral或Qwen模型。

它适合谁呢?首先,是那些对数据隐私有极高要求的应用开发者,比如处理敏感文档、内部知识库或医疗法律咨询的场景。其次,是AI爱好者和研究者,他们希望快速构建原型来测试不同模型在特定任务上的表现。最后,也是广大的全栈和前端开发者,他们希望以最小的学习成本,将AI能力作为一种“基础设施”集成到现有的技术栈中。接下来,我们就从设计思路开始,一层层拆解这个精巧的工具包。

2. 核心设计思路与架构解析

2.1 为什么是HTTP API与OpenAI兼容性?

lmstudio-js 的设计哲学可以概括为“拥抱标准,降低迁移成本”。其最核心的设计决策,就是完全复刻了OpenAI API的接口规范。这不是一个偶然的选择,而是经过深思熟虑的战略。

降低开发者学习曲线 :OpenAI的API设计事实上已经成为行业标准。无数教程、开源项目和公司内部系统都基于此构建。通过提供完全兼容的接口,任何已经会用 openai 库的开发者,几乎不需要阅读新文档,就能立刻上手。你只需要把 import OpenAI from 'openai' 换成 import LMStudio from '@lmstudio/sdk' ,然后把 baseURL 指向你的LM Studio本地服务地址(通常是 http://localhost:1234/v1 ),剩下的代码几乎可以原封不动地运行。

生态兼容性 :许多优秀的AI应用框架和中间件(如LangChain、LlamaIndex)都内置了对OpenAI格式API的支持。由于 lmstudio-js 的兼容性,这些工具可以不经修改或仅需微小配置,就直接接入本地LM Studio模型,极大地扩展了其能力边界。你可以用LangChain轻松构建基于本地模型的RAG(检索增强生成)系统,或者用LlamaIndex来索引和查询你的本地文档库。

技术实现的简洁性 :HTTP是一种无状态、标准化的协议,几乎所有编程环境都有成熟的客户端库。基于HTTP设计SDK,使得 lmstudio-js 的核心可以非常轻量——它本质上是一个配置得当的HTTP客户端,负责将你的JavaScript对象序列化为JSON请求,发送给本地LM Studio服务器,并处理返回的响应和流。这种设计也使得SDK的维护和更新变得相对简单,主要跟随LM Studio服务端的API演进即可。

2.2 核心架构:客户端、服务器与流式传输

要理解 lmstudio-js ,必须理解它背后的运行架构。这是一个典型的客户端-服务器(C/S)模型。

服务器端(LM Studio Desktop) :这是能力的提供者。LM Studio桌面应用启动后,会在你电脑的本地回环地址( localhost )上开启一个HTTP服务。这个服务负责加载你指定的大模型文件(通常是GGUF格式),管理GPU/CPU计算资源,并提供一个遵循OpenAI API规范的端点(如 /v1/chat/completions )。它处理所有繁重的模型推理工作。

客户端( lmstudio-js SDK) :这就是我们今天的主角。它是一个“瘦客户端”,职责清晰:

  1. 配置管理 :保存服务器地址、API密钥(虽然本地通常可为空或任意值)等连接信息。
  2. 请求构造 :将开发者友好的JavaScript函数调用(如 client.chat.completions.create )转换为符合规范的HTTP请求体。
  3. 通信处理 :使用 fetch 或类似的HTTP库发送请求,并处理响应。
  4. 流式响应处理 :这是亮点之一。当请求流式输出时,SDK会将服务器返回的Server-Sent Events(SSE)数据流,转换成一个异步迭代器(Async Iterator),让开发者可以用 for await 循环来逐块获取生成的文本,实现打字机效果。

通信流程 :当你调用 client.chat.completions.create({...}) 时,SDK会向 http://localhost:1234/v1/chat/completions 发送一个POST请求。请求体包含了你的消息历史、模型名称、生成参数等。LM Studio服务端收到后,让模型进行推理,并将结果以JSON或流的形式返回。SDK接收到后,解析数据,将其转换为结构化的对象返回给你的代码。

这种清晰的分离带来了巨大的灵活性。你的JavaScript应用(客户端)可以运行在任何地方——只要它能通过网络访问到运行LM Studio的机器。这意味着你可以构建一个本地Web界面,也可以从一台远程服务器调用另一台更强力显卡机器上的模型。

2.3. 类型安全与开发者体验

作为一个现代JavaScript/TypeScript项目, lmstudio-js 在开发者体验上做了大量投入,其核心就是 全面的TypeScript支持

如果你打开项目的NPM页面或者源码,你会发现它提供了完整的类型定义(.d.ts文件)。这意味着在你最喜欢的代码编辑器(如VSCode)中,你可以获得:

  • 智能自动补全 :输入 client. 之后,编辑器会提示出所有可用的方法( chat , completions , create 等)。
  • 参数提示 :当你在编写 create 方法的参数对象时,编辑器会提示每个字段的名称和类型,比如 model 是字符串, messages 是一个数组,数组里的每个对象必须有 role content
  • 类型检查 :如果你不小心把 max_tokens 写成了 maxTokens ,或者给 temperature 传了一个字符串,TypeScript编译器会在你运行代码前就报错,防止运行时出现意外。

这对于构建复杂应用至关重要。AI模型的参数往往很多( temperature , top_p , stop , stream 等),记忆和手动检查很容易出错。有了类型系统的保障,你可以更自信地编写代码,重构起来也更容易。SDK的类型定义通常与OpenAI官方的类型库保持对齐,这进一步降低了从云端API迁移到本地API的心智负担。

3. 从零开始:环境配置与基础用法

3.1 前置条件:安装与启动LM Studio

在使用 lmstudio-js 之前,你必须先确保服务器端就绪。这不仅仅是安装一个软件那么简单,其中有一些关键选择会影响后续开发的体验和性能。

第一步:获取并安装LM Studio 前往LM Studio官网下载对应你操作系统(Windows、macOS、Linux)的安装包。安装过程是图形化的,非常简单。安装完成后启动,你会看到一个直观的界面,主要功能是搜索、下载和管理模型。

第二步:下载合适的模型 这是核心资源。在LM Studio的“探索”或“搜索”页面,你可以找到海量的开源模型。对于初学者,我强烈建议从一些中小规模的模型开始,例如:

  • Llama 3.1 8B Instruct :Meta最新推出的8B参数模型,在指令跟随和对话上表现优异,对硬件要求相对友好。
  • Qwen 2.5 7B Instruct :阿里通义千问的模型,中文能力很强,代码生成也不错。
  • Phi-3 Mini 3.8B :微软出品的“小钢炮”,参数虽少,能力不俗,在消费级显卡上运行飞快。

注意 :请务必下载 GGUF 格式的模型文件。这是LM Studio原生支持的格式,它针对在CPU和GPU上高效运行进行了优化。其他格式如PyTorch的 .bin .safetensors 文件需要转换才能使用。

第三步:加载模型并启动本地服务器 在LM Studio中,切换到“本地服务器”标签页。在这里,你可以:

  1. 从左侧已下载的模型列表中选择一个。
  2. 在右侧配置服务器参数。最关键的是 端口号 ,默认是 1234 ,如果冲突可以修改。
  3. 点击“启动服务器”按钮。

此时,你应该在LM Studio的日志窗口中看到“Server is running on ...”的字样。这意味着一个兼容OpenAI API的HTTP服务已经在你的 localhost:1234 上运行起来了。你可以打开浏览器,访问 http://localhost:1234/v1/models ,如果返回一个JSON列表,里面包含你刚加载的模型信息,那就说明服务器启动成功。

3.2 初始化SDK:两种方式与配置详解

现在,我们转向JavaScript的世界。在你的Node.js或前端项目中,首先安装SDK:

npm install @lmstudio/sdk
# 或
yarn add @lmstudio/sdk
# 或
pnpm add @lmstudio/sdk

安装完成后,初始化客户端。 lmstudio-js 提供了两种初始化方式,适应不同场景。

方式一:默认初始化(针对本地开发) 这是最常见的情况,你的应用和LM Studio运行在同一台电脑上。

import LMStudioClient from '@lmstudio/sdk';

const client = new LMStudioClient({
  baseURL: 'http://localhost:1234/v1', // 默认值就是这个,可以不写
  // apiKey: 'not-needed', // 本地服务器通常不需要API密钥,可以省略或填任意值
});

这里 baseURL 指向了LM Studio本地服务器的API根路径。 apiKey 在本地环境下通常不是必须的,LM Studio的服务器默认不启用鉴权。为了安全,如果你在共享网络环境中使用,可以在LM Studio服务器设置中启用API密钥,并在这里配置。

方式二:通过环境变量配置(针对生产或灵活部署) 在实际项目中,硬编码配置不是好习惯。更推荐的方式是使用环境变量。

import LMStudioClient from '@lmstudio/sdk';

const client = new LMStudioClient({
  baseURL: process.env.LMSTUDIO_BASE_URL || 'http://localhost:1234/v1',
  apiKey: process.env.LMSTUDIO_API_KEY,
});

然后在你的 .env 文件中配置:

LMSTUDIO_BASE_URL=http://my-ai-server:8080/v1
LMSTUDIO_API_KEY=your-secret-key-here

这样做的好处是,你的代码无需修改,就可以通过改变环境变量来切换不同的LM Studio服务器实例(比如从本地开发机切换到内网中一台拥有高性能GPU的服务器)。

3.3 第一个对话程序:同步与流式响应

让我们写一个最简单的对话程序,感受一下SDK的用法。

同步请求(一次性获取完整回复)

async function askLocalModel(question) {
  try {
    const completion = await client.chat.completions.create({
      model: 'your-model-name', // 这里填写你在LM Studio中加载的模型名称
      messages: [
        { role: 'system', content: '你是一个乐于助人的AI助手。' },
        { role: 'user', content: question }
      ],
      max_tokens: 500,
      temperature: 0.7,
    });

    console.log('AI回复:', completion.choices[0].message.content);
    return completion.choices[0].message.content;
  } catch (error) {
    console.error('请求失败:', error);
  }
}

// 使用
await askLocalModel('请用JavaScript写一个快速排序函数。');

这段代码的结构对于用过OpenAI API的开发者来说再熟悉不过了。 model 参数必须与LM Studio服务器中加载的模型标识符匹配(通常就是模型文件名)。 messages 数组定义了对话历史, max_tokens 限制生成长度, temperature 控制随机性(0.0最确定,1.0最随机)。

流式请求(实现打字机效果) 流式响应是提升用户体验的关键,尤其对于生成较长文本时,用户不用等待全部生成完毕就能看到开头。

async function askLocalModelStream(question) {
  try {
    const stream = await client.chat.completions.create({
      model: 'your-model-name',
      messages: [
        { role: 'system', content: '你是一个乐于助人的AI助手。' },
        { role: 'user', content: question }
      ],
      max_tokens: 500,
      temperature: 0.7,
      stream: true, // 关键参数:启用流式输出
    });

    let fullResponse = '';
    console.log('AI回复(流式): ');
    for await (const chunk of stream) {
      const content = chunk.choices[0]?.delta?.content || '';
      process.stdout.write(content); // 逐块打印到控制台
      fullResponse += content;
    }
    console.log('\n--- 流结束 ---');
    return fullResponse;
  } catch (error) {
    console.error('请求失败:', error);
  }
}

这里的关键是将 stream 参数设为 true 。返回的 stream 是一个异步迭代器。每次迭代得到的 chunk 对象中, chunk.choices[0].delta.content 包含了最新生成的一小段文本。我们将其累加起来,就得到了完整回复。在前端浏览器中,你可以用类似的方式,将每一块内容实时追加到HTML元素中,实现流畅的打字机效果。

4. 高级功能与实战应用场景

4.1 超越简单对话:Completions与Embeddings

lmstudio-js 不仅支持Chat Completions(对话补全),还支持OpenAI API定义的其他端点,这大大扩展了其应用范围。

文本补全(Completions) 这个端点更适合传统的“提示-补全”模式,而不是多轮对话。例如,用于代码补全、文本续写等。

async function completeText(prompt) {
  const completion = await client.completions.create({
    model: 'your-model-name',
    prompt: prompt,
    max_tokens: 100,
    temperature: 0.5,
  });
  console.log(completion.choices[0].text);
}
// 使用:续写故事
await completeText('在一个遥远的星系,有一个程序员发现了一个bug...');

注意,这里使用的是 client.completions.create ,参数是 prompt ,而不是 messages 。很多开源模型在“补全”任务上训练得更好,这个接口给了你直接使用这种模式的机会。

文本嵌入(Embeddings) 这是构建AI应用的另一块基石。嵌入模型可以将一段文本(一个词、一句话、一篇文章)转换为一个高维度的数值向量(一组浮点数)。语义相近的文本,其向量在空间中的距离也更近。

async function getEmbedding(text) {
  const response = await client.embeddings.create({
    model: 'your-embedding-model-name', // 注意:需要加载专门的嵌入模型,如bge-small, all-MiniLM-L6-v2等
    input: text,
  });
  return response.data[0].embedding; // 返回一个浮点数数组
}

// 使用:计算两段文本的相似度
const vec1 = await getEmbedding('我喜欢编程');
const vec2 = await getEmbedding('Coding is my passion');
// 然后可以计算余弦相似度

有了嵌入向量,你就可以实现语义搜索、文本分类、聚类等高级功能。你需要先在LM Studio中加载一个嵌入模型(通常比对话模型小得多),然后在调用时指定正确的模型名称。

4.2 构建本地知识库问答系统(RAG雏形)

结合对话、嵌入以及一个向量数据库(如Chroma、LanceDB),你就可以构建一个简单的本地Retrieval-Augmented Generation(RAG)系统。其核心思想是:先从你的知识库(一堆文档)中检索出与用户问题最相关的片段,然后将这些片段作为上下文提供给大模型,让模型基于这些可靠的上下文生成答案,避免胡编乱造。

以下是简化的工作流程和代码示意:

  1. 知识库准备与嵌入 :将你的文档(如Markdown、PDF、TXT)切分成小块,对每一块调用嵌入API,得到向量,并存储到向量数据库中,同时保留原始文本。
  2. 用户查询 :当用户提问时,同样将问题转换为嵌入向量。
  3. 语义检索 :在向量数据库中搜索与问题向量最相似的几个文本块。
  4. 增强生成 :将检索到的文本块作为上下文,和用户问题一起构造一个详细的 system user 消息,发送给对话模型。
// 伪代码,展示核心逻辑
async function ragQuery(userQuestion) {
  // 1. 将用户问题转换为向量
  const queryVector = await getEmbedding(userQuestion);

  // 2. 从向量数据库检索最相关的3个文档片段
  const relevantChunks = await vectorDB.search(queryVector, { topK: 3 });
  const contextText = relevantChunks.map(chunk => chunk.text).join('\n---\n');

  // 3. 构造包含上下文的提示
  const messages = [
    {
      role: 'system',
      content: `请严格根据以下上下文信息回答问题。如果上下文不包含答案,请直接说“根据提供的资料,我无法回答这个问题”。\n\n上下文:\n${contextText}`
    },
    { role: 'user', content: userQuestion }
  ];

  // 4. 调用本地模型生成答案
  const completion = await client.chat.completions.create({
    model: 'your-model-name',
    messages: messages,
    temperature: 0.1, // 降低随机性,让答案更贴近上下文
  });

  return completion.choices[0].message.content;
}

这个方案将大模型的生成能力与你私有的、最新的知识结合起来,是构建企业级智能客服、内部知识助手的核心技术路径。 lmstudio-js 让这一切在本地环境中变得触手可及。

4.3 集成到现有框架:以LangChain为例

如果你已经在使用LangChain这类AI应用框架,集成 lmstudio-js (或者说LM Studio服务)会异常简单。LangChain内置了对“OpenAI兼容API”的支持。

import { ChatOpenAI } from '@langchain/openai';
import { HumanMessage } from '@langchain/core/messages';

// 将LM Studio本地服务视为一个OpenAI兼容的端点
const llm = new ChatOpenAI({
  openAIApiKey: 'not-needed', // 任意值
  configuration: {
    baseURL: 'http://localhost:1234/v1', // 指向LM Studio服务器
  },
  modelName: 'your-model-name', // 指定模型
  temperature: 0.7,
});

// 像使用OpenAI模型一样使用它
const response = await llm.invoke([
  new HumanMessage('你好,请介绍一下你自己。')
]);
console.log(response.content);

通过这种方式,你可以直接利用LangChain强大的链(Chain)、代理(Agent)和记忆(Memory)等抽象,快速构建复杂的AI工作流,而底层模型则运行在你本地的LM Studio上。这极大地提升了开发效率。

5. 性能调优、问题排查与实战心得

5.1 关键参数调优指南

调用大模型不是简单的“提问-回答”,生成参数的不同设置会极大影响输出结果的质量、速度和风格。以下是一些核心参数的实战心得:

  • temperature (温度,0.0-2.0) :控制输出的随机性。这是最重要的参数之一。

    • 0.0-0.3 :高度确定性输出。模型会选择概率最高的下一个词。适合需要精确、可靠答案的任务,如代码生成、事实问答、翻译。缺点是可能显得呆板、重复。
    • 0.7-0.9 :常用范围。在创造性和连贯性之间取得良好平衡。适合创意写作、头脑风暴、对话。
    • >1.0 :高随机性。输出可能变得天马行空甚至不合逻辑,仅用于需要极端创意的实验。
    • 我的经验 :对于技术问答,我通常从 0.1 开始;对于开放式聊天,从 0.8 开始。可以先设高一点,如果发现回答太散,再逐步调低。
  • max_tokens (最大生成长度) :限制模型单次生成的最大token数(约等于单词数)。

    • 设置过低,回答会被截断。设置过高,如果模型“啰嗦”,会浪费计算资源。
    • 技巧 :对于对话, 512 1024 通常足够。对于长文生成,可以设到 2000 或更高。 务必在 system 提示词中明确要求回答简洁 ,这比单纯依赖 max_tokens 更有效。
  • top_p (核采样,0.0-1.0) :与 temperature 类似,但方法不同。它从累积概率超过 p 的最小词集中采样。

    • top_p=0.9 意味着模型只考虑概率最高的、累积概率达到90%的那些词。
    • 通常** temperature top_p 不要同时调整**,选一个即可。社区经验是调整 temperature 更直观。如果使用 top_p ,通常设为 0.9 0.95
  • stream (流式输出) :务必设为 true 。除了提升用户体验,对于生成长文本,你可以中途检测到不想要的内容并提前中断,节省时间和算力。

  • stop (停止序列) :一个字符串数组。当模型生成的内容中包含其中任何一个序列时,生成会立即停止。

    • 非常有用!例如,在代码生成时,可以设置 stop: ['\n\n', '```'] ,让模型在生成完一个完整的代码块后自动停止。
    • 在问答对话中,可以设置 stop: ['用户:', 'Human:'] 来防止模型“角色扮演”过度,开始模拟用户提问。

5.2 常见错误与排查清单

在开发过程中,你肯定会遇到各种问题。下面是一个快速排查清单:

问题现象 可能原因 解决方案
连接被拒绝 ( ECONNREFUSED ) 1. LM Studio本地服务器未启动。
2. 端口号错误。
3. 防火墙/安全软件阻止。
1. 检查LM Studio“本地服务器”标签页是否显示“Server is running”。
2. 确认 baseURL 中的端口号(默认1234)与LM Studio设置一致。
3. 暂时关闭防火墙或添加例外规则。
404 Not Found API路径错误。 确保 baseURL /v1 结尾,例如 http://localhost:1234/v1
模型未找到 ( model not found ) 1. 请求的模型名称与LM Studio中加载的模型不匹配。
2. 模型未成功加载。
1. 访问 http://localhost:1234/v1/models 查看可用模型列表,使用返回的确切模型ID。
2. 在LM Studio中重新选择并加载模型。
响应速度极慢 1. 模型太大,硬件(特别是显存)不足。
2. 使用了CPU推理。
3. max_tokens 设置过高。
1. 换用更小的模型(如7B、3B参数)。
2. 在LM Studio服务器设置中,确保已启用GPU加速(如果有NVIDIA/AMD显卡)。
3. 降低 max_tokens ,使用流式输出以便提前中断。
生成内容胡言乱语或格式错误 1. temperature 设置过高。
2. 模型本身能力不足或未针对指令进行微调。
3. 提示词( system user )不清晰。
1. 将 temperature 降至0.5以下。
2. 换用知名的指令微调模型(如 -Instruct 后缀的模型)。
3. 优化你的 system 提示词,明确指令格式。例如:“你是一个JSON生成器,只输出有效的JSON,不要有任何解释。”
流式响应中断或不完整 网络不稳定或服务器端生成出错。 在客户端代码中添加错误监听和重试逻辑。使用 try...catch 包裹 for await 循环,并考虑在断开时重新连接。

5.3 实战心得与性能优化技巧

经过多个项目的实践,我总结出以下几点能显著提升开发体验和应用性能的心得:

1. 提示词工程是本地模型成功的关键 本地模型通常比GPT-4等顶级模型“笨”一些,对提示词更敏感。一个清晰的 system 提示词至关重要。要明确角色、任务格式和约束。例如:

  • :“帮我写代码。”
  • :“你是一个资深的JavaScript工程师。请为以下问题提供一个简洁、高效、带有注释的解决方案。只输出代码块,不要额外解释。”

2. 利用流式输出实现“思考”指示 在Web前端,当等待流式响应时,长时间没有新内容会让用户焦虑。一个技巧是,在收到第一个数据块之前,先在前端显示一个“正在思考...”的动画。这可以通过监听流式响应的第一个 chunk 来实现,用户体验会好很多。

3. 管理上下文长度 大模型有上下文窗口限制(如4K、8K、32K tokens)。 lmstudio-js 本身不管理历史对话。如果你构建多轮聊天应用,需要自己维护一个 messages 数组。务必注意数组长度,当对话轮数太多时,需要主动丢弃最早的历史消息(或进行摘要),以防止超出上下文限制导致模型失忆或报错。

4. 错误处理与重试 网络和本地推理都可能不稳定。一定要用 try...catch 包裹API调用。对于非致命错误(如临时网络波动),可以实现简单的指数退避重试机制。

async function callWithRetry(prompt, retries = 3) {
  for (let i = 0; i < retries; i++) {
    try {
      return await client.chat.completions.create({...});
    } catch (error) {
      if (i === retries - 1) throw error; // 最后一次重试后仍失败,抛出错误
      console.warn(`调用失败,${i+1}秒后重试...`, error.message);
      await new Promise(resolve => setTimeout(resolve, 1000 * (i + 1))); // 指数退避等待
    }
  }
}

5. 硬件是瓶颈,模型选择是艺术 在个人电脑上运行大模型,硬件(尤其是GPU显存)是最大的限制。一个经验法则是:量化后的7B参数模型,需要大约4-8GB显存才能流畅运行。如果没有独立显卡,纯CPU推理会非常慢。因此, 根据你的硬件能力选择模型 是第一原则。不要盲目追求大模型,小而精的模型(如Phi-3, Qwen2.5-Coder)在特定任务上可能表现更出色、速度更快。

lmstudio-js 这个项目,就像一把精心打造的钥匙,为你打开了本地大模型应用开发的大门。它将复杂的本地模型服务封装成了一个简单、标准的接口,让前端和全栈开发者能够以极低的门槛,将最前沿的AI能力集成到自己的创意和产品中。从保护隐私的个人笔记助手,到离线可用的代码补全工具,再到企业内部的知识管理引擎,可能性只受限于你的想象力。开始动手吧,从加载第一个模型,到写出第一行调用代码,你会发现,强大的AI,真的可以运行在你自己的电脑里。

Logo

免费领 50 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐