【人工智能】一文教你用Python创建你的第一个LLM API项目

【精选优质专栏推荐】


每个专栏均配有案例与图文讲解,循序渐进,适合新手与进阶学习者,欢迎订阅。

在这里插入图片描述

前言

随着大型语言模型(LLM)的普及,越来越多的开发者希望在本地环境中运行这些模型,而无需依赖云端服务。本教程旨在指导读者从零开始,使用 Python 和 FastAPI 搭建一个可本地运行的 LLM API。

通过以下步骤,你将能够:

  • 在本地安装并配置 Ollama:一个用户友好的框架,可运行 LLaMA、Gemma 或 Mistral 等开源 LLM,并提供基本接口。

  • 使用 FastAPI 构建轻量且稳健的 REST API,通过 HTTP 请求实现用户与模型的交互。

  • 通过本地端点发送提示并获取几乎实时的 LLM 响应,无需依赖云服务提供商。

正文

本教程假设你的计算机已安装 Python 3.9 或更高版本,并具备基础至中等的 Python 知识。基于此,代码设计用于在诸如 Visual Studio Code 等 IDE 中创建的 Python 项目中实现——注意,这不是在线笔记本友好的教程,因为我们需要在本地下载并使用 LLM。

本地安装 Ollama 并下载 LLM

根据操作系统的不同,可从 Ollama 官网下载相应版本。下载并启动后,打开终端并输入以下命令:

ollama run llama3

该命令将在本地拉取(下载)一个 Llama 3 LLM——截至撰写本文时,默认下载的模型标记为 llama3:latest。首次下载可能耗时较长,具体取决于网络带宽。下载完成后,终端将自动启动一个对话助手,你即可开始交互。

不过,我们将采用不同方法,展示如何构建基于 Python 的本地 LLM API。为此,请切换至 IDE。

在 VS Code(或其他 IDE)中创建 Python 项目

假设使用 VS Code(其他 IDE 操作略有差异),在文件目录中创建新项目文件夹,命名为 local-llm-api 或类似名称。

在该文件夹内创建两个文件:main.py 和 requirements.txt。Python 文件暂时留空,在 requirements.txt 中添加以下内容并保存:

fastapi
uvicorn
requests

使用本地 LLM 时,建议设置虚拟环境,以隔离依赖、避免库版本冲突,并保持开发环境整洁。在 VS Code 中操作如下:

1.按 Command + Shift + P 打开命令面板。
2.输入或选择 Python: Create Environment,然后选择 Venv。
3.选择合适的 Python 版本(本文示例为 Python 3.11)。
4.系统会提示选择之前创建的 requirements.txt 安装依赖,这一步非常重要,因为 Python 程序运行需要 FastAPI、Uvicorn 和 Requests。
5.若最后一步无法执行,可在 IDE 终端中运行:

pip install fastapi uvicorn requests

主 Python 程序

回到之前创建的空 main.py 文件,添加以下代码:

from fastapi import FastAPI
from pydantic import BaseModel
import requests
import json
import uvicorn
import os  # 为使用环境变量添加

app = FastAPI()

class Prompt(BaseModel):
    prompt: str

@app.post("/generate")
def generate_text(prompt: Prompt):
    try:
        # 使用环境变量获取主机和模型名,若无则使用默认值
        ollama_host = os.getenv("OLLAMA_HOST", "http://localhost:11434")
        ollama_model = os.getenv("OLLAMA_MODEL", "llama3:latest")

        response = requests.post(
            f"{ollama_host}/api/generate",  # 主机地址
            json={"model": ollama_model, "prompt": prompt.prompt},  # 使用 ollama_model
            stream=True,
            timeout=120  # 给模型响应时间
        )
        response.raise_for_status()  # 对 HTTP 错误 (4xx 或 5xx) 抛出异常

        output = ""
        for line in response.iter_lines():
            if line:
                data = line.decode("utf-8").strip()
                if data.startswith("data: "):
                    data = data[len("data: "):]
                if data == "[DONE]":
                    break
                try:
                    chunk = json.loads(data)
                    output += chunk.get("response") or chunk.get("text") or ""
                except json.JSONDecodeError:
                    print(f"Warning: Could not decode JSON from line: {data}")  # 调试用
                    continue

        return {"response": output.strip() or "(Empty response from model)"}

    except requests.RequestException as e:
        return {"error": f"Ollama request failed: {str(e)}"}

if __name__ == "__main__":
    # 开发时 reload=True 有用,生产环境建议 reload=False
    uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=False)

关键代码解析:

  • app = FastAPI():创建 Web API,通过 REST 服务启动 Python 程序后,监听并处理请求(提示)并调用本地 LLM。

  • class Prompt(BaseModel): 和 prompt: str:定义 JSON 输入模式,用于向 LLM 提供提示信息。

  • @app.post(“/generate”) 与 def generate_text(prompt: Prompt)::定义 API 端点函数,用于发送提示并获取模型响应。

核心请求代码:

response = requests.post(
    "http://localhost:11434/api/generate",
    json={"model": "llama3:latest", "prompt": prompt.prompt},
    stream=True,
    timeout=120
)

1.代码将提示发送至 Ollama 拉取的本地 LLM。
2.模型名称必须为已下载的本地模型(示例为 “llama3:latest”)。可在终端输入 ollama list 查看本地模型列表。

最后,程序读取流式响应并返回可读格式:

for line in response.iter_lines():
    ...
    chunk = json.loads(data)
    output += chunk.get("response") or chunk.get("text") or ""

return {"response": output.strip()}

运行与测试 API

保存 Python 文件后,点击 Run 图标或在终端运行 python main.py。IDE 输出中应显示如下信息:

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

这表示 REST 服务器已启动,可通过以下 URL 访问服务:

http://127.0.0.1:8000/docs

在浏览器中打开该 URL,若一切正常,将显示 FastAPI 文档界面,如下所示:

在这里插入图片描述

在界面中,点击 POST /generate 框旁的箭头展开,然后点击 Try it out 按钮。

在此输入自定义提示以向 LLM 提问。必须使用专门的 JSON 格式参数,将默认提示 “string” 替换为你的内容。例如:

在这里插入图片描述

点击 Execute 按钮后,几秒钟内向下滚动即可查看响应:

在这里插入图片描述

此时,我们已成功搭建自己的本地 LLM API。

在此基础上,可能的改进方向包括:

  • 构建前端界面以调用基于 FastAPI 的 API,例如使用 Streamlit;
  • 还可尝试使用微调模型以满足定制化或特定领域的需求,如市场营销、保险、物流等。

结语

本文逐步展示了如何搭建并运行首个本地大型语言模型 API,使用 Ollama 下载的本地模型,并通过 FastAPI 提供基于 REST 服务的快速模型推理接口。整个过程均在本地 IDE 中运行 Python 程序完成,无需依赖云端服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值