本地 LLM API Python 项目分步指南
分步过程
需要Python 3.9 或更高版本。
安装 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 中,您可以通过以下方式执行此操作:
- 按Command + Shift + P打开命令面板。
- 键入或选择Python:Create Environment,然后键入或选择Venv。
- 选择合适的Python版本(我选择了Python 3.11)。
- 现在应该提示您选择之前创建的“requirements.txt”文件来安装列出的依赖项,这至关重要,因为我们的 Python 程序需要 FastAPI、Uvicorn 和 Requests。
如果最后一步不起作用,请尝试在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 # Added for environment variable usage app = FastAPI() class Prompt(BaseModel): prompt: str @app.post("/generate") def generate_text(prompt: Prompt): try: # Use environment variables for host and model, with fallbacks 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", # f-string for host json={"model": ollama_model, "prompt": prompt.prompt}, # Use ollama_model stream=True, timeout=120 # Give model time to respond ) response.raise_for_status() # Raise an exception for HTTP errors (4xx or 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}") # Added for debugging 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__": # For development, reload=True can be useful. For production, use reload=False. uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=False) |
app = FastAPI()
创建由 REST 服务提供支持的 Web API,一旦执行 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)
它将提示发送到 Ollama 获取的指定本地 LLM。重要的是,在这里你必须确保模型名称在你下载的模型名称中(在我的情况下是)。你可以在终端中"llama3:latest"
输入命令来检查机器上下载的本地模型的名称。 - 最后,此代码读取流响应并以清晰的格式返回。
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 文件后,点击“运行”图标或python main.py
在终端中运行。你应该会在 IDE 的输出中看到类似这样的内容:
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) |
这意味着一件事:REST 服务器已启动并正在运行,并且可以通过 http://127.0.0.1:8000/docs访问该服务。在浏览器上打开此 URL,如果一切顺利,您将看到如下所示的 FastAPI 文档界面:
你离获得本地法学硕士(LLM)学位已经不远了:太令人兴奋了!在显示的界面中,点击方框旁边的箭头POST/generate
将其展开,然后点击“试用”按钮。
输入你选择的提示符,向 LLM 提出一些问题。你必须使用专用的 JSON 格式参数值来执行此操作,如下所示,通过替换默认提示符:"string"
。例如:
点击“执行”按钮后,几秒钟后你可以通过稍微向下滚动来获得响应:
恭喜,您已设置好自己的本地 LLM API!