从零构建本地智能问答助手:Python + OpenAI API 完整指南

## 背景介绍

开发工作中,我们经常需要查文档、调试代码、解答技术问题。传统搜索引擎返回的结果太杂,广告多,需要人工筛选。大语言模型出现后,我们有了新的选择——直接调用 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 虽然便宜,长期用也要花钱。

想扩展功能的话,可以加上历史记录支持多轮对话,或者加语音输入输出。先跑通最小版本,然后根据需要慢慢改。

整个过程不到一百行代码,就有一个随时待命的编程助手。建议自己动手试试。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇