|
**原则:Key 永远不硬编码进代码库**,用 dotenv 从环境文件加载:
```bash
pip install --upgrade openai python-dotenv
```
在项目目录建 `env.txt`(或 `.env`):
```text
DEEPSEEK_API_KEY="sk-xxxx"
DEEPSEEK_BASE_URL="https://api.deepseek.com/v1"
OPENAI_API_KEY="sk-xxxx"
OPENAI_BASE_URL="https://你的中转/v1"
```
```python
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # 默认找 .env
_ = load_dotenv(find_dotenv(filename="env.txt")) # 指定文件名
```
各家环境变量命名约定:`deepseek_api_key / deepseek_base_url`、`OPENAI_API_KEY / OPENAI_BASE_URL`、`DASHSCOPE_API_KEY`(通义)、`qianfan_ak / qianfan_sk`(千帆)。
|
|
OpenAI SDK 标准三步(几乎所有厂商都兼容此形态,只换 base_url + key + model):
```python
from openai import OpenAI
client = OpenAI(api_key="你的key", base_url="https://api.deepseek.com/v1")
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是一个严谨的助手"},
{"role": "user", "content": "用一句话介绍你自己"}
],
temperature=0, # 任务型建议 0~0.3
max_tokens=512,
response_format={"type": "text"} # 也可 "json_object"
)
print(response.choices[0].message.content)
print(response.usage.total_tokens) # 计费按 token
```
封装成函数便于复用:
```python
def get_completion(prompt, model="gpt-4o-mini", response_format="text"):
response = client.chat.completions.create(
model=model, messages=[{"role": "user", "content": prompt}],
temperature=0, response_format={"type": response_format})
return response.choices[0].message.content
```
|
|
流式输出(对话产品的标准体验):
```python
stream = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "讲个日常笑话"}],
stream=True
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
```
要点:流式时每个 chunk 的增量在 `delta.content`(非流式在 `message.content`);拼接由调用方完成。
|
|
**system 与 user 的语义差异实验**——同一句"知识"放不同 role,回答完全不同:
```python
# 实验A:放 system
messages = [
{"role": "system", "content": "七三笔记网站是一个介绍AI相关知识的网站"},
{"role": "user", "content": "七三笔记是什么网站?"}]
# 实验B:放 user(开头)
messages = [
{"role": "user", "content": "七三笔记网站是一个介绍AI相关知识的网站。七三笔记是什么网站?"}]
```
结论:
- system 是"设定/规则/知识注入",权重高于 user,模型会严格围绕它回答
- 放 user 里只是"上文信息",模型可能把它当作待讨论内容而非事实
- 另一个实测:temperature=0 并非绝对稳定,对模型"不会的问题"甚至可能编造——确定性场景仍需结构化输出与校验
|
|
| 端点模型名 | 实际模型 | 适用 |
|-----------|---------|------|
| deepseek-chat | DeepSeek-V3 系列 | 通用对话、成本低 |
| deepseek-reasoner | DeepSeek-R1 系列 | 数学/代码/复杂推理 |
- OpenAI 兼容端点 `https://api.deepseek.com/v1`,价格远低于 GPT 系,128K 上下文
- reasoner 最大输入 64K(以官方文档为准),且**思维链不该给用户看全**
|
|
```python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url=os.getenv("DEEPSEEK_BASE_URL", "https://api.deepseek.com/v1")
)
resp = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "你是谁?"}],
max_tokens=60
)
print(resp.choices[0].message.content)
```
curl 等价:
```bash
curl https://api.deepseek.com/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $DEEPSEEK_API_KEY" \
-d '{"model":"deepseek-chat","messages":[{"role":"user","content":"你是谁?"}]}'
```
|
|
reasoner 模型的流式响应中,**思维链与正文分离**:
```python
stream = client.chat.completions.create(
model="deepseek-reasoner",
messages=[{"role": "user", "content": "9.11和9.9哪个大"}],
stream=True
)
for chunk in stream:
delta = chunk.choices[0].delta
if getattr(delta, "reasoning_content", None):
pass # 思维链:可用于前端"思考中..."折叠展示
if delta.content:
print(delta.content, end="") # 正文
```
本地 deepseek-r1 系列经 ollama 也输出 `<think>...</think>` 思维链,封装层要负责剥离。
|
|
通义千问(DashScope 提供 OpenAI 兼容模式):
```python
client = OpenAI(
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)
resp = client.chat.completions.create(
model="qwen-turbo",
messages=[{"role": "user", "content": "你好"}],
temperature=0.8, top_p=0.8
)
```
**top_p(核采样)原理**:把词按概率降序累加,只保留累计概率不超过 p 的最小词集合,再归一化采样:
$$V^{(p)} = \min\left\{ S : \sum_{i \in S} P(i) \geq p \right\}$$
多轮对话 = 把 assistant 的历史回复追加进 messages 循环:
```python
messages = [{"role": "user", "content": q1}]
messages.append({"role": "assistant", "content": resp1})
messages.append({"role": "user", "content": q2})
```
原生 SDK 写法:`dashscope.Generation.call(dashscope.Generation.Models.qwen_turbo, messages=..., result_format='message')`。
|
|
百度千帆:先在控制台创建应用拿 API Key / Secret Key,再换 access_token:
```python
import requests
url = ("https://aip.baidubce.com/oauth/2.0/token?client_id=你的APIKey"
"&client_secret=你的SecretKey&grant_type=client_credentials")
token = requests.post(url).json()["access_token"]
```
langchain 调用更省事:
```python
from langchain_community.chat_models import QianfanChatEndpoint
from langchain_core.messages import HumanMessage
llm = QianfanChatEndpoint(qianfan_ak=os.getenv("qianfan_ak"),
qianfan_sk=os.getenv("qianfan_sk"))
print(llm.invoke([HumanMessage(content="你是谁")]).content)
```
|
|
讯飞星火(独立 SDK,走 websocket):
```bash
pip install spark_ai_python
```
```python
from sparkai.llm.llm import ChatSparkLLM
from sparkai.core.messages import ChatMessage
from sparkai.llm.llm import ChunkPrintHandler
spark = ChatSparkLLM(
spark_api_url='wss://spark-api.xf-yun.com/v3.5/chat',
spark_app_id='你的appid', spark_api_key='你的key', spark_api_secret='你的secret',
spark_llm_domain='generalv3.5', streaming=False)
messages = [ChatMessage(role="user", content="你好")]
spark.generate([messages], callbacks=[ChunkPrintHandler()])
```
|
|
**llama3**(Meta 开源):8B / 70B 两档,128K 词表,15T token 训练;本地经 ollama 一行可跑:
```bash
ollama run llama3
ollama run llama3:70b # 指定参数规模
```
|
|
**AnyGPT**(多模态统一模型)环境准备:
```bash
git clone https://github.com/OpenMOSS/AnyGPT.git
conda create -n anygpt python=3.9 -y && conda activate anygpt
pip install -r requirements.txt
# 模型目录:AnyGPT-base / seed-tokenizer-2 / speechtokenizer / soundstorm
```
|
|
把编程助手接到国产 GLM(智谱 Anthropic 兼容端点):
```bash
npm install -g @anthropic-ai/claude-code
export ANTHROPIC_BASE_URL="https://open.bigmodel.cn/api/anthropic"
export ANTHROPIC_AUTH_TOKEN="你的智谱key"
```
- vscode 的 Claude 插件还可用 `~/.claude/settings.json` 的 `ANTHROPIC_DEFAULT_SONNET_MODEL` 等映射到 glm-4.6/4.7
- MCP 扩展:`claude mcp add -s user zai-mcp-server --env Z_AI_API_KEY=... -- npx -y "@z_ai/mcp-server"`(视觉/OCR/图表理解等 8 个工具)
- Continue 插件:免登录配 `apiBase: https://open.bigmodel.cn/api/coding/paas/v4/`;Copilot 可装 "OAI Compatible Provider" 插件接 GLM
- 智谱文生图:`POST https://open.bigmodel.cn/api/paas/v4/images/generations`,body 为 `{"model":"cogview-3","prompt":...,"size":"1024x1024"}`(尺寸 512-2048 且为 16 的倍数)
|
DeepSeek API 文档
通义 DashScope
智谱开放平台