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", temperature=0.7, max_tokens=1000 )
response = llm.invoke("用Python写一个快排") print(response.content)
|
1 2 3 4 5 6 7 8 9
| 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"
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: 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 Proxy | https://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", 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 serve
ollama pull llama3.2 ollama pull nomic-embed-text:latest 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", 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 | 质量最高 |
| 长文档分析 / RAG | Claude 3.5 Sonnet | 200K 上下文 |
| 推理 / 数学 / 复杂逻辑 | deepseek-r1 / o1-mini | 推理模型 |
| 中文日常场景 | Qwen2.5 / 豆包 | 中文优化 |
| 隐私敏感数据 | Ollama 本地(Llama3.2) | 数据不出本地 |
| 成本敏感 | Ollama + vLLM(自托管) | 按量计费为0 |
API Key 安全配置
环境变量方案(推荐)
1 2 3 4
| 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()
llm = ChatOpenAI(api_key=os.getenv("OPENAI_API_KEY"))
|
Spring Boot 使用
1 2 3 4 5 6 7 8 9 10 11 12 13
| @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")
|