当前位置:首页>python>【Python】Day27:项目开发(上):核心逻辑 —— 读取本地文档 → 构造Prompt → 调用API

【Python】Day27:项目开发(上):核心逻辑 —— 读取本地文档 → 构造Prompt → 调用API

  • 2026-10-10 21:24:26
【Python】Day27:项目开发(上):核心逻辑 —— 读取本地文档 → 构造Prompt → 调用API

🎯 学习目标

  1. 明确毕业项目的核心功能:基于本地文档的问答助手
  2. 实现读取本地文档(.txt / .md)的功能
  3. 掌握 Prompt 构造技巧:系统提示词 + 文档内容 + 用户问题
  4. 完成核心链路:文档 → Prompt → API → 回答

一、项目架构设计

  1. 功能流程
    用户上传文档 → 读取文档内容 →用户提问 → [系统提示词 + 文档内容 + 用户问题] → 调用API → 显示回答
  2. 模块拆分
    # file_utils.py - 文件处理# prompt_utils.py - prompt构造# api_utils.py - API调用# app.py - Streamlit界面
  3. api调用
    import osimport requestsdefcall_llm(messages, temperature=0.5):"""调用大模型API"""    api_key = os.getenv("API_KEY")    base_url = os.getenv("BASE_URL")    url = f"{base_url}/chat/completions"    headers = {"Authorization": f"Bearer {api_key}","Content-Type": "application/json"    }    data = {"model": "glm-4-flash","messages": messages,"temperature": temperature    }    response = requests.post(url, headers=headers, json=data, timeout=60)    response.raise_for_status()return response.json()["choices"][0]["message"]["content"]

二、读取本地文档

  1. file_utils.py
    defread_text_file(uploaded_file):"""读取上传的文本文件"""try:# Streamlit 上传的文件是 BytesIO 对象        content = uploaded_file.read().decode("utf-8")return contentexcept UnicodeDecodeError:try:            uploaded_file.seek(0)            content = uploaded_file.read().decode("gbk")return contentexcept Exception as e:returnf"文件读取失败:{e}"

三、构造 Prompt

  1. prompt_utils.py  让 AI 基于"给定内容"回答
    defbuild_messages(system_prompt, doc_content, user_question, history=None):"""构造API请求的messages"""# 系统提示词 + 文档内容    full_system = f"""{system_prompt}以下是参考文档内容:<br>{doc_content}<br>请基于以上文档内容回答用户的问题。如果文档中没有相关信息,请回答"文档中未找到相关信息"。"""    messages = [{"role": "system", "content": full_system}]# 加入历史对话if history:        messages.extend(history)# 加入当前问题    messages.append({"role": "user", "content": user_question})return messages

四、完整核心链路测试

# test_core.py - 不用 Streamlit,先测试核心逻辑from file_utils import read_text_filefrom api_utils import call_llmfrom dotenv import load_dotenvload_dotenv()# 模拟文档内容doc_content = "Python是一种编程语言,由Guido van Rossum创建。它的名字来自Monty Python。"# 构造请求messages = build_messages(    system_prompt="你是一个文档问答助手",    doc_content=doc_content,    user_question="Python是谁创建的?")# 调用APIanswer = call_llm(messages)print(answer)    # Python由Guido van Rossum创建。

⚠️ 常见坑

  1. 文档内容太长超过 Token 限制
    • GPT-3.5 最多 4K/16K Token
    • 简单处理:截断文档 doc_content[:8000]
    • 后续优化:分块(Chunking)
  2. AI "幻觉":不基于文档回答
    • 在系统提示词中强调"请严格基于文档内容回答"

✍️ 实战练习

  1. 用真实文档测试
    • 准备一个 .txt 文件,用核心链路测试问答效果。

✅ 自测清单

  • [ ] 能读取 .txt 文件内容并解码为字符串
  • [ ] 能构造"系统提示 + 文档 + 问题"的 Prompt
  • [ ] 在 Prompt 中强调"基于文档回答",减少 AI 幻觉
  • [ ] 核心链路能跑通:文档 → Prompt → API → 回答

最新文章

随机文章