目录
- 构建一个自带“思考与复盘”的 AI 论文写作系统
- 1. 系统架构设计
- 2.核心组件与代码实现解析
- 2.1 状态定义
- 2.2 节点功能拆解
- 2.21 大纲生成与首轮检索
- 2.22 拟稿与自我反思
- 2.23 针对性补充检索
- 3. 图结构构建与条件路由
- 4.运行与体验
- 5.总结与展望
构建一个自带“思考与复盘”的 AI 论文写作系统
在使用大模型模型(LLM)写长文章或者论文的时候,单次Prompt往往存在着模型幻觉、结构混乱和内容深度不够的问题。单凭一次性的文章生成,模型很难同时做好大纲规划,资料搜集、长文撰写和自我审核校验。
为了解决这一个问题,我们可以借助LangGraph 将单个 LLM 拆解为多个具有专业分工的 Agent(规划者、研究员、撰写者、审查者),并通过图结构构建一个可以进行自动迭代、自行审稿和的修订的工作流。
1. 系统架构设计
该系统的核心在于反思和修订循环(Reflection & Revision Loop)。整体架构可以分成下面几个步骤:
从该流程图可以看出:系统不是一次性写完文章,而是进入生成->审查->重新检索资料->迭代修改的闭环,直到达到最大修改的次数。
2.核心组件与代码实现解析
2.1 状态定义
classAgentState(TypedDict):task:str# 用户的写作任务/主题plan:str# 生成的大纲draft:str# 当前文章草稿critique:str# 教师 Agent 给出的审查/修改意见content:List[str]# 搜索引擎检索到的外部资料列表revision_number:int# 当前迭代轮次max_revisions:int# 最大迭代轮次限制2.2 节点功能拆解
每个节点都会负责工作流中的一个特定任务,封装了LLM调用或者外部API接口。
2.21 大纲生成与首轮检索
- plan_node:根据用户的任务目标,生成包含章节的高级大纲。
- research_plan_node: 使用结构化输出(with_structured_output(Queries))提取最多3个搜索关键词,通过Travily API抓取实时网页内容作为写作素材。
defresearch_plan_node(state:AgentState):queries=model.with_structured_output(Queries).invoke([SystemMessage(content=RESEARCH_PLAN_PROMPT),HumanMessage(content=state['task'])])content=state['content']or[]forqinqueries.queries:response=tavily.search(query=q,max_results=2)forrinresponse['results']:content.append(r['content'])return{"content":content}2.22 拟稿与自我反思
- generation_node: 结合大纲、检索到的外部资料以及用户的task,撰写或修改文章草稿,并将修改次数revision_number自增。
- reflection_node : 模拟“教师“的角色,对生成的草稿进行审查,从逻辑、深度、篇幅和语言风格等方面提出批评与改进意见。
2.23 针对性补充检索
- research_critique_node: 当审查节点提出具体意见时,该节点对审查意见生成新的搜索词,补充检索更多的针对性资料。
3. 图结构构建与条件路由
定义完成状态和节点之后,我们使用StateGraph将他们连接在一起,并且通过条件边控制逻辑跳转:
# 1. 初始化图状态builder=StateGraph(AgentState)# 2. 注册节点builder.add_node("planner",plan_node)builder.add_node("generate",generation_node)builder.add_node("reflect",reflection_node)builder.add_node("research_plan",research_plan_node)builder.add_node("research_critique",research_critique_node)# 3. 设置入口点与固定边builder.set_entry_point("planner")builder.add_edge("planner","research_plan")builder.add_edge("research_plan","generate")# 4. 路由控制逻辑defshould_continue(state):ifstate["revision_number"]>state["max_revisions"]:returnENDreturn"reflect"# 5. 添加条件边builder.add_conditional_edges("generate",should_continue,{END:END,"reflect":"reflect"})# 6. 反思闭环边builder.add_edge("reflect","research_critique")builder.add_edge("research_critique","generate")# 7. 结合内存持久化编译图memory=SqliteSaver.from_conn_string(":memory:")graph=builder.compile(checkpointer=memory)代码分析:
- 结构化循环:使用should_continue函数来判断是否需要继续优化草稿。如果达到了max_revision,流程终止流向END;否则进入reflect进一步提意见。
- 状态持久化与Memory:使用SqliteSaver保存线程的执行状态,支持长对话的断点恢复和历史追踪。
4.运行与体验
调用编写好的graph时,只需要传入初始参数即可以流的形式实时查看各个节点的产出;
thread={"configurable":{"thread_id":"1"}}forsingraph.stream({'task':"what is the difference between langchain and langsmith","max_revisions":2,"revision_number":1,},thread):print(s)在前端配合 Gradio 等 UI 框架,可以实现将内部节点的执行进度、搜集到的文献、每次修稿的差异直接可视化呈现给终极用户。
5.总结与展望
这套基于 LangGraph 的多 Agent 方案展示了现代 LLM 应用的核心哲学:用结构化的工作流补充单模型能力的不足。
- 优点:引入联网搜索(Tavily)消除了模型时效性差的问题;引入“反思-修稿”闭环大大提升了文章的完备度与专业度。
- 可扩展的点:(1)接入知识库(RAG):将 Tavily 搜索替换或叠加为本地向量数据库。 (2)人机协作:在自我审查(reflect)节点之后允许用户手动进行干预,输入人工意见之后,再继续生成。