【Python AI开发】LangGraph教程: 搭建AI+教育应用案例
本文介绍了如何使用LangGraph、LangChain、qwen-vl和qwen-math等工具搭建一个AI+教育的智能工作流,以提高数学教学的效率和质量。
- defagi
- 2 min read
近期,人工智能技术在教育领域的应用日益增多,但特别是在数学教学方面,其表现尚有提升空间。为了尝试下阿里最新的的千问2.5模型.采用LangGraph,LangChain,qwen-vl,qwen-math搭建了AI+教育智能工作流.实现了图片OCR识别数学题,数学模型负责解答问题,整个推理解答过程比GPT4强。最后与开源的微信机器人整合就实现了拍照上传题目,AI解题的过程.
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图像处理之前,我们需要设计一个完整的智能工作流架构。这个架构包含以下核心组件:
- 状态管理系统
- OCR文字识别节点
- 数学题识别与解答节点
- 工作流程控制模块
状态定义
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)
扩展应用场景
- 批量作业批改
- 在线教育平台
- 智能辅导系统
- 自动化考试系统