用Python+LangChain构建智能错题本系统

云信安装大师
90
AI 质量分
2 5 月, 2025
4 分钟阅读
0 阅读

用Python+LangChain构建智能错题本系统

引言

作为学生或自学者,错题本是提升学习效率的重要工具。本文将教你如何使用Python和LangChain框架构建一个智能错题本系统,它能自动分析错题、提供解题思路,甚至生成类似题目供练习。

准备工作

环境要求

  • Python 3.8+
  • OpenAI API密钥(或其他LLM服务API)
  • 基本Python编程知识

安装依赖

代码片段
pip install langchain openai python-dotenv pandas

项目结构设计

代码片段
smart_error_book/
├── data/               # 存放错题数据
│   └── errors.csv      # 错题记录文件
├── utils/              # 工具函数
│   └── llm_utils.py    # LLM相关功能
├── .env                # 环境变量文件
└── main.py             # 主程序

第一步:设置环境变量

创建.env文件存储API密钥:

代码片段
OPENAI_API_KEY=你的API密钥

第二步:构建基础错题本功能

1. 创建错题记录类

代码片段
# main.py
import os
from dotenv import load_dotenv
from datetime import datetime
import pandas as pd

load_dotenv()  # 加载环境变量

class ErrorBook:
    def __init__(self, data_path='data/errors.csv'):
        self.data_path = data_path
        self._initialize_data_file()

    def _initialize_data_file(self):
        """初始化数据文件,如果不存在则创建"""
        if not os.path.exists(self.data_path):
            os.makedirs(os.path.dirname(self.data_path), exist_ok=True)
            df = pd.DataFrame(columns=[
                'timestamp', 
                'subject', 
                'question', 
                'user_answer', 
                'correct_answer',
                'analysis',
                'tags'
            ])
            df.to_csv(self.data_path, index=False)

    def add_error(self, subject, question, user_answer, correct_answer):
        """添加新的错题记录"""
        df = pd.read_csv(self.data_path)

        new_record = {
            'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
            'subject': subject,
            'question': question,
            'user_answer': user_answer,
            'correct_answer': correct_answer,
            'analysis': '',  # 留待后续分析
            'tags': ''       # 留待后续标记
        }

        df = pd.concat([df, pd.DataFrame([new_record])], ignore_index=True)
        df.to_csv(self.data_path, index=False)

    def get_errors_by_subject(self, subject):
        """按学科获取错题"""
        df = pd.read_csv(self.data_path)
        return df[df['subject'] == subject]

第三步:集成LangChain进行智能分析

1. LLM工具类实现

代码片段
# utils/llm_utils.py
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
from dotenv import load_dotenv
import os

load_dotenv()

class LLMAnalyzer:
    def __init__(self):
        self.llm = ChatOpenAI(
            model="gpt-3.5-turbo",
            temperature=0.7,
            openai_api_key=os.getenv("OPENAI_API_KEY")
        )

    def analyze_error(self, question, user_answer, correct_answer):
        """使用LLM分析错题"""
        prompt_template = """
        你是一位经验丰富的{subject}老师,请帮助学生分析以下错题:

        题目: {question}
        学生答案: {user_answer}
        正确答案: {correct_answer}

        请按照以下步骤进行分析:
        1. 指出学生答案中的具体错误点
        2. 解释正确答案的推导过程或原理
        3. 提供2-3个类似题目供学生练习

        请用中文回答,并保持专业且友好的语气。
        """

        prompt = ChatPromptTemplate.from_template(prompt_template)
        chain = prompt | self.llm | StrOutputParser()

        response = chain.invoke({
            "subject": "数学",  # TODO: Make subject dynamic
            "question": question,
            "user_answer": user_answer,
            "correct_answer": correct_answer
        })

        return response

    def generate_similar_questions(self, question, count=3):
        """生成类似题目"""
        prompt_template = """
        基于以下题目,生成{count}道相似但不同的练习题:

        原题: {question}

        要求:
        1. 保持相同的知识点和难度级别
        2. 每道题目都应有完整解答步骤

        请用中文回答。
        """

        prompt = ChatPromptTemplate.from_template(prompt_template)
        chain = prompt | self.llm | StrOutputParser()

        return chain.invoke({
            "question": question,
            "count": count
        })

2. 增强ErrorBook类

更新main.py中的ErrorBook类:

代码片段
# main.py (更新部分)
from utils.llm_utils import LLMAnalyzer

class ErrorBook:
    # ... (之前的代码保持不变)

    def analyze_errors(self):
        """批量分析所有未分析的错题"""
        df = pd.read_csv(self.data_path)

        analyzer = LLMAnalyzer()

        for idx, row in df.iterrows():
            if not row['analysis'] or pd.isna(row['analysis']):
                analysis = analyzer.analyze_error(
                    row['question'],
                    row['user_answer'],
                    row['correct_answer']
                )
                df.at[idx, 'analysis'] = analysis

                similar_qs = analyzer.generate_similar_questions(row['question'])
                tags = self._extract_keywords(analysis) + ";similar:" + str(hash(similar_qs))
                df.at[idx, 'tags'] = tags

                print(f"已分析: {row['subject']} - {row['question'][:30]}...")

                # API调用有速率限制,适当延迟(免费账号每分钟3次请求)
                import time; time.sleep(20)  

        df.to_csv(self.data_path, index=False)

    def _extract_keywords(self, text):
        """从分析文本中提取关键词作为标签"""
        # TODO: Implement more sophisticated keyword extraction or use LLM for this task too.
        common_keywords = ["概念错误", "计算错误", "理解偏差", "公式应用"]

        for kw in common_keywords:
            if kw in text:
                return kw

        return "其他"

第四步:实现命令行界面

代码片段
# main.py (继续添加)

def main():
    error_book = ErrorBook()

    while True:
        print("\n智能错题本系统")
        print("1. 添加新错题")
        print("2. 查看某学科所有错题")
        print("3. AI分析所有未分析的错题")
        print("4. AI生成类似题目")
        print("5. 退出")

choice=input("请选择操作(1-5): ")
if choice == "1":
    subject=input("学科名称(如数学、物理等): ")
    question=input("题目内容: ")
    user_answer=input("你的错误答案: ")
    correct_answer=input("正确答案: ")

error_book.add_error(subject, question, user_answer, correct_answer) 
print(f"已添加{subject}科目新错题!")

elif choice == "2":
subject=input("要查询的学科名称: ") 
errors=error_book.get_errors_by_subject(subject)

if errors.empty:
print(f"没有找到{subject}科目的错题记录") 
else:
print(f"\n{subject}科目共{len(errors)}道错题:")
for _, row in errors.iterrows(): 
print(f"\n时间:{row['timestamp']}")
print(f"问题:{row['question']}")
print(f"你的答案:{row['user_answer']}")
print(f"正确答案:{row['correct_answer']}")
if row['analysis'] and not pd.isna(row['analysis']): 
print("\nAI分析:")
print(row['analysis'])
else:
print("\n(尚未进行AI分析)")

elif choice == "3":
confirm=input("这将消耗OpenAI API额度,确认开始分析?(y/n): ") 
if confirm.lower() == "y":
error_book.analyze_errors() 
print("\n所有未分析的错题已完成AI解析!")

elif choice == "4":
df=pd.read_csv(error_book.data_path) 

if len(df)==0:
print("当前没有可用的错题记录") 
continue

for i,(_,row)in enumerate(df.iterrows(),1): 
print(f"{i}.{row['subject'][:10]}:{row['question'][:50]}...")

selection=int(input("\n选择要生成类似题的题目编号:"))-1 

selected_row=df.iloc[selection]
similar_qs=LLMAnalyzer().generate_similar_questions(selected_row["question"]) 

print(f"\n基于以下原题的类似题目:\n{selected_row["question"]}\n") 
print(similar_qs)

elif choice=="5":
break 

else:
print("无效输入,请输入1-5之间的数字")

if __name__=="__main__":
main()

第五步:系统优化与扩展建议

优化建议

1.缓存机制:将LLM的分析结果缓存到本地数据库,避免重复调用API

2.批处理模式:对于大量历史错题的首次分析,实现批量处理功能

3.多模型支持:除了OpenAI,可以集成本地模型如Llama2等

4.可视化统计:使用Matplotlib或Seaborn添加学习进度可视化功能

扩展功能

1.知识点图谱:基于错误类型构建个人知识薄弱点图谱

2.复习提醒:根据艾宾浩斯遗忘曲线设置复习提醒

3.移动端支持:开发简易手机端界面方便随时记录

4.OCR集成:通过拍照自动识别纸质试卷上的错题

总结

本文实现了一个基于Python和LangChain的智能错题本系统核心功能:

1.基础架构:使用Pandas管理CSV格式的错题库

2.LangChain集成
-通过ChatOpenAI接入大语言模型能力
-设计专用提示词模板获取结构化分析
-实现自动批处理流程

3.实用功能
-完整的CRUD操作
-智能错误分析与诊断
-相似题目生成

4.优化方向
API调用频率控制
本地缓存机制

这个项目展示了如何将传统应用与AI能力结合创造更智能的工具。你可以在此基础上继续扩展更多实用功能。

原创 高质量