Ollama本地部署LLM模型

122 阅读2分钟

引言

在当今的人工智能领域,大语言模型(LLM)的应用越来越广泛。然而,传统的API调用方式存在一些局限性,如传输速度慢、延迟高以及用户数据暴露的风险。为了解决这些问题,我们可以选择本地部署一个LLM模型,比如Ollama,它允许用户在本地运行模型,从而确保了数据的安全性和隐私。

Ollama简介

Ollama是一个支持本地部署的语言模型平台,其模型参数是在Ollama的服务器上训练的,但实际使用时,用户的交互数据不会被上传到Ollami的服务器,保证了数据的私密性和安全性。

部署步骤

  1. 选择模型:首先,在Ollama中找到适合您需求的模型。根据您的硬件条件(尤其是显卡),可以选择不同大小的模型,例如deepseek-r1:1.5b或8b等。5b或8b这样的术语通常指的是模型中的参数数量。这里的“b”是英文单词“billion”的缩写,意味着十亿。因此,当提到一个模型有1.5b的参数时,指的是这个模型包含了大约15亿个参数。 参数是在训练过程中通过学习数据集中的模式而调整得到的值。模型的参数量通常与其复杂度和能力成正比:参数越多,模型能够捕捉到的数据特征就越复杂,理论上可以处理的任务也越复杂、精细。

  2. 启动模型:通过终端输入相应的命令来启动模型。例如,对于deepseek-r1:1.5b模型,可以输入ollama run deepseek-r1:1.5b来启动。

image.png 3. 查看帮助文档:如果您对如何操作不太熟悉,可以通过ollama help获取详细的指令说明。

image.png

前后端交互

  • 前端请求发送:前端应用通过HTTP请求将用户的问题发送给后端。这里使用了Axios库进行异步通信。

    axios.post('http://localhost:3000/chat', {
      role: 'user',
      content: value // 用户输入的内容
    }).then(res => {
      setList(prev => [...prev, {
        role: 'bot',
        content: res.data.data // 返回机器人的回答
      }])
      inputRef.current.value = ''
    })
    
  • 处理跨域问题:为了确保前后端能够顺利通信,需要在后端设置CORS策略。

    app.use(async (ctx, next) => {
      ctx.set('Access-Control-Allow-Origin', '*')
      ctx.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
      ctx.set('Access-Control-Allow-Headers', 'Content-Type, Authorization')
      if (ctx.method === 'OPTIONS') {
        ctx.status = 204
        return
      }
      await next()
    })
    
  • 后端接收与响应:后端接收到前端发来的请求后,会调用本地部署的LLM模型,并将模型返回的结果发送回前端。

    router.post('/chat', async(ctx) => {
      const message = ctx.request.body
      console.log(message);
      const data = {
        model: 'deepseek-r1:1.5b',
        role: 'user',
        messages: [message],
        stream: false,
      }
      const res = await axios.post('http://localhost:11434/api/chat', data)
      console.log(res.data.message.content);
      ctx.body = {
        code: 200,
        data: res.data.message.content
      }
    })
    

结果渲染

最后,前端接收到后端返回的数据,并将其渲染到页面上,让用户看到对话结果。

list.map(item => (
  <div key={item.content}>
    {item.role === 'user' ? 
      (<div className="user question item">me: <span>{item.content}</span></div>) : 
      (<div className="bot answer item">AI:<span>{item.content}</span></div>)
    }
  </div>
))

效果

屏幕录制 2025-08-08 200811.gif