跳到主要内容

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 怎么选?

答案

维度RAGFine-tuning
知识更新实时(更新文档库)需要重新训练
成本低(不需要 GPU)高(需 GPU 训练)
适用场景知识密集型、文档问答风格/格式调整、专业领域
幻觉控制强(有引用来源)

Q2: Prompt 工程有哪些技巧?

答案

  1. 角色设定你是一个资深 Python 工程师
  2. Few-shot:提供输入/输出示例
  3. Chain of Thought让我们一步一步思考
  4. 结构化输出:要求 JSON 格式返回
  5. 约束条件:限制长度、格式、不做什么

Q3: LangChain 和直接用 SDK 的区别?

答案

  • SDK 直调:简单场景、控制力强、无额外依赖
  • LangChain:复杂链路(RAG、Agent、多步推理)、快速原型、抽象了多个 LLM 提供商

LangChain 适合快速实验,但产品化时建议精简依赖,必要时回退到 SDK 直调。

Q4: 如何控制 Token 成本?

答案

  1. Prompt 精简:减少系统提示和示例的 Token 数
  2. 缓存:相同 Prompt 缓存结果
  3. 选择合适模型:简单任务用便宜模型(GPT-4o-mini)
  4. 流量控制:限流、排队
  5. 语义缓存:相似问题复用之前的回答

相关链接