1. 引言
前面两篇文章已经完成了本地开发环境的搭建、项目创建以及依赖安装。本篇将进入实战核心环节------让 AI 智能体真正"开口说话"。
我们将完成以下四件事:
- 创建
.env配置文件,统一管理 DeepSeek 与本地大模型的密钥和地址 - 创建
config/settings.py,用 Pydantic 优雅地加载配置 - 创建大模型客户端,同时支持 DeepSeek API 与本地模型
- 编写调用文件,通过 FastAPI 接口对外提供问答能力
2. 创建 .env 配置文件
在项目根目录下创建 .env 文件,内容如下:
bash
# DeepSeek 配置
DEEPSEEK_API_URL="https://api.deepseek.com"
DEEPSEEK_API_KEY="sk-xxx"
DEEPSEEK_API_MODEL="deepseek-chat"
# 其他大模型配置(本地部署)
LLM_API_URL="http://192.xxx.xxx.xxx"
LLM_API_KEY="sk-xxx"
LLM_API_MODEL="llm-chat"
注意:请将
sk-xxx替换为你自己的真实密钥。.env文件不要提交到 Git 仓库,建议在.gitignore中加入.env。
3. 创建 config/settings.py
在项目目录下创建 config 包,并新建 settings.py 文件:
python
import os
from typing import Optional
from dotenv import load_dotenv
from pydantic_settings import SettingsConfigDict, BaseSettings
# 加载环境配置
load_dotenv()
class Setting(BaseSettings):
model_config = SettingsConfigDict(validate_default=False)
# deepseek 模型配置
deepseek_api_url: str
deepseek_api_key: str
deepseek_api_model: str
# 大模型配置
llm_api_url: str
llm_api_key: str
llm_api_model: str
setting = Setting()
这里使用 pydantic-settings 自动从 .env 读取配置,字段名与 .env 中的变量名一一对应,无需手动 os.getenv。
4. 创建大模型客户端
新建 llm_client.py 文件,统一封装 DeepSeek 与本地模型的客户端:
python
from openai import OpenAI, AsyncOpenAI
from config.settings import setting
# 通用的人 prompt 前缀
PROMPT_PREFIX = "现在是{}年{}月{}日,你的名字叫智能问答助手。是一个基于 **大语言模型 + LangGraph 多智能体编排 + RAG 知识库检索** 的智能问答平台"
def build_prompt(user_question: str) -> str:
"""拼接带时间上下文的完整 prompt"""
from datetime import datetime
now = datetime.now()
return PROMPT_PREFIX.format(now.year, now.month, now.day) + "\n\n用户问题:" + user_question
# 创建大模型客户端
llm_client = OpenAI(api_key=setting.llm_api_key, base_url=setting.llm_api_url)
deepseek_client = OpenAI(api_key=setting.deepseek_api_key, base_url=setting.deepseek_api_url)
deepseek_async_client = AsyncOpenAI(api_key=setting.deepseek_api_key, base_url=setting.deepseek_api_url)
5. 编写模型调用文件
新建 model_caller.py,封装同步与异步的调用逻辑:
python
from config.settings import setting
from llm_client import deepseek_client, deepseek_async_client, llm_client, build_prompt
def call_deepseek(prompt: str) -> str:
"""同步调用 DeepSeek"""
resp = deepseek_client.chat.completions.create(
model=setting.deepseek_api_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.01,
max_tokens=300,
)
return resp.choices[0].message.content
async def call_deepseek_async(prompt: str) -> str:
"""异步调用 DeepSeek"""
resp = await deepseek_async_client.chat.completions.create(
model=setting.deepseek_api_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.01,
max_tokens=300,
)
return resp.choices[0].message.content
def call_local_llm(prompt: str) -> str:
"""调用本地大模型"""
resp = llm_client.chat.completions.create(
model=setting.llm_api_model,
messages=[{"role": "user", "content": prompt}],
temperature=0.01,
max_tokens=300,
)
return resp.choices[0].message.content
if __name__ == "__main__":
# 简单自测
question = "你好,请介绍一下你自己"
print("DeepSeek 回复:", call_deepseek(build_prompt(question)))
6. 通过 FastAPI 提供问答接口
新建 main.py,用 FastAPI 暴露一个 /chat 接口:
python
from fastapi import FastAPI
from pydantic import BaseModel
from model_caller import call_deepseek, call_deepseek_async, call_local_llm, build_prompt
app = FastAPI(title="AI 智能问答助手")
class ChatRequest(BaseModel):
question: str
use_deepseek: bool = True # True 用 DeepSeek,False 用本地模型
@app.post("/chat")
async def chat(req: ChatRequest):
prompt = build_prompt(req.question)
if req.use_deepseek:
answer = await call_deepseek_async(prompt)
else:
answer = call_local_llm(prompt)
return {"question": req.question, "answer": answer}
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
启动服务:
bash
uvicorn main:app --reload --port 8000
测试接口:
bash
curl -X POST http://localhost:8000/chat \
-H "Content-Type: application/json" \
-d '{"question": "你好,你是谁?", "use_deepseek": true}'
7. 总结
本篇完成了从配置到调用的完整链路:
.env统一管理密钥与地址settings.py自动加载配置- 客户端同时支持 DeepSeek 与本地模型
- FastAPI 对外提供
/chat接口
下一步可以接入 LangGraph 多智能体编排与 RAG 知识库检索,让智能体真正具备"思考"和"检索"能力。