LLM API 接入

接入大模型的几种主流方式:OpenAI、硅基流动(国内镜像)、Anthropic Claude、Ollama 本地。


接入方式总览

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─────────────────────────────────────────────────┐
│ 你的应用代码 │
│ ChatClient / LangChain / Spring AI │
└──────────────┬──────────────────────┬────────────┘
│ │
OpenAI 兼容 API 各厂商专属 API
(GPT-4o / Claude / Qwen)
│ │
┌──────────▼──────┐ ┌─────────▼────────┐
│ OpenAI API │ │ Anthropic Claude │
│ 硅基流动镜像 │ │ 阿里云 DashScope │
│ vLLM / Ollama │ │ 百度文心 / 豆包 │
└─────────────────┘ └──────────────────┘

OpenAI API(官方,含国内镜像)

OpenAI 官方

1
2
3
4
5
6
7
8
9
10
11
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model="gpt-4o",
api_key="sk-xxxxx", # 从 platform.openai.com 获取
temperature=0.7,
max_tokens=1000
)

response = llm.invoke("用Python写一个快排")
print(response.content)
1
2
3
4
5
6
7
8
9
# Spring AI 配置
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o
temperature: 0.7

硅基流动(SiliconFlow,国内可用)

https://siliconflow.cn — OpenAI 兼容 API,国内网络直连,价格更低

1
2
3
4
5
6
7
8
9
10
import os
os.environ["OPENAI_API_KEY"] = "sk-xxxxx" # 硅基流动 API Key

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
model="Qwen/Qwen2.5-7B-Instruct", # 支持多种模型
base_url="https://api.siliconflow.cn/v1",
api_key="sk-xxxxx"
)
1
2
3
4
5
6
7
8
9
# Spring AI 配置
spring:
ai:
openai:
base-url: https://api.siliconflow.cn/v1
api-key: ${SILICONFLOW_API_KEY}
chat:
options:
model: Qwen/Qwen2.5-7B-Instruct

其他国内兼容镜像(按需使用)

平台Base URL特点
硅基流动https://api.siliconflow.cn/v1稳定、支持模型多
AI Proxyhttps://api.ai-api.com/v1中转服务
自建代理企业内网部署数据不出域

Anthropic Claude

安装依赖

1
uv pip install langchain-anthropic

使用

1
2
3
4
5
6
7
8
9
10
11
from langchain_anthropic import ChatAnthropic

llm = ChatAnthropic(
model="claude-sonnet-4-20250514",
anthropic_api_key="sk-ant-xxxxx", # 从 console.anthropic.com 获取
temperature=0.7,
max_tokens=1024
)

response = llm.invoke("解释一下什么是 RAG")
print(response.content)

Spring AI 配置

1
2
3
4
5
6
7
8
spring:
ai:
anthropic:
api-key: ${ANTHROPIC_API_KEY}
chat:
options:
model: claude-3-5-sonnet-20241022
temperature: 0.7

Spring AI 1.0+ 支持 spring-ai-starter-model-anthropic


Ollama 本地模型

快速启动

1
2
3
4
5
6
7
8
9
10
# 启动 Ollama 服务
ollama serve

# 拉取模型(后台自动)
ollama pull llama3.2 # 对话模型
ollama pull nomic-embed-text:latest # Embedding 模型
ollama pull deepseek-r1:7b # 推理模型

# 验证
curl http://localhost:11434/api/tags

Python + LangChain 调用

1
2
3
4
5
6
7
8
9
10
from langchain_ollama import ChatOllama

llm = ChatOllama(
model="llama3.2", # 或 deepseek-r1:7b
base_url="http://localhost:11434",
temperature=0.7
)

response = llm.invoke("用Python写一个快排")
print(response.content)

Spring AI + Ollama

1
2
3
4
5
6
7
8
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
options:
model: llama3.2
temperature: 0.7
1
2
3
4
5
6
@Autowired
private OllamaChatModel chatModel;

public String chat(String question) {
return chatModel.call(question);
}

模型选择指南

场景推荐模型说明
日常对话 / 原型开发GPT-4o-mini / Qwen2.5-7B成本低,速度快
代码生成 / 技术问答GPT-4o / Claude 3.5 Sonnet质量最高
长文档分析 / RAGClaude 3.5 Sonnet200K 上下文
推理 / 数学 / 复杂逻辑deepseek-r1 / o1-mini推理模型
中文日常场景Qwen2.5 / 豆包中文优化
隐私敏感数据Ollama 本地(Llama3.2)数据不出本地
成本敏感Ollama + vLLM(自托管)按量计费为0

API Key 安全配置

环境变量方案(推荐)

1
2
3
4
# .env 文件(加入 .gitignore)
OPENAI_API_KEY=sk-xxxxx
ANTHROPIC_API_KEY=sk-ant-xxxxx
SILICONFLOW_API_KEY=sk-xxxxx

Python 使用

1
2
3
4
5
import os
from dotenv import load_dotenv
load_dotenv() # 加载 .env 文件

llm = ChatOpenAI(api_key=os.getenv("OPENAI_API_KEY"))

Spring Boot 使用

1
2
3
4
5
6
7
8
9
10
11
12
13
// AIConfig.java
@Configuration
public class AIConfig {
@Value("${OPENAI_API_KEY}")
private String openAiKey;

@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
return builder
.defaultConfig("openai", Map.of("api-key", openAiKey))
.build();
}
}

多模型路由(生产级架构)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from langchain_openai import ChatOpenAI

# 根据任务类型选择模型
def get_llm(task_type: str) -> ChatOpenAI:
models = {
"fast": ChatOpenAI(model="gpt-4o-mini", temperature=0.3),
"quality": ChatOpenAI(model="gpt-4o", temperature=0.7),
"claude": ChatAnthropic(model="claude-3-5-sonnet-20241022"),
}
return models.get(task_type, models["fast"])

# 根据预算自动切换
def get_cheaper_llm(budget: float) -> ChatOpenAI:
if budget < 0.01:
return ChatOpenAI(model="gpt-4o-mini")
elif budget < 0.1:
return ChatOpenAI(model="gpt-4o")
else:
return ChatAnthropic(model="claude-3-5-sonnet")