【三个月 AI Agent 实战学习】Day 7 :阶段总结 —— 命令行翻译软件实战
2026/9/15 7:50:51 网站建设 项目流程

Day 7:阶段总结 —— 命令行翻译软件实战

欢迎来到第一阶段的最后一天!今天我们将不再学习新概念,而是整合前六天所学,完成一个完整的命令行翻译软件。这个项目将覆盖 API 调用、Prompt 设计(含 JSON 输出、Few-shot 思维)、JSON 解析与重试机制,是一次全面的实战检验。


一、今日学习目标

  1. 综合运用前六天知识:API 调用、结构化输出、错误处理。
  2. 实现一个命令行交互程序:用户输入中文或英文,程序自动识别语言并翻译成另一种语言。
  3. 强制模型输出 JSON,并在代码中可靠解析。
  4. 添加重试机制,确保翻译服务的稳定性。
  5. 通过实战加深对 Prompt 工程的理解,并体会“模型输出结构化数据”在真实应用中的价值。

二、详细实现步骤

步骤 1:设计系统架构

我们的命令行翻译软件包含以下模块:

  • translate(text):核心翻译函数,接收用户输入,调用大模型,返回解析后的翻译结果字典。
  • extract_json(raw):从模型原始输出中提取并解析 JSON 对象(复用 Day 6 的逻辑)。
  • 主循环:不断读取用户输入,调用translate,打印结果,直到用户输入“退出”。

系统流程:
用户输入 → 调用 API(Prompt 要求输出 JSON)→ 获取原始响应 → 清洗并解析 JSON → 提取翻译结果 → 显示给用户。

步骤 2:编写 Prompt 模板

Prompt 设计如下:

System Prompt

你是一个专业的翻译助手。你会收到用户输入的一段文本,请自动判断其语言(中文或英文)。如果输入是中文,请将其翻译成英文;如果输入是英文,请将其翻译成中文。如果输入包含其他语言或无法识别,请在 translation 字段中返回错误提示。
你必须只输出一个 JSON 对象,格式如下:
{“detected_language”: “zh” 或 “en”, “target_language”: “en” 或 “zh”, “translation”: “翻译后的文本”}
不要输出任何其他文字。

User Prompt

请翻译以下文本:
{user_input}

我们将user_input插入到 User Prompt 中。注意:如果用户输入包含特殊字符,我们使用 f-string 直接插入即可。

步骤 3:实现核心函数

新建translator.py,首先导入依赖:

importosimportjsonimportreimporttimefromdotenvimportload_dotenvfromopenaiimportOpenAI

加载环境变量和初始化客户端(同前):

load_dotenv()client=OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),base_url="https://api.deepseek.com")

定义 JSON 提取函数(复用 Day 6 代码,可稍作优化):

defextract_json(text:str):"""从模型输出中提取并解析 JSON 对象"""text=text.strip()# 去除 Markdown 代码块iftext.startswith("```"):text=text.strip("`")iftext.startswith("json"):text=text[4:]text=text.strip()# 直接解析try:returnjson.loads(text)exceptjson.JSONDecodeError:pass# 正则提取第一个 {...}match=re.search(r'\{.*\}',text,re.DOTALL)ifmatch:try:returnjson.loads(match.group(0))exceptjson.JSONDecodeError:pass# 替换单引号尝试try:cleaned=text.replace("'",'"')returnjson.loads(cleaned)exceptjson.JSONDecodeError:returnNone

定义翻译函数,包含重试:

deftranslate(user_input:str,max_retries:int=2)->dict:"""翻译用户输入,返回解析后的字典,包含 detected_language, target_language, translation"""system_prompt=("你是一个专业的翻译助手。你会收到用户输入的一段文本,请自动判断其语言(中文或英文)。""如果输入是中文,请将其翻译成英文;如果输入是英文,请将其翻译成中文。""如果输入包含其他语言或无法识别,请在 translation 字段中返回错误提示。""你必须只输出一个 JSON 对象,格式如下:"'{"detected_language": "zh" 或 "en", "target_language": "en" 或 "zh", "translation": "翻译后的文本"}'"不要输出任何其他文字。")user_prompt=f"请翻译以下文本:\n{user_input}"forattemptinrange(max_retries+1):try:response=client.chat.completions.create(model="deepseek-chat",messages=[{"role":"system","content":system_prompt},{"role":"user","content":user_prompt}],temperature=0.1,# 低温度保证格式稳定max_tokens=500)raw_output=response.choices[0].message.content parsed=extract_json(raw_output)ifparsedand"translation"inparsed:returnparsed# 如果解析失败或缺少字段,记录并重试print(f"[警告] 第{attempt+1}次尝试解析失败,原始输出:{raw_output[:100]}...")exceptExceptionase:print(f"[错误] API调用异常:{e}")time.sleep(1)# 简单等待# 所有重试失败return{"detected_language":"unknown","target_language":"unknown","translation":"翻译失败,请稍后重试。"}
步骤 4:构建命令行交互循环
defmain():print("欢迎使用中英互译命令行工具!")print("输入中文自动翻译成英文,输入英文自动翻译成中文。")print("输入 '退出' 或 'quit' 结束程序。\n")whileTrue:user_input=input("请输入:").strip()ifnotuser_input:continueifuser_input.lower()in["退出","quit","exit"]:print("感谢使用,再见!")breakresult=translate(user_input)# 展示结果print("-"*40)print(f"检测语言:{result.get('detected_language')}")print(f"目标语言:{result.get('target_language')}")print(f"翻译结果:{result.get('translation')}")print("-"*40)

运行入口:

if__name__=="__main__":main()
步骤 5:测试与调试

保存文件并运行:

python translator.py

测试用例:

  1. 输入“你好,世界” → 期望输出英文翻译。
  2. 输入“Hello, how are you?” → 期望输出中文翻译。
  3. 输入“12345” 或纯符号 → 可能返回错误提示(但模型可能仍会输出某种结果,注意观察)。
  4. 输入混合语言“你好world” → 观察模型如何处理。

观察点:

  • 模型是否稳定输出 JSON?
  • 解析成功率如何?
  • 重试机制是否触发?
  • 翻译质量是否满意?

如果发现 JSON 解析失败频繁,可以调整 Prompt(比如增加“严格禁止任何额外的文字”)或者优化extract_json函数。如果翻译质量不佳,可以考虑在 System Prompt 中加入 Few-shot 示例(例如在 System Prompt 中添加一个示例,展示输入“你好”时输出{"detected_language":"zh","target_language":"en","translation":"Hello"})。

步骤 6:代码整理与版本管理(可选)
  • 将代码拆分为多个文件:llm_client.py(客户端初始化)、utils.py(JSON 提取)、translator.py(主逻辑)。
  • 添加requirements.txt文件,记录依赖。
  • 初始化 Git 仓库,提交代码,并创建.gitignore忽略.env__pycache__
  • 在 GitHub 上创建仓库,推送代码。

三、常见问题与调试

Q1:模型总是返回额外的解释文字,导致 JSON 解析失败。
→ 在 System Prompt 中加强语气,例如:“你只能输出 JSON 对象,绝对禁止输出任何其他文字,包括解释、提示、代码块标记。不要使用 Markdown。” 同时降低 temperature 至 0。

Q2:输入长文本时翻译被截断。
→ 检查max_tokens设置,翻译通常不需要太长,但若输入较长,可适当增大max_tokens(例如 1000)。同时确保不超过模型的上下文窗口(DeepSeek 为 64K,一般不会超)。

Q3:有时模型检测语言错误(比如把中文拼音判断成英文)。
→ 可以在 Prompt 中加入更明确的判断规则,例如:“如果输入包含中文字符,则判定为中文;否则判定为英文。” 或者干脆不依赖模型判断,用代码检测(如if any('\u4e00' <= ch <= '\u9fff' for ch in text)),然后明确告诉模型翻译方向。这样可以提高稳定性和速度。我们今天的实现让模型判断是为了练习 Prompt 设计,实际项目中你可能更倾向于代码判断。

Q4:重试机制是否必要?如果一直失败怎么办?
→ 重试是必要的,因为模型有随机性。如果连续失败,可以返回友好错误信息,让用户稍后再试。实际项目中还可加入指数退避等待。

Q5:如何改进翻译质量?
→ 可以加入 Few-shot 示例,或者使用专门的翻译 Prompt 技巧,比如要求“忠实原文,保持风格”。如果有领域要求,可在 System Prompt 中说明。


四、今日总结与作业

今天你完成了:

  • ✅ 构建了一个可用的命令行翻译软件,整合了 API 调用、Prompt 设计、JSON 解析、重试机制。
  • ✅ 通过实战巩固了对结构化输出的理解,并学习了如何让程序稳定地与模型协作。
  • ✅ 体验了从零到一搭建一个小型 LLM 应用的过程。

今日作业(必做):

  1. 运行你的翻译软件,测试 10 个不同的句子(5 个中文、5 个英文),记录翻译质量和解析成功率。
  2. 尝试优化 Prompt 或代码,提高 JSON 解析成功率(比如加入 Few-shot 示例,或改用代码判断语言)。记录优化前后的对比。
  3. 将今天和本周的代码整理到一个 GitHub 仓库中,确保 README 描述清楚项目结构和运行方法。这是你 AI 学习之旅的第一个里程碑!

明日预告:我们将进入第二周,深入学习提示词工程的进阶技巧:如何防范模型幻觉、角色扮演、长文本摘要等。请保持好奇心和耐心,我们继续前进!

有任何问题欢迎随时提问!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询