1. uv 是什么
uv 是由 Astral 团队开发的 Python 项目和包管理工具。它把 Python 版本、虚拟环境、依赖安装和项目运行这些原本分散的步骤,放进一套统一的命令中。
在 LangChain Python 项目里,uv 主要负责四件事:
- 安装并切换 Python 版本;
- 为项目创建隔离的虚拟环境;
- 声明、安装和锁定项目依赖;
- 在项目环境中运行 Python 命令。
我们可以利用 uv 帮助我们把 Python 项目准备好。后面的文章会在 FastAPI 提供的 HTTP 服务基础上接入 LangChain,并使用 DeepSeek V4 Flash 运行模型和 Agent 案例。
2. 安装 uv
macOS 或 Linux 在终端执行官方安装脚本
1curl -LsSf https://astral.sh/uv/install.sh | sh
安装完成后,重新打开终端,或者按照安装程序的提示重新加载当前 shell 的环境变量。
Windows 系统在 PowerShell 中执行:
1irm https://astral.sh/uv/install.ps1 | iex
3. 验证安装
执行下面的命令查看 uv 是否已经加入当前终端的 PATH:
1uv --version
看到版本号就说明安装成功。如果终端提示找不到 uv,先重新打开终端;仍然无法找到时,再检查安装程序输出的目录是否已经加入 PATH。
4. 初始化第一个 FastAPI + LangChain 项目
这里不把 LangChain 当成一个脱离服务端的脚本来运行,而是先创建一个 FastAPI 项目,再把 LangChain 的模型和 Agent 逻辑放进接口中。
uv init 会创建项目目录、pyproject.toml 和基础的 Python 文件:
1uv init fastapi-langchain2cd fastapi-langchain
为项目安装一个明确的 Python 版本:
1uv python install 3.12
然后用这个版本创建虚拟环境:
1uv venv --python 3.12
在 macOS 或 Linux 中,如果希望显式激活虚拟环境,可以执行:
1source .venv/bin/activate
Windows PowerShell 对应的命令是:
1.venv\Scripts\Activate.ps1
激活不是必须的。后续使用 uv run 执行命令时,uv 会自动选择当前项目的虚拟环境:
1uv run python --version
5. 安装 FastAPI 和 LangChain 依赖
FastAPI 负责 HTTP 路由、请求校验和响应;FastAPI CLI 会调用 Uvicorn 启动 ASGI 服务;LangChain 则负责模型调用和 Agent 编排。把它们安装在同一个项目中,才能形成后续案例使用的完整运行骨架:
1uv add "fastapi[standard]" langchain langchain-openai
uv add 会更新 pyproject.toml,并生成或更新 uv.lock。其中 pyproject.toml 声明项目需要哪些依赖,uv.lock 记录具体解析出的版本,方便其他人恢复一致的开发环境。
安装完成后,用项目环境执行导入检查:
1uv run python -c 'import fastapi, langchain, langchain_openai; print(fastapi.__version__, langchain.__version__)'
6. 写下第一个 FastAPI 接口
在项目根目录创建 main.py。这个接口接收用户问题,再把问题交给 LangChain Agent,最后将 Agent 的消息结果转换成 JSON:
01import os0203from fastapi import FastAPI04from pydantic import BaseModel05from langchain.agents import create_agent06from langchain_openai import ChatOpenAI0708app = FastAPI()0910agent = create_agent(11model=ChatOpenAI(12model=os.environ["DEEPSEEK_MODEL"],13api_key=os.environ["DEEPSEEK_API_KEY"],14base_url=os.environ.get("DEEPSEEK_BASE_URL", "https://api.deepseek.com"),15),16system_prompt="你是一名简洁、可靠的 Python 学习助手。",17)1819class ChatRequest(BaseModel):20question: str2122@app.post("/chat")23async def chat(request: ChatRequest) -> dict[str, str]:24result = await agent.ainvoke({25"messages": [{"role": "user", "content": request.question}],26})27return {"answer": result["messages"][-1].content}
这里的 app 是 FastAPI 应用,agent 是 LangChain 的 Agent。DeepSeek 提供 OpenAI 兼容的 Chat Completions 接口,所以这里使用 ChatOpenAI 作为 LangChain 的模型封装,并通过 base_url 将请求发送到 DeepSeek。FastAPI 只负责接收和返回 HTTP 数据,模型选择、提示词和 Agent 执行仍然由 LangChain 处理。
7. 使用 .env 管理模型配置
在项目根目录创建 .env,把 DeepSeek V4 Flash 的配置集中放在这个文件中:
1DEEPSEEK_MODEL=deepseek-v4-flash2DEEPSEEK_BASE_URL=https://api.deepseek.com3DEEPSEEK_API_KEY=your-api-key
如果要把项目提交到 Git 仓库,可以创建一个不包含真实密钥的 .env.example,并在 .gitignore 中忽略 .env:
1.env2.env.*3!.env.example
.env 只保留在本机,.env.example 只用于说明需要哪些变量。使用中转服务时,将 DEEPSEEK_BASE_URL 改成中转站提供的 OpenAI 兼容地址即可。
启动服务时,显式告诉 uv 读取这个文件:
1uv run --env-file .env fastapi dev
Windows PowerShell 使用同一条命令即可:
1uv run --env-file .env fastapi dev
uv 会在启动子进程前读取 .env,所以 Python 代码仍然可以通过 os.environ["DEEPSEEK_MODEL"] 等方式访问配置,不需要在代码中手动解析文件。也可以让 uv 自动发现项目中的 .env,但显式使用 --env-file 更容易看出服务依赖哪个配置文件。
FastAPI CLI 默认以开发模式启动服务,自动开启代码变更重载,并在项目根目录自动寻找 main.py 中名为 app 的 FastAPI 应用。如果以后调整了文件结构,也可以显式指定入口,例如 uv run --env-file .env fastapi dev --entrypoint main:app。
服务启动后,用另一个终端发送请求:
1curl -X POST http://127.0.0.1:8000/chat \2-H "Content-Type: application/json" \3-d '{"question":"请用一句话介绍 LangChain。"}'
调通之后,说明我们的环境已经准备好了。