LLM 应用开发
问题
如何用 Python 开发大语言模型应用?Prompt 工程、RAG、Agent 分别是什么?
答案
API 调用基础
from openai import AsyncOpenAI
client = AsyncOpenAI(api_key="sk-...")
async def chat(prompt: str) -> str:
response = await client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个 Python 专家"},
{"role": "user", "content": prompt},
],
temperature=0.7,
max_tokens=1000,
)
return response.choices[0].message.content
流式输出
async def stream_chat(prompt: str):
stream = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
stream=True,
)
async for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)
RAG(检索增强生成)
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
# 1. 文档向量化
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(documents, embeddings)
# 2. 检索相关文档
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
relevant_docs = retriever.invoke("Python GIL 是什么?")
# 3. 构建 Prompt
context = "\n".join(doc.page_content for doc in relevant_docs)
prompt = f"根据以下资料回答问题:\n{context}\n\n问题:Python GIL 是什么?"
# 4. LLM 生成
answer = await chat(prompt)
Function Calling
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取城市天气",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名"},
},
"required": ["city"],
},
},
}
]
response = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "北京今天天气怎么样?"}],
tools=tools,
tool_choice="auto",
)
# 模型决定调用 get_weather(city="北京")
tool_call = response.choices[0].message.tool_calls[0]
更多关于 Function Calling 和 Agent 的内容参考前端系列 - Function Calling 与 Agent。
常见面试问题
Q1: RAG 和 Fine-tuning 怎么选?
答案:
| 维度 | RAG | Fine-tuning |
|---|---|---|
| 知识更新 | 实时(更新文档库) | 需要重新训练 |
| 成本 | 低(不需要 GPU) | 高(需 GPU 训练) |
| 适用场景 | 知识密集型、文档问答 | 风格/格式调整、专业领域 |
| 幻觉控制 | 强(有引用来源) | 弱 |
Q2: Prompt 工程有哪些技巧?
答案:
- 角色设定:
你是一个资深 Python 工程师 - Few-shot:提供输入/输出示例
- Chain of Thought:
让我们一步一步思考 - 结构化输出:要求 JSON 格式返回
- 约束条件:限制长度、格式、不做什么
Q3: LangChain 和直接用 SDK 的区别?
答案:
- SDK 直调:简单场景、控制力强、无额外依赖
- LangChain:复杂链路(RAG、Agent、多步推理)、快速原型、抽象了多个 LLM 提供商
LangChain 适合快速实验,但产品化时建议精简依赖,必要时回退到 SDK 直调。
Q4: 如何控制 Token 成本?
答案:
- Prompt 精简:减少系统提示和示例的 Token 数
- 缓存:相同 Prompt 缓存结果
- 选择合适模型:简单任务用便宜模型(GPT-4o-mini)
- 流量控制:限流、排队
- 语义缓存:相似问题复用之前的回答