## 背景介绍
开发工作中,我们经常需要查文档、调试代码、解答技术问题。传统搜索引擎返回的结果太杂,广告多,需要人工筛选。大语言模型出现后,我们有了新的选择——直接调用 OpenAI API,在本地搭一个专注于技术问题的问答工具。
这篇文章手把手教你用 Python + OpenAI API 搭建这样一个工具。不需要机器学习基础,会写简单 Python 代码就能搞定。
## 问题描述
开发者遇到问题第一反应是搜 Google,但搜到的结果往往有一堆广告和无关内容。即使找到 Stack Overflow 的答案,也要自己读半天。
向大语言模型提问就不一样了。你可以问「怎么用 Python 读取 JSON 文件」,它直接给你代码示例。这种交互方式更高效,特别是面对复杂问题时。
本文要解决的问题:如何在本地快速搭建一个命令行问答工具,随时可以提问。
## 详细步骤
### 第一步:获取 OpenAI API Key
调用 OpenAI 服务需要先拿到 API Key。步骤很简单:
1. 打开 https://platform.openai.com 注册账号
2. 登录后进个人设置
3. 点「API keys」
4. 点「Create new secret key」生成新密钥
5. 复制保存,这个密钥只显示一次
注意:OpenAI API 是付费的,新用户有免费额度能用。用多了就按调用次数计费。
### 第二步:安装 Python 包
装 OpenAI 官方提供的库:
“`bash
pip install openai
“`
这个库封装了简洁的接口,调用各种模型都很方便。
### 第三步:配置环境变量
API Key 别写代码里,放在环境变量中更安全。
macOS 或 Linux:
“`bash
export OPENAI_API_KEY=”your-api-key-here”
“`
Windows PowerShell:
“`powershell
$env:OPENAI_API_KEY=”your-api-key-here”
“`
### 第四步:写问答代码
这步来实现核心功能:接收输入、调用 API、返回结果。
### 第五步:运行和测试
代码写完运行起来,测试几个问题看看效果。
## 完整代码示例
完整代码如下,保存为 `qa_assistant.py`:
“`python
import os
from openai import OpenAI
# 创建客户端
client = OpenAI(api_key=os.environ.get(“OPENAI_API_KEY”))
def ask_question(prompt):
“””向模型提问并获取回答”””
try:
response = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=[
{
“role”: “system”,
“content”: “你是一个技术问答助手,擅长编程问题。请用简洁清晰的语言回答,如果需要代码,请提供完整可运行的代码。”
},
{
“role”: “user”,
“content”: prompt
}
],
temperature=0.7,
max_tokens=1000
)
return response.choices[0].message.content
except Exception as e:
return f”调用API时出错: {str(e)}”
def main():
print(“=” * 50)
print(“本地智能问答助手”)
print(“输入问题,我来帮你解答”)
print(“输入 exit 退出”)
print(“=” * 50)
print()
while True:
user_input = input(“你> “).strip()
if not user_input:
continue
if user_input.lower() in [“exit”, “quit”, “q”]:
print(“再见了,有问题随时问我”)
break
print(“正在思考…”)
answer = ask_question(user_input)
print()
print(answer)
print()
print(“-” * 50)
if __name__ == “__main__”:
main()
“`
代码说明:
– 导入模块,初始化 OpenAI 客户端
– `ask_question` 函数负责和 API 通信,发送 system 消息设定助手风格
– `main` 是主循环,持续接收输入并输出回答
– 使用 `gpt-3.5-turbo` 模型,性价比最高
如果要把 API Key 直接写在代码里(不推荐,用于测试),可以改成:
“`python
client = OpenAI(api_key=”sk-xxxxxxxxxxxxxxxx”)
“`
## 运行结果
保存好代码后,在终端运行:
“`bash
python qa_assistant.py
“`
运行前记得设置 `OPENAI_API_KEY` 环境变量。启动后会显示欢迎信息,然后等待输入。
实际问答效果:
**问:如何用 Python 读取 JSON 文件?**
答:
“`python
import json
with open(“data.json”, “r”, encoding=”utf-8″) as f:
data = json.load(f)
print(data)
“`
`json.load()` 会把 JSON 文件直接解析成 Python 对象。注意文件编码要用 UTF-8。
**问:Python 怎么合并两个字典?**
答:
“`python
dict1 = {“a”: 1, “b”: 2}
dict2 = {“b”: 3, “c”: 4}
# 方法一:| 操作符(Python 3.9+)
merged = dict1 | dict2
# 结果: {“a”: 1, “b”: 3, “c”: 4}
# 方法二:.update()
dict1.update(dict2)
# 会修改原字典
“`
模型不仅给了代码,还解释了两种方法的区别。学习新技术时这种交互特别有用。
## 进阶扩展
基础版本跑起来后,可以考虑加一些实用功能:
**1. 添加上下文记忆**
目前的版本每次都是独立对话。加一个历史记录列表,就能记住之前聊过的内容:
“`python
def ask_question_with_history(messages, prompt):
messages.append({“role”: “user”, “content”: prompt})
response = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=messages,
max_tokens=1000
)
answer = response.choices[0].message.content
messages.append({“role”: “assistant”, “content”: answer})
return messages, answer
“`
**2. 支持流式输出**
如果回答很长,等完整结果很痛苦。改成流式输出可以看到逐字生成的过程:
“`python
response = client.chat.completions.create(
model=”gpt-3.5-turbo”,
messages=[{“role”: “user”, “content”: prompt}],
stream=True
)
for chunk in response:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end=””, flush=True)
“`
**3. 添加 Typing 提示**
调用 API 需要几秒钟,加一个 typing 效果让用户知道程序没有卡住:
“`python
import threading
import time
def show_typing():
print(“正在思考”, end=””)
for _ in range(3):
time.sleep(0.5)
print(“.”, end=””, flush=True)
print(“\r” + ” ” * 20 + “\r”, end=””)
# 在调用 API 前启动
typing_thread = threading.Thread(target=show_typing)
typing_thread.start()
“`
## 总结
按照上面的步骤,你的本地问答助手已经跑起来了。这个工具的好处很明显:响应快,不用在浏览器和终端之间来回切换;回答精准,没有广告打扰;可以追问细节,直到完全搞懂。
有些事需要知道:英文提问通常回答更详细,因为模型对英文支持更好;模型知识有截止日期,太新的技术可能不懂;gpt-3.5-turbo 虽然便宜,长期用也要花钱。
想扩展功能的话,可以加上历史记录支持多轮对话,或者加语音输入输出。先跑通最小版本,然后根据需要慢慢改。
整个过程不到一百行代码,就有一个随时待命的编程助手。建议自己动手试试。