F095(2026-09-22):前端优先创建助手会话,后台沿用实时查找后更新/新建的逻辑,已补充前端预建及分析期间创建/编辑的合成回归。前端须保存state=0且c_session_id与问答记录一致;查询失败或同ID多条记录时停止本次写入,不当作缺失。真实DMS更新及前端联调仍待验证。
F084:会话摘要正文尽量控制在100字以内(含标点),用1至2句保留核心诉求、主要回复/结果和必要待确认事项;关键限定或否定不能省略时可适度超出。不机械截断或因超字数判失败,内部长会话笔记与其他分析字段保持原规则。重启后新分析生效,已完成且问答未变化的历史摘要不自动重写。
F076:标题和摘要同次生成独立多标签诉求类别,写入「营商助手 → 诉求词」草稿,续聊后更新并去重。详见诉求词分类与同步。
API启动后台监视者,每轮扫描完成后等待30秒再次扫描;模型使用独立线程池,默认同时处理4个不同会话。前端创建「助手会话」草稿并填写业务资料,同时在「助手问答记录」保存每轮问答。同一会话多条记录共用c_session_id。
后端只读「助手问答记录」,负责创建和维护「助手会话」草稿。 完整问答静默并分析成功后,按c_session_id查找目标,缺失则通过/content/addContent新建,存在则通过/content/updateContent更新;三次分析失败后也保存会话,失败原因及空分析字段见下文。两个栏目均明确查询states=0,不发布、不修改源问答。重复目标拒绝处理,不编造业务ID、企业信息或信用代码。写入前复读、写后回读校验;创建请求结果未知时不直接重放,下次先查询是否已保存。
模型完成后,提交前重新读取完整问答,版本变化就丢弃旧任务。写后再次核对,发现变化则标stale。DMS两栏目没有已核验的事务/CAS接口,因此存在远端并发窗口;下一轮继续核验。结果消费者应识别summary.status与source_sha256。
读取.env指定的DMS_BASE_URL、DMS_USERNAME、DMS_PASSWORD,同名环境变量优先。已核验的网页根地址使用/proxy_dms访问业务,/proxy_oauth/user/login表单登录(userName/password/clientId=0/serviceId=0,返回message为token)。也支持DMS_TOKEN,token仅存内存并以token头传递。直接/dms地址要求提供token,不猜测OAuth地址。
DMS_RECORDS_COLUMN_ID默认1889,DMS_SESSIONS_COLUMN_ID默认1887,DMS_DEMANDS_COLUMN_ID默认1891,分别对应助手问答记录、助手会话、诉求词。观察时核对栏目名称、父栏目营商助手、模型字段和类型。请求超时20秒,每栏目分页读取预算默认300秒(DMS_SCAN_TIMEOUT_SECONDS支持30至900秒,在每页请求前检查),每页500条。拒绝重定向,日志不输出凭据、原始响应、问答或企业资料。
当前部署只需DMS_BASE_URL、DMS_USERNAME、DMS_PASSWORD,不需要设置DMS_TOKEN。登录得到的token仅存内存,不写回.env。业务请求收到212或HTTP401时,用同一账号重新登录并最多重试原请求一次;换token后仍失效、登录凭据被拒绝或权限不足则停止观察并明确报错,不循环登录。登录网络故障至少冷却30秒后再试;普通写请求发生超时/网络错误时不自动重放,避免未知结果被重复提交。
若DMS_STRICT_SCOPE=true,DMS_ALLOWED_SCOPES_JSON必须精确允许营商助手下的助手问答记录、助手会话和诉求词,名称HTML解码并去首尾空白,星号不扩权。只检查指定栏目及其父栏目元数据,不遍历其他模型。201/HTTP403、作用域或模型不匹配后停止观察器访问,修正配置后重启,不扩大权限。兼容仅提供token的直连配置,但没有账号密码时无法自动重新登录。DMS故障不停止正常问答。
所有会话首先独立生成非空摘要,再由字段阶段独立返回三个判断;三项全部为是才执行招商分析。非营商咨询也生成摘要,但不生成业务关注点,未进入第二阶段时清空旧招商分析字段。提示词仍在src/step5_session_analysis/prompts,用户/助手文本均为数据,助手推荐不能当用户事实。长输入按当前模型预算分段压缩后分析,不截掉历史轮次;详见下文长会话处理。
核心需求不限制条数或字数,按用户实际表达提炼;没有明确需求时可返回空数组。仅要求字符串数组、每项非空白且不重复,首尾空白和换行不再触发失败;不补字、截断或编造需求。所有摘要/分析文本均无字数硬限制;对话总结、关注点名称/描述只要求非空字符串,关注点不限制条数、允许空数组、名称不重复。提示词要求尽量精简且保留关键信息,已删除字数校对分支。结构错误仍最多两次有界修正。提示/分析版本变化只为尚未成功的任务重置尝试预算,不重写内容未变的已完成结果;需重启后生效。
| 助手会话字段 | 保存值 |
|---|---|
| title / c_title | 同一次独立摘要生成的会话标题,同时保存至标题(内置)和标题;旧结果无title时保留原值 |
| c_session_id | thread_id,精确匹配 |
| c_created_at | 助手会话首次保存时间;已有非空值保持不变 |
| c_updated_at | 本次摘要分析或状态实际写入时间 |
| qpyszx | 是否为青浦营商咨询,布尔值 |
| qyzt | 是否可识别企业主体,布尔值 |
| rzqpyx | 是否有入驻青浦意向,布尔值 |
| c_focus_points | 关注点JSON数组文本,保留名称与描述;无则[] |
| c_settlement_intent_level | 高/中/低,未进入第二阶段则空字符串 |
| c_core_needs | 核心需求JSON数组文本;无则[] |
| jygjbm | 部门、职责、推荐理由JSON数组文本;无则[] |
| c_description | 对话总结,无则空字符串 |
| summary | 完整分析JSON文本,含版本及状态元数据 |
summary对象包含schema_version=1、thread_id、status、source_sha256、analysis_version、analyzed_at、stored_at、summary(简短总结或null)、consultation、investment,F076新增demand_words诉求词数组;过期时增加stale_at。时间统一上海时区。该对象是当前后端分析契约。
创建只提交草稿状态与上表字段,更新额外提交既有记录ID,不回传旧企业信息、登录信息等字段。写后重新读取,校验ID及保存字段,不以HTTP成功直接认定保存成功。前端维护业务资料,后台只补写上表的标题、摘要、分析及保存时间字段;已有c_created_at保留。前端预建记录即使summary为空也按已有记录更新,不以摘要是否存在判断是否新建。
F075:时间字段提交Unix毫秒时间戳,展示按上海时区(+08:00)解释;时间由保存程序生成,不由模型生成。新建时两个时间相同;更新保留已有c_created_at,只刷新c_updated_at。旧记录c_created_at为空时优先用有效的系统create_time补齐;系统时间也缺失/无效则记录本次首次补齐时间,不代表历史真实创建日期。成功、失败说明和过期状态写入均维护时间;内容未变且没有写入时不刷新。回读按同一时间点比较,兼容秒、毫秒和ISO格式,字段未落地明确报错。历史记录不批量回填,只在后续实际写入时补齐;需重启后端生效。已只读核验真实模型两个字段均为timestamp,新增/更新传输由合成回归验证,生产写回未复验,F059既有更新问题仍保留。
API自动启动。仅独立分析时运行python -m src.step5_session_analysis,不要与API同时运行。共享本地OS锁防重复启动;跨机器多实例不在本次范围。
API/CLI不再创建会话JSON,旧SESSION_DIR文件原样保留且不再扫描,Redis上下文不变。data/dms-session-observer/analysis/.state保存哈希、计时、状态、版本、尝试次数及诉求词同步指纹;下游分析失败时还暂存已生成的标题、摘要与诉求词以供失败落库,不保存原始问答。结果存DMS,可据指纹重启去重;不要擅自删除调度状态,否则失败次数无法保留。
同版本模型任务最多尝试3次,至少间隔5分钟,重启不清零;新内容或版本重置预算。助手会话缺失不阻止分析,保存时实时查询并按需补建;分析期间前端已创建的会话也会复用其记录ID。缺失问题/回答(含空白文本)分别记录dms_missing_question/dms_missing_answer,其他类型错误单独分类;不跳过缺失轮次后分析残缺会话,不替前端造回答。同一批数据异常只在首次发现或异常集合变化时记录计数,全部恢复时记录恢复信息;不会每5分钟重复刷相同缺失数据。其他服务/分析错误仍限频5分钟,日志不含正文。
验证命令:
.\.venv\Scripts\python.exe -m unittest discover -s src/step5_session_analysis/tests -q
.\.venv\Scripts\python.exe -m unittest discover -s src/step4_api/tests -q
.\.venv\Scripts\python.exe -m unittest discover -s src/step3_question_answer/tests -q
# 真实DMS只读检查,输出计数,不调用模型、不写入记录:
.\.venv\Scripts\python.exe -m src.step5_session_analysis.dms_check
已核验真实登录、字段、草稿分页和查询接口;合成测试覆盖写回映射、只读限制、计时、去重、重试和竞争。本轮尚未重启生产监视者、向真实记录新增/更新或完成前端验收。旧文件观察器测试及历史模型样例不代表DMS生产链路验收,实际状态见feature_list.json。
真实部署的助手会话带c_session_id过滤读取返回202,无过滤读取正常。仅在目标栏目过滤读取发生dms_service_failed时,回退一次同栏目完整草稿分页读取并在内存精确匹配ID;不扩展栏目或状态,不将错误/不完整分页视为空结果。权限和认证错误不回退。完整列表回退会增加读取成本,仍受分页与时间预算约束。多机器或其他写入者并发创建需要服务端唯一约束/幂等支持,当前仅支持既有单观察器锁。
按JsonModel配置的上下文容量扣除输出和消息余量,并为结构修正预留输入空间。短会话原样分析;超长会话按轮次及用户/助手/展示/账号字段分段(超长单字段连续切分),每段都交给模型提炼有序事实笔记,再进入同一两阶段分析。提示明确区分用户事实与助手建议,保留条件、更正和撤回。压缩最多4层/64次调用,输入无法容纳提示或不能收敛时明确失败,不返回残缺的成功结果。不放大模型配置的真实容量;模型压缩仍需业务语义验收,不能保证绝对无损。
DMS开始、完成、失败、失败保存日志包含session_id,值等于前端thread_id及DMS c_session_id;dms_record_id为助手会话记录主键(尚未创建或不唯一时null),session_ref仍是会话ID的SHA256前16位。ID以JSON字符串转义,日志不含问答或异常原文。全局扫描故障无单个会话时ID为null。
同内容及分析版本最多3次模型任务(含首次),失败后至少间隔5分钟。耗尽后仍创建/更新助手会话草稿:c_description及summary.summary保存中文失败原因与安全错误码;summary.status=failed,另存attempts、error_code、failed_at、stored_at、源指纹及版本,consultation和investment为null。
失败时其他分析字段全部清空:qpyszx/qyzt/rzqpyx为null(未知,不能显示为否);c_focus_points/c_core_needs/jygjbm为JSON空数组文本[];c_settlement_intent_level为空字符串。无关企业资料不修改。前端根据summary.status区分成功/失败/过期,失败只展示原因,不能把null转换为业务否定。
摘要缺失不会重置分析次数。失败记录同版本同指纹时,后续静默扫描、普通重启或本地调度状态缺失均不重跑模型。DMS失败记录保存遇临时错误时,至少间隔5分钟仅重试保存,先复读目标避免未知写结果重复创建;权限等致命错误按原规则停止观察器。新问答/修改问答或分析版本变化可重试,成功后正常结果替换失败说明并填写分析字段。已成功且内容不变的记录不因版本变化重写。
失败保存前后同样复读源指纹,变化时丢弃或标stale;跨栏目无CAS仍有短暂竞争窗口。当前70项分析回归与3组合成长文真实模型验证通过,生产DMS写回、布尔null清空和前端显示需重启后复验。
SESSION_ANALYSIS_CONCURRENCY默认4,合法范围1至32,环境变量优先于.env,修改后需重启。多个满足静默条件的会话可并行处理,同一会话(含新旧修订)只运行一个任务;会话内长文压缩与两阶段分析依次执行。达到上限后后续会话留在待处理状态,不无限提交线程池队列。已完成任务在扫描后独立回收、写回并释放名额,快任务不等待其他慢模型任务;扫描/结果写回仍串行,可能增加可见延迟。停止服务等待在途任务结束并按原一致性检查收尾。
单观察器进程/本地锁约束不变,模型工作线程仅分析自身输入,DMS操作和调度状态仍由观察线程维护。默认并发值没有经过生产供应商吞吐/限流验收。
第二阶段提示追加由同一31项校验名单生成的允许值,职责说明使用标准名称。程序只归一首尾空白、明确简称与青浦区/上海市青浦区同部门全称,不按相似度推断部门,也不把市级或其他区部门转成本区。归一后的结果保存标准名称;角色与理由保持,重复部门仍拒绝并修正。
department_name_invalid和department_duplicate修正反馈包含错误项位置、名称预览、允许值与专用说明,最多两次修正。未知或歧义名称仍可能失败,不通过放开名单掩盖错误。预算不足时缩减修正反馈,不删原会话事实。新版本允许旧失败重新尝试,已成功且内容未变的会话仍不重写;需重启后生效。
.\.venv\Scripts\python.exe -m src.step5_session_analysis.run_session --session-id "<c_session_id>"
这是明确的真实模型和DMS写入操作,只处理提供的会话ID,跳过静默/全局排队。复用当前完整SessionAnalyzer和DmsRepository,只读问答、创建或更新助手会话草稿,保存后逐字段及完整结果回读。成功输出session_id、dms_record_id、completed、stored_at、轮数及是否执行招商阶段,退出0;失败输出安全错误码,退出1,不输出问答正文。相同源指纹和当前分析版本的已完成结果直接复用,源变化或目标并发修改时停止。
每次命令最多3次即时模型尝试(不等待后台5分钟重试间隔);最终模型失败保留原结果并报错,不覆盖失败说明。后台原失败落库策略不变。三判断并非全是时正常不执行招商阶段,这不代表测试失败。手工成功不替代后台静默调度验收。远端缺少事务/CAS,提交前后复读仅缩小竞争窗口。
写回校验失败时日志details列出mismatch_fields和栏目ID,不输出字段值;扫描超时details列出页数、耗时及预算。2026-09-18真实旧记录更新仍存在接口成功但内容及更新时间未变化的问题,根因待DMS服务端核查,不以成功响应代替保存证据。
2026-09-18独立摘要:summary.md先于字段分析执行,输入完整会话或相同的完整压缩结果。字段分析不改写摘要,摘要通过内部对话总结及顶层summary兼容既有存储。后续字段失败时后台保留同源摘要,三次失败写入仍标failed;摘要阶段自身失败仍明确报错。旧completed不因版本改变自动重跑;本轮未迁移DMS摘要字段的JSON存储结构。
2026-09-18本地部署配置:会话并发调整为8,共享模型并发为12;代码默认仍4/8。重启后生效,共享模型池还服务问答及公司分类,无专用保留名额。只提高配置,未验证生产提速比例,DMS扫描/写回依然串行。
2026-09-18展示标题:独立摘要输出title和summary,不增加额外模型调用。标题同时写入DMS内置title和业务c_title并分别严格回读,内部完整JSON也包含title。无标题/空标题触发有界修正;后续业务分析失败时后台保留同源标题。旧completed不自动重跑补标题;重启后新任务和问答变化后的重分析生效。
2026-09-22 F096:真实模型只读确认业务标题为c_title(text),启动时校验该字段。114项合成回归通过;未真实写回或回填历史,需重启后端。