InternLM2-Chat-1.8B开源大模型教程:Ollama部署+FastAPI封装RESTful接口
想快速体验一个功能强大、支持超长对话的开源大模型吗?今天,我们就来手把手教你部署【书生·浦语】的InternLM2-Chat-1.8B模型,并用一个简单的Web接口把它包装起来,让你能像调用在线API一样使用它。
InternLM2-Chat-1.8B是一个拥有18亿参数的轻量级对话模型,它最大的亮点是能有效处理长达20万字符的上下文,这意味着你可以和它进行非常长的、连贯的对话。对于个人学习、项目原型开发或者轻量级应用来说,它是一个非常理想的选择。
本教程将分为两个核心部分:首先,我们会利用Ollama这个强大的工具,一键式地拉取并运行模型;然后,我们将使用Python的FastAPI框架,快速构建一个RESTful API服务,让你可以通过HTTP请求来调用模型。整个过程力求清晰、直接,即使你之前没有太多部署经验,也能轻松跟上。
1. 环境准备与Ollama快速部署
在开始之前,我们需要一个可以运行Ollama的环境。Ollama极大地简化了大型语言模型的本地部署流程,你无需关心复杂的依赖和配置。
1.1 安装Ollama
Ollama支持多个操作系统。这里以Linux/macOS为例,通过命令行安装最为便捷。
打开你的终端,执行以下命令:
curl -fsSL https://ollama.com/install.sh | sh安装完成后,运行ollama --version来验证是否安装成功。你应该能看到类似ollama version 0.1.xx的输出。
1.2 拉取并运行InternLM2-Chat-1.8B模型
Ollama安装好后,拉取模型就像下载一个软件包一样简单。在终端中执行:
ollama pull internlm2:1.8b这个命令会从Ollama的模型库中下载InternLM2-Chat-1.8B模型。下载时间取决于你的网络速度,模型大小约3.5GB。
下载完成后,你可以立即在命令行中与模型交互:
ollama run internlm2:1.8b执行后,你会看到>>>提示符,这时就可以直接输入问题与模型对话了。例如,输入“用Python写一个快速排序函数”,看看它的表现。要退出对话,可以输入/bye。
至此,模型的本地部署已经完成。但命令行交互的方式不适合集成到其他应用中,接下来我们把它变成一个Web服务。
2. 使用FastAPI构建RESTful API接口
为了让其他程序或前端页面能够方便地调用模型,我们需要一个桥梁。FastAPI是一个现代、快速(高性能)的Python Web框架,非常适合构建API。我们将用它来创建一个服务,接收HTTP请求,调用Ollama模型,并返回结果。
2.1 创建项目环境与安装依赖
首先,为我们的项目创建一个干净的目录,并建立虚拟环境。
mkdir internlm2-api && cd internlm2-api python -m venv venv激活虚拟环境:
- Linux/macOS:
source venv/bin/activate - Windows:
venv\Scripts\activate
激活后,你的命令行提示符前会出现(venv)字样。接着安装必要的Python包:
pip install fastapi uvicorn requestsfastapi: 我们的Web框架。uvicorn: 一个轻量级的ASGI服务器,用于运行FastAPI应用。requests: 用于在Python代码中向Ollama的本地API发送HTTP请求。
2.2 编写核心API服务代码
在项目根目录下,创建一个名为main.py的文件,并写入以下内容:
from fastapi import FastAPI, HTTPException from pydantic import BaseModel import requests import json # 初始化FastAPI应用 app = FastAPI(title="InternLM2-Chat-1.8B API", description="一个基于Ollama部署的InternLM2大模型RESTful接口") # 定义请求体的数据模型 class ChatRequest(BaseModel): prompt: str # 用户输入的提示词 model: str = "internlm2:1.8b" # 默认模型,可扩展支持其他模型 stream: bool = False # 是否使用流式输出(本例先实现非流式) # Ollama本地API的地址 OLLAMA_API_URL = "http://localhost:11434/api/generate" @app.post("/v1/chat/completions") async def chat_completion(request: ChatRequest): """ 处理聊天补全请求。 接收用户提示,转发给Ollama,并返回模型生成的结果。 """ # 准备发送给Ollama的请求数据 payload = { "model": request.model, "prompt": request.prompt, "stream": request.stream } try: # 向Ollama本地服务发送POST请求 response = requests.post(OLLAMA_API_URL, json=payload, timeout=60) response.raise_for_status() # 如果响应状态码不是200,抛出异常 # 解析Ollama返回的JSON数据 result = response.json() # 从响应中提取模型生成的回复文本 # Ollama的响应结构是 {"model": "...", "response": "...", ...} model_reply = result.get("response", "").strip() # 构建一个类似于OpenAI API格式的返回结构,方便客户端适配 return { "id": f"chatcmpl-{hash(request.prompt)}", # 生成一个简单的唯一ID "object": "chat.completion", "created": 0, # 时间戳,此处简化 "model": request.model, "choices": [{ "index": 0, "message": { "role": "assistant", "content": model_reply }, "finish_reason": "stop" }], "usage": { "prompt_tokens": 0, # 实际应用中需要计算,此处简化 "completion_tokens": 0, "total_tokens": 0 } } except requests.exceptions.ConnectionError: raise HTTPException(status_code=503, detail="无法连接到Ollama服务,请确保Ollama正在运行。") except requests.exceptions.Timeout: raise HTTPException(status_code=504, detail="模型响应超时,请稍后重试或简化提示。") except Exception as e: raise HTTPException(status_code=500, detail=f"服务器内部错误: {str(e)}") @app.get("/health") async def health_check(): """健康检查端点,用于验证服务是否正常运行。""" try: # 简单检查Ollama服务是否可访问 resp = requests.get("http://localhost:11434/api/tags", timeout=5) if resp.status_code == 200: return {"status": "healthy", "ollama": "running"} else: return {"status": "degraded", "ollama": "unreachable"} except: return {"status": "unhealthy", "ollama": "not running"} if __name__ == "__main__": import uvicorn # 启动服务,监听在本机的8000端口 uvicorn.run(app, host="0.0.0.0", port=8000)代码关键点解释:
- 数据模型 (
ChatRequest):我们使用Pydantic的BaseModel来定义客户端应该发送什么样的数据。这确保了输入数据的有效性,并自动生成API文档。 - 核心接口 (
/v1/chat/completions):这是一个POST接口。它接收JSON格式的请求体,其中包含用户的提问(prompt)。然后,它把这个提问转发给运行在本机11434端口的Ollama服务。 - 错误处理:代码包含了基本的错误处理,比如网络连接失败、请求超时等,并返回清晰的错误信息。
- 响应格式:我们模仿了OpenAI Chat Completion API的返回格式。这样做的好处是,许多现有的客户端库或代码可以几乎无缝地切换到我们这个本地服务。
- 健康检查 (
/health):这是一个简单的GET接口,用于监控服务状态,在部署到生产环境时非常有用。
2.3 启动并测试API服务
确保你的Ollama服务正在运行(即ollama run internlm2:1.8b在另一个终端窗口运行着,或者Ollama后台服务已启动)。
然后,在我们项目的虚拟环境中,运行FastAPI应用:
python main.py你会看到类似Uvicorn running on http://0.0.0.0:8000的输出,说明服务已经启动。
现在,打开另一个终端窗口,我们可以用curl命令来测试API:
curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ -d '{ "prompt": "请用简单的语言解释一下什么是机器学习?" }'如果一切正常,你将收到一个JSON格式的响应,其中choices[0].message.content字段就是模型生成的关于机器学习的解释。
你也可以直接在浏览器中访问http://localhost:8000/docs,FastAPI会自动为你生成一个交互式的API文档页面(Swagger UI),你可以在这里直接点击“Try it out”来测试接口,非常方便。
3. 进阶使用与实用技巧
基本的API跑通后,我们可以考虑如何让它更实用、更强大。
3.1 实现流式输出 (Streaming)
上面的例子是等模型全部生成完再一次性返回。对于长文本,用户等待体验不好。流式输出可以像打字机一样,逐字或逐句地返回结果。
修改main.py中的/v1/chat/completions接口,支持流式响应需要用到FastAPI的StreamingResponse。同时,我们需要处理Ollama的流式响应。这里给出一个简化版的流式实现思路:
- 在请求中设置
"stream": True。 - 使用
requests.post(..., stream=True)来获取Ollama的流式响应。 - 创建一个生成器函数,逐块读取Ollama的响应,并按照特定格式(如Server-Sent Events)yield数据块。
- 用
StreamingResponse包装这个生成器。
由于代码较长,核心逻辑是循环读取response.iter_lines(),解析每一行JSON,提取response字段,并以data: {...}\n\n的格式发送给客户端。
3.2 添加对话历史上下文
目前的接口只处理单轮对话。要让模型记住之前的对话,需要在请求中携带历史消息。修改ChatRequest模型,增加一个messages字段(列表格式,包含role和content),然后在转发给Ollama前,将messages列表格式化成模型能接受的提示字符串。InternLM2-Chat模型通常使用类似<|im_start|>user\n...<|im_end|>\n<|im_start|>assistant\n...的格式。
3.3 配置与安全增强
- 环境变量:将模型名称、Ollama地址、服务器端口等配置项移到环境变量或配置文件中,提高灵活性。
- API密钥认证:在生产环境中,你应该为API添加认证。FastAPI可以很方便地集成OAuth2、JWT等认证方式。一个简单的方法是在请求头中检查一个预设的API Key。
- 跨域资源共享 (CORS):如果你的前端页面部署在不同的域名或端口下,需要在FastAPI中启用CORS中间件。
4. 总结
通过本教程,我们完成了一个从零到一的实践:
- 部署模型:利用Ollama,我们几乎零配置地就在本地运行起了InternLM2-Chat-1.8B这个大模型。
- 封装服务:使用FastAPI,我们快速构建了一个标准化的RESTful API,将命令行模型变成了一个可通过网络调用的服务。
- 测试验证:我们通过curl和交互式文档测试了接口,确保其工作正常。
这个“Ollama + FastAPI”的组合,为你提供了一个极其灵活的基础架构。你现在可以:
- 用任何编程语言(Python, JavaScript, Go等)编写程序来调用这个本地大模型。
- 开发带有图形界面的桌面或Web应用。
- 将其作为微服务,集成到更复杂的业务系统中。
最重要的是,这一切都在你的本地或私有服务器上完成,保证了数据的私密性和使用的成本可控。希望这个教程能成为你探索和利用开源大模型世界的一个坚实起点。动手试试吧,下一个AI应用创意或许就由此诞生。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。