当前位置: 首页 > news >正文

山东大学项目实训——基于DeepSeek的智能写作与训练平台(十二)

LangChain开发阶段总结:从模型接入到全文连续检索生成

一、为什么选择langchain

在项目实训前期,我们构建了用于作文智能生成与优化的部分系统。为了提升AI生成作文的质量、连贯性与素材利用效率。为实现这一目标,我们引入了LangChain这一面向大模型应用开发的高级框架。

LangChain不仅提供了统一的模型调用、数据链构建和运行管理能力,还通过其表达式语言LCEL支持复杂流程的异步、流式与模块化编排,极大地提升了我们的开发效率与系统可维护性。

二、阶段一:DeepSeek模型接入LangChain

LangChain内置了OpenAI等主流模型接口,但我们的项目采用学院提供的DeepSeek API,因此必须通过自定义LLM类方式完成接入。

1. 自定义模型类结构

我们继承了BaseChatModel与LangChain的LLM接口,构造了如下类:

此类实现了 _call() 方法,将 DeepSeek 的 API 请求与 LangChain 的运行机制集成,核心包括:

消息格式转换(LangChain消息类 ↔ DeepSeek格式)

请求构造与响应解析与推理中冗余内容清理(如 <think> 标签)

2. 实现效果

完成后,系统即可将 LangChain 中任意 PromptTemplate 输出传入 DeepSeek 模型,作为后续检索-生成流程的基础。

三、阶段二:基于LCEL构建检索问答链(RAG)

模型接入后,我们进入系统的主体功能开发阶段:构建基于语料库的检索问答链。这一阶段的核心是使用LangChain的LCEL(LangChain Expression Language),实现作文素材的智能检索与结合式生成。

1. 向量数据库构建

前期,我们完成了向量数据库模块,支持:

本地文档的embedding向量化

向量检索器retriever生成

素材持久化与初始化逻辑判断

以及大模型的封装,deepseek 模型接入LangChain 继承 BaseChatModel

2. LCEL链式编排逻辑

LCEL以数据流的形式构造链条,其中每个组件均需实现Runnable接口。我们的检索问答链由如下部分构成:

retrieval_chain = retriever | combiner

qa_chain = (

    RunnableParallel({

        "context": retrieval_chain,

        "input": RunnablePassthrough()

    })

    | prompt

    | llm

    | StrOutputParser()

)

这段代码完成了:

retriever:从向量数据库中获取与当前段落主旨最相似的素材

combiner:合并素材内容,构造上下文context

RunnableParallel:并行输入用于检索的context与大模型输入

PromptTemplate:构造问答Prompt

llm & Parser:调用模型并解析结构化输出

通过这种方式,我们构建了基于高效的基于素材库的动态问答能力,使生成结果与已有内容更加契合。

四、阶段三:使用ChatPromptTemplate实现全文连续生成

尽管检索问答链显著提升了局部语句生成质量,但我们很快意识到一个更深层次的问题——生成结果缺乏结构连贯性与全文主旨一致性。为此,我们引入了LangChain的ChatPromptTemplate,结合上下文状态设计,构建出真正支持“全文连贯写作”的流水线。

1. 写作上下文状态管理

我们设定了三大关键上下文变量:

full_topic:整篇文章主旨,决定全文语境

paragraph_topic:当前段落主旨,控制局部生成方向

paragraph_text:当前段落内容,驱动检索内容和Prompt构建

这些变量在每次写作迭代中更新,并作为Prompt输入,持续强化全文一致性。

2. ChatPromptTemplate驱动的RAG链构建

结合状态变量和LCEL,我们构造如下生成链:

self.rag_prompt 是一个 ChatPromptTemplate 实例,具备如下优势:

结构模板化:保证每次生成都遵循统一结构

语义嵌入式提示:动态注入主旨与段落信息

可持续扩展:支持多轮上下文生成链整合

部分调试结果截取:

3. 写作流程控制入口

最终我们构建了主控方法 generate_with_rag(),实现从输入语句到输出推荐句的完整流程:

1.状态刷新:判断输入是否为新段落,更新当前段落文本;

2.素材检索:根据段落主旨(字段非空时)或内容,向量检索相关语料;

3.生成提示构建:使用 ChatPromptTemplate 填充全文主旨、段落主旨、段落文本;

4.大模型调用:输入构造好的 Prompt,返回结构化 JSON 含:生成句子、推荐理由、段落,全文主旨修改建议;

  1. 主旨更新:若段落结束,自动更新全文主旨,重置段落内容,提升连贯性;

流程图

这让系统不仅可以“写一段好句子”,更能写一整篇结构合理、主旨连贯的文章。

http://www.xdnf.cn/news/941761.html

相关文章:

  • cpp自学 day26(智能指针)
  • 基于算法竞赛的c++编程(23)原码,反码,补码
  • 《双指针》题集
  • [特殊字符]01Linux基础入门教程——从起源到核心概念
  • 高等数学 | 第八章-向量值函数的积分与场论
  • JavaScript 语法结构
  • MySQL 索引失效:六大场景与原理剖析
  • 官网Numpy教程
  • leetcode.多数元素
  • 【PhysUnits】17.1 补充数值后量纲系统实现解析 (dimension.rs)
  • 一键压缩图片工具
  • 2000-2020年各省第三产业增加值占GDP比重数据
  • 网络安全基础
  • Python 调用 C 程序时输出顺序错乱问题分析与解决
  • 0x-2-Oracle Linux 9上安装JDK配置环境变量
  • 第五讲 基础IO
  • Go切片与映射的内存优化技巧:实战经验与最佳实践
  • 【LeetCode】算法详解#6 ---除自身以外数组的乘积
  • JUC并发编程(六)CAS无锁实现/原子整数/原子引用/原子数组/字段更新
  • Python训练营---DAY48
  • Java线程安全与同步机制全解析
  • 嵌入式学习笔记 - freeRTOS为什么中断中不能使用互斥量
  • 《最短路(Dijkstra+Heap)》题集
  • MySql读写分离部署(一主一从,双主双从,Mycat)
  • 为什么已经有 Nginx 了,还需要服务网关?
  • 【LUT技术专题】带语义的图像自适应4DLUT
  • Cherry-Studio搭建个人知识库智能体
  • JS的数据类型分类
  • 国产变频器与codesys控制器通信融合方案
  • gitee....