【Python AI开发】LangGraph教程: 搭建AI+教育应用案例

本文介绍了如何使用LangGraph、LangChain、qwen-vl和qwen-math等工具搭建一个AI+教育的智能工作流,以提高数学教学的效率和质量。

defagi avatar
  • defagi
  • 2 min read

近期,人工智能技术在教育领域的应用日益增多,但特别是在数学教学方面,其表现尚有提升空间。为了尝试下阿里最新的的千问2.5模型.采用LangGraph,LangChain,qwen-vl,qwen-math搭建了AI+教育智能工作流.实现了图片OCR识别数学题,数学模型负责解答问题,整个推理解答过程比GPT4强。最后与开源的微信机器人整合就实现了拍照上传题目,AI解题的过程.

wechat bot

AI技术栈概述

  • 核心框架:LangGraph + LangChain
  • 视觉模型:qwen-vl-max/Qwen2-VL(用于AI图像处理可使用开源替代)
  • 数学模型:qwen-math-plus/Qwen2.5-Math(用于数学题解答可使用开源替代)
  • 开发语言:Python 3.10

Python AI开发环境配置

1. 安装必要依赖

pip install langgraph langchain-core langchain-openai python-dotenv

2. 环境变量配置

from dotenv import load_dotenv
load_dotenv()

LangGraph智能工作流架构设计

在开始AI图像处理之前,我们需要设计一个完整的智能工作流架构。这个架构包含以下核心组件:

  1. 状态管理系统
  2. OCR文字识别节点
  3. 数学题识别与解答节点
  4. 工作流程控制模块

状态定义

from typing import Annotated
from typing_extensions import TypedDict

class State(TypedDict):
    messages: Annotated[list, add_messages]
    img_path: str

AI图像处理与数学题识别完整实现

1. OCR文字识别模块

def imgOcr(state: State):
    # 省略具体实现...
    return {"messages": res}

关键特性:

  • 支持多种图片格式
  • 智能识别数学公式
  • 图形内容自动描述

2. 数学题解答引擎

def mathNode(state: State):
    # 省略具体实现...
    return {"messages": res}

核心功能:

  • 智能理解题目内容
  • 自动推导解题步骤
  • 生成详细解答过程

OCR 识别结果: 已知虚数 ( z ) 满足 ( z + \frac{2}{z} \in R ),则 ( |z^2 + 2z - 3| ) 的最大值为 _______。

机器学习流程构建

工作流编排

builder = StateGraph(State)
builder.add_node("imgOcr", imgOcr)
builder.add_node("math", mathNode)
builder.set_entry_point("imgOcr")
builder.add_edge("imgOcr", "math")
builder.set_finish_point("math")

Python自动化实战应用

完整运行示例

imgPath = "./math_problem.jpg"
result = graph.invoke({"img_path": imgPath})
print(result["messages"][-1].content)

模型结果返回的是带Latex表达式,web渲染后:

AI+教育代码

import base64
import os
import mimetypes
from typing import Annotated
from typing_extensions import TypedDict
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langgraph.graph import START,END,StateGraph
from langgraph.graph import add_messages
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
load_dotenv()

class State(TypedDict):
    messages: Annotated[list,add_messages]
    img_path: str 


builder=StateGraph(State)

ocr_llm=ChatOpenAI(model="qwen-vl-max",
                   api_key=os.getenv("DASHSCOPE_API_KEY"),
                   base_url=os.getenv("DASHSCOPE_URL"))

math_llm=ChatOpenAI(model="qwen-math-plus",
                   api_key=os.getenv("DASHSCOPE_API_KEY"),
                   base_url=os.getenv("DASHSCOPE_URL"))


                   
                   
def imgOcr(state:State):
    mime_type, _ = mimetypes.guess_type(state["img_path"])
    with open(imgPath,'rb') as img_file:
        encoded_image=base64.b64encode(img_file.read())
        encoded_image_str = encoded_image.decode('utf-8')
    data_uri_prefix = f'data:{mime_type};base64,'
    encoded_image_str = data_uri_prefix + encoded_image_str  
    prompt=ChatPromptTemplate.from_messages(
        [
            ("user",[
                    {
                        "type":"image_url",
                        "image_url":{"url": encoded_image_str},
                    },{
                        "type": "text",
                        "text": "{user_prompt}"
                    }
                ]
            )
        ]
    )
    parser = StrOutputParser()
    chain = prompt | ocr_llm | parser
    
    res=chain.invoke({"user_prompt": "请分析上传的图片,识别完整题目内容,复制题目文字内容,如果存在图形,需要认真解读图形内容,为解题提供文字描述,并对识别出来的内容分类,比如数学/语文/英语/物理/化学/生物等"})

    return {"messages":res}

def mathNode(state:State):
    imgDesc =state["messages"][-1].content
    print("imgDesc: ",imgDesc,"/n")
    mathPrompt=ChatPromptTemplate.from_messages(
        [
            ("system","You are a helpful math assistant."),
            ("user","Image description: {imgDesc},User question: 图片描述中的正确答案是什么,使用中文")
        ]
    )
    parser = StrOutputParser()
    chain= mathPrompt | math_llm | parser
    res=chain.invoke({"imgDesc": imgDesc})
    print("结果: ",res,"/n")
    return {"messages":res}


builder.add_node("imgOcr",imgOcr)

builder.add_node("math",mathNode)

builder.set_entry_point("imgOcr")
builder.add_edge("imgOcr","math")
builder.set_finish_point("math")

graph=builder.compile()


imgPath = "./2024-10-13 18-10-21.jpg"
result = graph.invoke({"img_path": imgPath})

print(result["messages"][-1].content)

扩展应用场景

  1. 批量作业批改
  2. 在线教育平台
  3. 智能辅导系统
  4. 自动化考试系统

参考资源

  1. LangGraph官方文档
  2. LangChain开发指南
  3. OpenAI Chat接口兼容
  4. 开源微信机器人

推荐