From d4d23068e54e98244f6d372faeb5fc075140be66 Mon Sep 17 00:00:00 2001 From: jinye_huang Date: Wed, 9 Jul 2025 14:51:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=A4=9A=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E6=A8=A1=E5=9E=8B=E5=8F=82=E6=95=B0=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E7=8B=AC=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/ai_model.json | 6 ++-- config/content_gen.json | 12 ++++++- config/resource.json | 2 +- config/topic_gen.json | 6 +++- core/ai/__pycache__/ai_agent.cpython-312.pyc | Bin 8337 -> 9182 bytes core/ai/ai_agent.py | 34 +++++++++++++----- .../content_generator.cpython-312.pyc | Bin 3995 -> 4981 bytes .../content_judger.cpython-312.pyc | Bin 4541 -> 5519 bytes .../topic_generator.cpython-312.pyc | Bin 5663 -> 6457 bytes utils/tweet/content_generator.py | 21 +++++++++-- utils/tweet/content_judger.py | 21 +++++++++-- utils/tweet/topic_generator.py | 15 +++++++- 12 files changed, 95 insertions(+), 22 deletions(-) diff --git a/config/ai_model.json b/config/ai_model.json index fe6ab4c..5ede62a 100644 --- a/config/ai_model.json +++ b/config/ai_model.json @@ -2,9 +2,9 @@ "model": "qwen-plus", "api_url": "https://dashscope.aliyuncs.com/compatible-mode/v1", "api_key": "sk-bd5ee62703bc41fc9b8a55d748dc1eb8", - "temperature": 0.8, - "top_p": 0.5, - "presence_penalty": 1.1, + "temperature": 0.3, + "top_p": 0.4, + "presence_penalty": 1.2, "timeout": 120, "max_retries": 3 } \ No newline at end of file diff --git a/config/content_gen.json b/config/content_gen.json index 38331ea..630f569 100644 --- a/config/content_gen.json +++ b/config/content_gen.json @@ -3,5 +3,15 @@ "content_user_prompt": "resource/prompt/generateContent/user.txt", "judger_system_prompt": "resource/prompt/judgeContent/system.txt", "judger_user_prompt": "resource/prompt/judgeContent/user.txt", - "enable_content_judge": true + "enable_content_judge": true, + "model": { + "temperature": 0.3, + "top_p": 0.5, + "presence_penalty": 1.2 + }, + "judger_model": { + "temperature": 0.2, + "top_p": 0.3, + "presence_penalty": 0.8 + } } \ No newline at end of file diff --git a/config/resource.json b/config/resource.json index 9129274..8917acb 100644 --- a/config/resource.json +++ b/config/resource.json @@ -16,7 +16,7 @@ "refer_list": [ { "path": "resource/prompt/Refer/2025各月节日宣传节点时间表.md", "sampling_rate": 1, "step": "topic" }, { "path": "resource/prompt/Refer/标题参考格式.json", "sampling_rate": 0.25, "step": "content" }, - { "path": "resource/prompt/Refer/正文范文参考.json", "sampling_rate": 0.25, "step": "content" } + { "path": "resource/prompt/Refer/正文范文参考.json", "sampling_rate": 0.5, "step": "content" } ] }, "object": { diff --git a/config/topic_gen.json b/config/topic_gen.json index a31d6c7..a69701f 100644 --- a/config/topic_gen.json +++ b/config/topic_gen.json @@ -1,7 +1,11 @@ { "topic_system_prompt": "resource/prompt/generateTopics/system.txt", "topic_user_prompt": "resource/prompt/generateTopics/user.txt", - "model": {}, + "model": { + "temperature": 0.2, + "top_p": 0.3, + "presence_penalty": 1.5 + }, "topic": { "date": "2024-07-20", "num": 5, diff --git a/core/ai/__pycache__/ai_agent.cpython-312.pyc b/core/ai/__pycache__/ai_agent.cpython-312.pyc index a0f2cd8b53d9583a7bc6a9ff550ad90f9392400f..4402035f8e556062d7a0bb72795fd81a180071fd 100644 GIT binary patch delta 3166 zcmai0e^37ZC2wy`?Jd1*0UM zt&Ny(Qb^PcnQ1GIjm2?ltE7Ji z_kG{@eed&r?Atw3@!5-p>w3M0fa`Ok|CQIX&KRO(uN|-9dVCDX0KpLrBug|&0lqmPxMWTa16$&frb6O2y zwMc`Qo+UQQK&%lJAXdy0mnf}s!&*_vD_B}o9wk`CahacFm0_JQ?X^RTt|+Ywbg-)u z)vWrcoYjb$A{UqW&mxTsCutm4^+iK5P_> zDJulgVL)eSm&_!XQG)WIa)mV`tzJd+lTAM&h_G3Wo!OF6zY39`RM^nFb8Kjh%!&S^ zuq_6#qDIt;vfmm`DN=^_6RdoXj39m~8<4$0(?r)%^j=3P_Sk~qyD`F< ze2_%iBS{>JO?zCCJ_%l`!OKi?v;LnKE%uU~%!3C_YP^eQHOP!Fh_5*9Z6~oyR!{6C zKa}kxy>q+&ffj2o_A;|Bf$Iu#d<%>gu7ru7KN-95o7mxf@pnf4dGS#E%@eW6xd-nZ zjvu=a-+Mwc>lh;hg3ZAaW@8|@F!~9((tH2oL~_=F+9eb__>1_#y|G{QJs3O}KmB`vbMNipyBFS!5BxfIdEox( zk=Uho(BCpWNUQ6rul<_b`Zd`UCAxDUyUg87mq9r`{6XyfpQoIZFtY+J>yZ^LY3orH zrlKh8u@*8@s#s!`R}rPV0xZ`VRdsQp5RByzpADP52NMQJR1p$* zuBEHn2@B@#M<2z0_Cf6Qp?IVp0=U0-AU<%8>2~0~dnev1V($M5#SUB$0^2!1q`ZXT zDcI`9)+(w~@b6!KAC>FvG#?dfGUT zQSgO8z!bDlloH?{3`RA{3N~Yx=rv6OyS%I5LP<_PsrLF6sy-!W((R1WSq(l|mzG@q&r zhqd(wwf#N)ozmRO(W)`)Xvx?XY4aATzERrLBsB%49U)2BDFt^)w%rq|o;yz0q%(iq znLnI$-Zk#6y6t>EqDz`dTd5u^9Ltt$TP9TX=%~r7@~Rz?7ZX%Ix?w6(Ol7*K=FLah z=AYz#YRep`IZ`uJGE^uPJwMtmt*;wxmNs@s+jmJFyCtS)!nOy!YOY!Oy&6-lykXr) z*J!=us=Z~aO%#K>FE^uqne&Wwq|$Bq<`F}98_BP}w4p*v!GeMz_wbex-za%z`$*Gh z&S=%unkzMvRa?iawn~+aQX?m|2@=Y1#8B(NoyLVtfmRmHuQyM zes4-#KAJ6+ub0+un5b)OB*_*tnCw~&d*HtZxTwG-tq6y0jT)C%0+AE zlYd@Pp{sUKAFm{<4T_Ifl>+~l5_Pp%^N9@epRAOD(p9oz9xTT4@?mk!KmvcwOk?UW zuFa*d%`2(MtufNq)e6|ZZnS{xdQSctBYh(&xnb0S*^B2!ly2(`vV+Rq zt*Usa+(^uko!2U@C delta 2305 zcmZuyTWl2989sBLy^rnnZN0l*3|@O`VdG0;lbASL9B;tMQbeN03xv8pv&$}fL9^r1 z*s~2HD7clYkQ}9?LRN)T6<4&CBTK2v1;i-`;xwe< z45Sq{K||&^8|Q2QdLXOtki&mo5ul)m3a{Ak&z@kLv2Q|z;&CqSfVSfx?u2%1Cn&ZA z3mw?srMRK9g76q|9cRyxoOtkY&ns?OT1K=+BaxGXysBu^YHo_Hu2&@C_!|D-rjgG1 zIaUX03hfr_(C>JO;jrULpFa#)ojVN{=yO!nlLC+{Vy;C&6RHRRX&%*xK3`GPY!-xL zRa#P=qx(KT+9kMJUj(3NvjM#7wk+45X$i?fm`>Ld5)2N2l0ul*2`@XE6~axA2DKd1 zz6bVy5jte%55hUVy7n68I?Dj?E9MmQI>&*c{eL*Oc*Ge@v*^$nH44RaYo+{{*wAmc z>Kz4dIH%|&n4J4I7q576!D zHjDH66WUO-Z3pMEBB1+r8(VZ&yFUi)x&t~+v(Tx#@h-4dbPDL6N29Yq8?mComPb29 z+8;a(pnrj}0_glPdJxQiO{kGlkZcc3WQ&s4^B{;zmmc2uBCpZbTDsTL)}PR=+n{F# z12~iPT>>Et*XTT!wYmW7a82F?n?;8Lnt-m_15?5}g01RjYH`nn33BG7pGhaF`FmCE z2&D~JskO%~EkSPrYA-HgtA)UZ?-qd$IQ%cbMndJ`V{Ij&!2GobNrtUJIB*mPUT<;J z{|_v}=1Pq|bk8C8KD1x!;c*q+R)Qnor_2O6Lj93BLdk*YcJ!k219UYIM0Z_TZaR#! zqYvHTKrC71Q67*wrb?o2^nyO4@O`wuZnr^`2U+=$v{TFAh z|7rfl+{v#$n7?`S)QwZ`g=U!UzC>j`^wrt7xZNy?KYiL`RSZ?pyE+5`Aj~UR8*5qvke zU2E;~*}Z4>uC_-??Gf}<-H*^A?|8S-Hnh@wzJJAIME4snA2Rl5j8OK9H@DUjUUV*H z&rcXFvA=s`<$j#v&I{<@-mqskCHQN^o@^DA3gScF*-nh zyp4)(=0ASwNvwae)fVlsU!Vh6ztGBHqYG`3jd=1Y*NG>eZl;Ld!x1^)86W08V!Js6ScY83qO0R{4USeE3joAE|=M3PEQ>wfrL zA6@SCA=Y1^v<+LCd?BxD3N(dGs-VG?st%!R!KPYrKd4U=L2d?FP=AQ*tvdC~Bn8mD5Zvk;zYL>Mr6$?kSb9Fr5W$QcF!`742Xiswwo*h9HH| zwGDxh|1hHzr&4QyQ2AS}r_a)!9{pCkW^>OKPHumv?j6POY%JL}-R3G@x1K|KTeLY# z^6Vv|k0cYwOPk6i)d>2ctth9-LZws>(F#QPh#>9!MjXcX&2&b2N}WZ=Ha_p!LsPA{ J0Ff1={{qdMGgJTo diff --git a/core/ai/ai_agent.py b/core/ai/ai_agent.py index cb5b467..ff20913 100644 --- a/core/ai/ai_agent.py +++ b/core/ai/ai_agent.py @@ -45,7 +45,9 @@ class AIAgent: # self.tokenizer = tiktoken.get_encoding("cl100k_base") async def generate_text( - self, system_prompt: str, user_prompt: str, use_stream: bool = False + self, system_prompt: str, user_prompt: str, use_stream: bool = False, + temperature: Optional[float] = None, top_p: Optional[float] = None, + presence_penalty: Optional[float] = None, stage: str = "" ) -> Tuple[str, int, int, float]: """ 生成文本 (支持流式和非流式) @@ -54,6 +56,10 @@ class AIAgent: system_prompt: 系统提示 user_prompt: 用户提示 use_stream: 是否流式返回 + temperature: 温度参数,控制随机性 + top_p: Top-p采样参数 + presence_penalty: 存在惩罚参数 + stage: 当前所处阶段,用于日志记录 Returns: 一个元组 (generated_text, input_tokens, output_tokens, time_cost) @@ -63,8 +69,17 @@ class AIAgent: {"role": "user", "content": user_prompt} ] + # 使用传入的参数或默认配置 + temp = temperature if temperature is not None else self.config.temperature + tp = top_p if top_p is not None else self.config.top_p + pp = presence_penalty if presence_penalty is not None else self.config.presence_penalty + + # 记录使用的模型参数 + stage_info = f"[{stage}]" if stage else "" + logger.info(f"{stage_info} 使用模型参数: temperature={temp:.2f}, top_p={tp:.2f}, presence_penalty={pp:.2f}") + input_tokens = self.count_tokens(system_prompt + user_prompt) - logger.info(f"开始生成任务... 输入token数: {input_tokens}") + logger.info(f"{stage_info} 开始生成任务... 输入token数: {input_tokens}") last_exception = None backoff_time = 1.0 # Start with 1 second @@ -75,9 +90,9 @@ class AIAgent: response = await self.client.chat.completions.create( model=self.config.model, messages=messages, - temperature=self.config.temperature, - top_p=self.config.top_p, - presence_penalty=self.config.presence_penalty, + temperature=temp, + top_p=tp, + presence_penalty=pp, stream=use_stream ) @@ -90,26 +105,27 @@ class AIAgent: # 简化处理:流式模式下,我们返回拼接后的完整文本 full_text = "".join([chunk for chunk in self._process_stream(response)]) output_tokens = self.count_tokens(full_text) + logger.info(f"{stage_info} 任务完成,耗时 {time_cost:.2f} 秒. 输出token数: {output_tokens}") return full_text, input_tokens, output_tokens, time_cost else: output_text = response.choices[0].message.content.strip() output_tokens = self.count_tokens(output_text) - logger.info(f"任务完成,耗时 {time_cost:.2f} 秒. 输出token数: {output_tokens}") + logger.info(f"{stage_info} 任务完成,耗时 {time_cost:.2f} 秒. 输出token数: {output_tokens}") return output_text, input_tokens, output_tokens, time_cost except (APITimeoutError, APIConnectionError) as e: last_exception = RetryableError(f"AI模型连接或超时错误: {e}") - logger.warning(f"尝试 {attempt + 1}/{self.config.max_retries} 失败: {last_exception}. " + logger.warning(f"{stage_info} 尝试 {attempt + 1}/{self.config.max_retries} 失败: {last_exception}. " f"将在 {backoff_time:.1f} 秒后重试...") time.sleep(backoff_time) backoff_time *= 2 # Exponential backoff except (RateLimitError, APIStatusError) as e: last_exception = NonRetryableError(f"AI模型API错误 (不可重试): {e}") - logger.error(f"发生不可重试的API错误: {last_exception}") + logger.error(f"{stage_info} 发生不可重试的API错误: {last_exception}") break # Do not retry on these errors except Exception as e: last_exception = AIModelError(f"调用AI模型时发生未知错误: {e}") - logger.error(f"发生未知错误: {last_exception}\n{traceback.format_exc()}") + logger.error(f"{stage_info} 发生未知错误: {last_exception}\n{traceback.format_exc()}") break raise AIModelError(f"AI模型调用在 {self.config.max_retries} 次重试后失败") from last_exception diff --git a/utils/tweet/__pycache__/content_generator.cpython-312.pyc b/utils/tweet/__pycache__/content_generator.cpython-312.pyc index ffd7c040c714c7fad1ae298c80d8ef8be2954545..99c832a234ffe847368d9482b633cda9976c3879 100644 GIT binary patch delta 2366 zcmbVOU2GFa5Z?8j&pzLs?O>AFv56C6AciE+@RJmUf*V>yl2)Pys-#4&r7x5uFPxIvs;gdR!1#fCN)D#O&`wD!U3xNY640*abxUTR>#5TIMm&nJ?QQb>>N^%qZU_r6m-X zrS`$JET!e^m5_s>FRv_;c%vn{l1h@rH$ff>nIUIQjFC7PYZ_Ow@CgiId zM(J6*KOb1D2R3Vg&DUO=ZQnl=c$uI+ysB5XXw@wf!tAaCGu6FCUG+4zg(JJ3z~8wW z*6SK|5iU!D93z)wq&O6is!%U6o{@#)LN{gK(p6Jl@E<6#lL{`zYD!nlzU-6tR zXIJdU;TWsf6uW8}6KGsvg0lF*;2PAJUKV+3r75dd7;b$KUrAbYiEgp%9IY@P!FS*Z zAUfZm0C=DJfO^|%1qbjY&#^fN`KTJbPR%f@oGg&nnT}Eo>JL^A$C~Nnc&t_l*AtZD zMX&lNy;6OT2|njjEN6jOb)GUcAyD`zP6&bom9yt;!=MF>ovs6N$n+foXj6`p=if5` zsWtexs`e|~S#X{f%RjC#&m6alN;zzrDGR5Pgb7PG&M3znZi zKfU?WyBB^OJsqai$M$-gVa>|%K1p4{-djtmU~nitOj-hIbyq;R%AjzMFqryy65#X&F<-g;Wo!+E-R%@Qsmu<7$h8sP%XnjXi z+Y!}wbZa}hXJ3iUZhrOqV4WUp)`HD?uvH7T>cKWG*f!BS6YR|UR_MM4&DWs&nl)du z?%SgIwp<&Y@omqC>h(~I7HZK$+qBR&JrvPGk-N|CoeAxGWTOMlkjoY=x z?K6!L-5)S8Wp9xn4y}n(mZ!Z8Q z?95lM%Lmrv{WbZD&?6QD1qbj1A8}av4KQ_1jSr4?jKlG##^VJi5Xy8uh#{R1YrHD+ zlIzJ_BM9t;1v}P#^4P8Zz#khqiEH%c^IWGF-WD9Y-OO#TmCzLwL25(0z2F-w++9I` z!#qXg)<|WC7fiZrczLn{VrbIKc9c_-wc!poHRXUmZyt4({9#ECPYd7R%qKuegzTfc>T( zqzP6P#BVv{n@4r8XU;TS;P{>dF)`aUy3CM5y`?} z@w@3Nz8chl=ctL0V#t3_;}3fqzScwi(lcluRw4f%vO6&;P!PgLb_=BE>;Ss%fmZGT w2s{M-2Vjo|_S^?e_raR)*{ab>ovqT?s`1ttHguf%joArdC;SBzSuv--05vxvyZ`_I delta 1460 zcmZuxUrbw77(eIU+xFhx-b+hi)cv6_!1bOHMCi z#@k^WF^ky?ImVH&B};rF%&6H5Z;~K?jENa)LUVof!NiwFXN)E$ey4CtB%Y?<_xrx{ z{XOS9_m5{+g6g-5;zqDmD>K)>b1$g@{PEJc_*IN_tUL4ajAzPI!>+tCqfV(9aVUjz zt<2@WE9G6o2bw7#henYuE+So8;|_I=OB;ijTl%N-aX)t8g&Uy0hfHjuWIc?@<@mZ# z2Rb$cTd<>nSKZR&L8@CAvTbW}c0I7~w6*UdjT^Tl#VF2Zr<0jfL30rg4f4&ZbGlea zXEQ_vQzFv0_|vk7L4^^OF7h|d_5yq#RRV2ygu6;5d~rWKycZtcc;m;bsUN~=P|7qa zL}VA3-G=|~NO)`t5Ao{~GEuGxG{;u1<(L9QXh+bcNA9)525%!>eh=^`{5}3dhXcI{ zt(Ki-7yD7u5$2t`hmMI|LqR)MuFXbA+;rN9QI?<<*4VL?>!5vNKmA1v(xl{Cc);5Z z7@5)pdKumQr~?@R+p80izOrZ>-Y!D9Q})gg*AA2QSxYyB~2V>U>$GuS&t8=343#2dVAw zkhaBi>Vf;*VVeKV@)EkO8;n_S}g~eU1LN1xFk|Y^fr~*PlD!PbSmQI4G)~3y#b93w^zJ zgJ19evQR}#-fh~Qelqde?)7h4pVkxyky%j9PhJ6Lx!A2{3mMW)7aIrCmNI8#^QGr! zNpWV@C=rp_9O}~9d@7kO5>~w>!AM-G4FnkgnRGEyt2V|^y@S8S!I`2ymrun=0yfwu av~-DT{xf)hj`>eEyo4{~-w>lUpML>Glqr4y diff --git a/utils/tweet/__pycache__/content_judger.cpython-312.pyc b/utils/tweet/__pycache__/content_judger.cpython-312.pyc index d4174ebab715ad1ef89fdc671be52354e180cda3..5c773166bfcef331f0b4a7ca8864d23af6006625 100644 GIT binary patch delta 2386 zcmaJCTWlLu_Fm77?Xf)*C(dgU$4(QI#EBE2P=x?#sGN`{DJ>-tY_lnr@l0KZ#4*>C zrid}AcqtzhCA!)rh)`OIk5&a139S@fQV^oMZGSSGNaG#tO4Uk5E5V0DK^5@By>=#P zK6c0QIp>~p?s?5QXTEAa*CE~z1Q#IBgg1Ti{qjYz7A`He9vPk%$3+NaC_ARgroH1{ z2y8%slTB20_oGx?fhEqk&jtp8?0gN#{1w|4uX6Fr0mxt*43(QzgGyRKaaD=Vq*W!Y z;zoF9&*wz(ZJwz9V4n|K%oLidluNULOu{#U^krgd4Id%->3Wc zee(Q9^yzi~Gn6Y4sS)Vb1Klga#^A(y;CN9NC)pu4jp9}EzkQSY^b7VmSdjubhgwcJ z#YY2^6?l{NNlvRk=rgrymvqtY>!`LkJ6Nr?=~U%AyFe~~&t}yD0v@QXR+QRymO0_B$_i>N-n9Fwsx{#hKqGQZ z5f92fO^|D`+bfb38Mg?a|ZkBHQ`-ABwLe0=2evanoDk2 zW=2VMAV@GdKIfbR-Qesu%|LCm?1li^oAcm{j^KQS=AkxZ--neuImx1WkEN@5Ec!gFvAoMw)JIY>N2tXq>^7PW)b`z-o|jYQCv^Qd5ZW+xw@FQ+$9 z3deF;Oet7O>HoR@h?#@oJ)eH>9ENtM$ z6q6&<8q1j83{tX6I-$feN;*EJz8GduGqn(+fL7t~x1KxhUb`c}dssv!uKszWv0rFE4`%gSk!FCF9* zLM>E{wzTOfmMxZvqxf{zgwLDsl<7k8xfm%K{?SuYN%vsmt_RiPI^kYBy`KFKJ|g^e z9@N$?c>d+CcTb*$D2{gL{o& zpC0Tpf>AvfU43Fb_*7nMFrefTuMyOv8^&6ps zdg$QV&>z=B6Ppg!FU~I?=Bq=SJYf`Ez!%(f6Y37I zH;cL_xG=l~m+oJRlP&J8G|HO(QPz|vgclzauXumCJph4!3>KV3`Inz+@o(bk`9)Hr zR|X;@UGUp3*HFm*Z4XD`eui+a+CoDSaJ2;vwX;`SA0+hO{0G9r?cf>*iTIkmfzr(m zO1DEIz82w!TbXP7T8EpM>wZY+>kS-{UT@+k-AavKZW#PNDFhLu?o_|9;$Ss zg`;!_QNll$?Vp!OWT=k<`hi6p1&1lPpMp9H=m!DOu_yxCwAmvByaxWs_H42u*Lk6) z00>&?yiHM|aRhQQ{A9EMio|N=YU1w?te*Tju*Fy#`@`C?iM40rYsca(`q*|Mfon3@UzXg;_N!)ndyw0MRc{8JQ=w|#Ti62 zKD3vDV%)oP`PKO-Y4+JEWj`7xDs-b}`>|Ty7&)qgqyGk-H~G4S8iTLX`MRZt*7?vG R`yKnU5X$gJP(;N@e+TMPOnv|W delta 1703 zcmaJ>Z%kWN6hHU9*Y@4Eum322%AZlvDy@YXm~LY#85{o;9m!bCz-6TJ3Tsm+xqbXG zK4fvz5HsV*H9{OFeqF%0xR~IFCFmTG_(8~2ux8nk#Seb6$PCd>-dlJ@_rcrroZtC( z&$;KFdq0TW3OK$~6f3aR^xNQt_Z-uX67=D8b!RIA6{(h_W6;^-L?A#6CH&m&zbodR zN4uIHj{t3;%9laK^TM94V0x(q3Dk^&vpjzK#_#<&feAi@xb8Pzw z%Y@8-^nqMNZ(twYk-briE?ooF_K9FL3IPVK%*dcyj0R0uwTisfsvR(}5l1>zmu?*e z(xJL@yiHYftLmXi96$y1DsGspGGg|*Zq4QQ{yV>J?E)?Dk_hBs9;k)7^%}64z42k= zCaXodMJ=8ayWj|1xfKA-Yq$r2)K6dyCJjZR*g*SSwd8* z0lD+~cF+5Ng?uKCp>XMlg|*4*_uo8iJAuq4Y+K@^AKQadlU@?==aJy zX5MWQq&<$7;&4&MoJ5RxK6#oH$iwtLYxbyck%xa~o$ zF6nl`GYo$#H-+0=aHkG2^PTz%hL@cjFS`&kFMDvCA}*Izx5?s)fEZp8P0YF?n>bcP zj$OWXx406nXt#^2X2kHSh5M}9O&q&L=0q0@8Yhcb9i*NUc2|M$mw_B-8nz_6srJ+2EHJiMyUkg)ywRkh8(mr8e961iw|Z#l!q*3O<+U?s z*SgQGosX_{N7v81{smxdgo zUwDsAW|R>vo=hJcCaJ+;Elv3Qn!#*ZUe1jVY2vP7PIC3PaFjpO-}3W=DRm?nYb38Q z1HaN~9*`9gLR+$cq-`0H^B1t)gZleW{wtK-hhz7k_5m)PD&D}Q>*cs~_UK(4ylCDr OcOs;sKOo0)IsO4fCQz9G diff --git a/utils/tweet/__pycache__/topic_generator.cpython-312.pyc b/utils/tweet/__pycache__/topic_generator.cpython-312.pyc index bb034f22943d47fde04ddfba9d63ba5250610379..6baede2fd7571ed159212997daf098acb76db5a3 100644 GIT binary patch delta 1417 zcmah}ZA@EL7(S=>-hSP-6eu61u-nOHv_ScoWqeG<(dk0RjHJ^Ag^;HA%37gxw--CY zty^4TYJzU==qTAH!x)7z;|z(BUuu?M!ZcaKk~TNS_)D{YMNG{0%X7fOOf=r+zUMv9 zdCvPj=Y7xZeADVd%U!eC2=Jq~Mo&A7zqHIUtR7D<;CD-6R&FyXs11W8C0C$M?LLdZ zENciI0BKdWV~DG-+L=FY-) z(tjj*a(8LhQ4EDZNgSq;G72{ImEL`-Ol~i5_9$0@P=1{%Y{0q=0bD=`LR6AT(h1N3 zX71Jk`9NVO4u@)NsNopkT?<(qrowG%1udiScydB zNcGsf@cg6+4-d}2^Wfw3Zy(J6n!4nsQNZZZsZ3lBj*3VzZqZA??LcSPp(a&#Iv5Yi zvZNZr@o*F~aBzvo5mZ_Thh&u+6=jtPV=Zy?BP;T(L@v4HBF0TL!F%8H;xAn7{Pf&(mTS#$ty#{S;k>tpH#lF;UNi5Qb7bue8GA$4-kh;FFD5qZ z9Xa0h+3|(rS-w5Pw`cjT4BvIHyMKc}v8ki0Evf#z2{dPdg{){7#*RqDnoXfXJe_>uSXI;LG%a;dQw)&J`al|7bAL*aMcVlu)d`22Ycgju_or19LcR=hm=`VvKOaK4? delta 807 zcmY*XUr19?7(eHpd+y!cpSww$v!!#fO?S5m8DU8g;cP=G2?|3JL%5?FnQ?bxN?Sp~ z@F5~RFaptkoGV;`5Z%(5;tWg;uEhHQDJzc^} z&Kof$D;*98oesW22SS<(4+iA^Co=FmYm|aY18FmTK~V*ftL6Y4AX#&jQye5?875ec+YDMW?V$M>_$iPla)39mU_*{@ zuOQ*9i(Qh`R1SpSSe7iG0+CW6Qg(;R&F$qQo{9*RURVXZBL4=wS1y@br~BvNT<6?q z#YnQYmxf9wE&ustCS48Tz6kYw6oIi8SmcjJJ3!G7qanW7=BM$dsmDW!tq`QiR)-XG zp{*`g%z?ITnAW!)m{zu3h{js?+C~G1V3@qKKR>mDZp8H+J~4jlj>6ZzrknQJG3xON z{rcTeO;2h;T1e9W1$gMv*xqU&sPB@DuZOx8HN|g4`)&7WACv;)NBj}7_>5AE&dwLjE$@JZpY7R*U0Cl Oi`IS!{XYT2UC}@2K&!a` diff --git a/utils/tweet/content_generator.py b/utils/tweet/content_generator.py index c02ab05..d2dbb61 100644 --- a/utils/tweet/content_generator.py +++ b/utils/tweet/content_generator.py @@ -10,7 +10,7 @@ import json from typing import Dict, Any from core.ai import AIAgent -from core.config import ConfigManager, GenerateTopicConfig +from core.config import ConfigManager, GenerateTopicConfig, GenerateContentConfig from utils.prompts import ContentPromptBuilder from utils.file_io import OutputManager @@ -22,7 +22,9 @@ class ContentGenerator: def __init__(self, ai_agent: AIAgent, config_manager: ConfigManager, output_manager: OutputManager): self.ai_agent = ai_agent - self.config: GenerateTopicConfig = config_manager.get_config('topic_gen', GenerateTopicConfig) + self.config_manager = config_manager + self.topic_config = config_manager.get_config('topic_gen', GenerateTopicConfig) + self.content_config = config_manager.get_config('content_gen', GenerateContentConfig) self.output_manager = output_manager self.prompt_builder = ContentPromptBuilder(config_manager) @@ -49,12 +51,25 @@ class ContentGenerator: self.output_manager.save_text(system_prompt, "content_system_prompt.txt", subdir=output_dir.name) self.output_manager.save_text(user_prompt, "content_user_prompt.txt", subdir=output_dir.name) + # 获取模型参数 + model_params = {} + if hasattr(self.content_config, 'model') and isinstance(self.content_config.model, dict): + model_params = { + 'temperature': self.content_config.model.get('temperature'), + 'top_p': self.content_config.model.get('top_p'), + 'presence_penalty': self.content_config.model.get('presence_penalty') + } + # 移除None值 + model_params = {k: v for k, v in model_params.items() if v is not None} + # 2. 调用AI try: raw_result, _, _, _ = await self.ai_agent.generate_text( system_prompt=system_prompt, user_prompt=user_prompt, - use_stream=False + use_stream=False, + stage="内容生成", + **model_params ) self.output_manager.save_text(raw_result, "content_raw_response.txt", subdir=output_dir.name) except Exception as e: diff --git a/utils/tweet/content_judger.py b/utils/tweet/content_judger.py index 40d0869..fd77700 100644 --- a/utils/tweet/content_judger.py +++ b/utils/tweet/content_judger.py @@ -11,7 +11,7 @@ from json_repair import loads as json_repair_loads from typing import Dict, Any from core.ai import AIAgent -from core.config import ConfigManager, GenerateTopicConfig +from core.config import ConfigManager, GenerateTopicConfig, GenerateContentConfig from utils.prompts import JudgerPromptBuilder logger = logging.getLogger(__name__) @@ -30,7 +30,9 @@ class ContentJudger: output_manager: 输出管理器,用于保存提示词和响应 """ self.ai_agent = ai_agent - self.config: GenerateTopicConfig = config_manager.get_config('topic_gen', GenerateTopicConfig) + self.config_manager = config_manager + self.topic_config = config_manager.get_config('topic_gen', GenerateTopicConfig) + self.content_config = config_manager.get_config('content_gen', GenerateContentConfig) self.prompt_builder = JudgerPromptBuilder(config_manager) self.output_manager = output_manager @@ -63,12 +65,25 @@ class ContentJudger: self.output_manager.save_text(system_prompt, f"{topic_dir}/judger_system_prompt.txt") self.output_manager.save_text(user_prompt, f"{topic_dir}/judger_user_prompt.txt") + # 获取模型参数 + model_params = {} + if hasattr(self.content_config, 'judger_model') and isinstance(self.content_config.judger_model, dict): + model_params = { + 'temperature': self.content_config.judger_model.get('temperature'), + 'top_p': self.content_config.judger_model.get('top_p'), + 'presence_penalty': self.content_config.judger_model.get('presence_penalty') + } + # 移除None值 + model_params = {k: v for k, v in model_params.items() if v is not None} + # 2. 调用AI进行审核 try: raw_result, _, _, _ = await self.ai_agent.generate_text( system_prompt=system_prompt, user_prompt=user_prompt, - use_stream=False + use_stream=False, + stage="内容审核", + **model_params ) # 保存原始响应 diff --git a/utils/tweet/topic_generator.py b/utils/tweet/topic_generator.py index c0e3b5d..e12b720 100644 --- a/utils/tweet/topic_generator.py +++ b/utils/tweet/topic_generator.py @@ -55,12 +55,25 @@ class TopicGenerator: self.output_manager.save_text(system_prompt, "topic_system_prompt.txt") self.output_manager.save_text(user_prompt, "topic_user_prompt.txt") + # 获取模型参数 + model_params = {} + if hasattr(self.config, 'model') and isinstance(self.config.model, dict): + model_params = { + 'temperature': self.config.model.get('temperature'), + 'top_p': self.config.model.get('top_p'), + 'presence_penalty': self.config.model.get('presence_penalty') + } + # 移除None值 + model_params = {k: v for k, v in model_params.items() if v is not None} + # 2. 调用AI生成 try: raw_result, _, _, _ = await self.ai_agent.generate_text( system_prompt=system_prompt, user_prompt=user_prompt, - use_stream=False # 选题生成通常不需要流式输出 + use_stream=False, # 选题生成通常不需要流式输出 + stage="选题生成", + **model_params ) self.output_manager.save_text(raw_result, "topics_raw_response.txt") except Exception as e: