接入文章优化LLM追踪

This commit is contained in:
czj
2026-07-16 12:19:16 +08:00
parent 90de3a698c
commit 8e50ecef77
9 changed files with 150 additions and 22 deletions
-1
View File
@@ -7,7 +7,6 @@ import type {
LlmTraceCallStatus,
LlmTraceCompleteness,
LlmTraceErrorType,
LlmTraceRun,
LlmTraceRunStatus,
LlmTraceWorkflowStage,
} from "./trace-types";
-1
View File
@@ -9,7 +9,6 @@ import type {
LlmTraceCallStatus,
LlmTraceCompleteness,
LlmTraceErrorType,
LlmTraceRun,
LlmTraceRunStatus,
LlmTraceWorkflowStage,
} from "./trace-types";
+5
View File
@@ -13,12 +13,14 @@ import {
export interface OptimizeArticleInput {
input: ArticleInput;
factCard: OptimizationFactCard;
onTraceEvent?: GenerateInput["onTraceEvent"];
onAuditSummary?: GenerateInput["onAuditSummary"];
}
export async function optimizeArticle({
input,
factCard,
onTraceEvent,
onAuditSummary,
}: OptimizeArticleInput): Promise<OptimizedArticle> {
const llmArticle = await generateValidatedJson({
@@ -27,6 +29,9 @@ export async function optimizeArticle({
prompt: buildArticleOptimizerPrompt(input, factCard),
temperature: 0.2,
task: "article_optimizer",
schemaName: "optimizedArticleSchema",
traceStage: "draft",
onTraceEvent,
onAuditSummary,
});
+7 -1
View File
@@ -8,7 +8,10 @@ import {
export async function extractCandidateFactCard(
input: ArticleInput,
options: { onAuditSummary?: GenerateInput["onAuditSummary"] } = {},
options: {
onAuditSummary?: GenerateInput["onAuditSummary"];
onTraceEvent?: GenerateInput["onTraceEvent"];
} = {},
): Promise<CandidateFactCard> {
return generateValidatedJson({
schema: candidateFactCardSchema,
@@ -16,6 +19,9 @@ export async function extractCandidateFactCard(
prompt: buildFactExtractorPrompt(input),
temperature: 0.1,
task: "fact_extractor",
schemaName: "candidateFactCardSchema",
traceStage: "fact_card",
onTraceEvent: options.onTraceEvent,
onAuditSummary: options.onAuditSummary,
});
}
+6
View File
@@ -43,6 +43,8 @@ export interface InspectQualityInput {
factCard: OptimizationFactCard;
platform: PublishPlatform;
sourceImages: ImageInput[];
rewriteRound?: number;
onTraceEvent?: GenerateInput["onTraceEvent"];
onAuditSummary?: GenerateInput["onAuditSummary"];
}
@@ -72,6 +74,10 @@ export async function inspectQualityWithLlm(
}),
temperature: 0.1,
task: "quality_inspector",
schemaName: "llmQaPatchSchema",
traceStage: "qa",
rewriteRound: input.rewriteRound,
onTraceEvent: input.onTraceEvent,
onAuditSummary: input.onAuditSummary,
});
+14 -1
View File
@@ -13,6 +13,7 @@ export interface RunStreamingOptimizationWorkflowInput {
input: ArticleInput;
factCard: OptimizationFactCard;
onEvent: (event: OptimizationStreamEvent) => void | Promise<void>;
onTraceEvent?: GenerateInput["onTraceEvent"];
onAuditSummary?: GenerateInput["onAuditSummary"];
}
@@ -21,6 +22,7 @@ export async function runStreamingOptimizationWorkflow({
input,
factCard,
onEvent,
onTraceEvent,
onAuditSummary,
}: RunStreamingOptimizationWorkflowInput) {
const processSummary: ProcessSummaryStep[] = [];
@@ -31,7 +33,12 @@ export async function runStreamingOptimizationWorkflow({
message: "正在生成优化草稿",
});
let stageStartedAt = Date.now();
let article = await optimizeArticle({ input, factCard, onAuditSummary });
let article = await optimizeArticle({
input,
factCard,
onTraceEvent,
onAuditSummary,
});
processSummary.push(
createProcessStep({
stage: "draft",
@@ -54,6 +61,8 @@ export async function runStreamingOptimizationWorkflow({
factCard,
platform: input.platform,
sourceImages: input.images,
rewriteRound: 0,
onTraceEvent,
onAuditSummary,
});
processSummary.push(
@@ -81,6 +90,8 @@ export async function runStreamingOptimizationWorkflow({
article,
factCard,
failedChecks,
rewriteRound: nextRound,
onTraceEvent,
onAuditSummary,
});
rewriteRounds = nextRound;
@@ -112,6 +123,8 @@ export async function runStreamingOptimizationWorkflow({
factCard,
platform: input.platform,
sourceImages: input.images,
rewriteRound: nextRound,
onTraceEvent,
onAuditSummary,
});
processSummary.push(
+8
View File
@@ -10,6 +10,8 @@ export interface RewriteFailedSectionsInput {
article: OptimizedArticle;
factCard: OptimizationFactCard;
failedChecks: QaCheck[];
rewriteRound?: number;
onTraceEvent?: GenerateInput["onTraceEvent"];
onAuditSummary?: GenerateInput["onAuditSummary"];
}
@@ -17,6 +19,8 @@ export async function rewriteFailedSections({
article,
factCard,
failedChecks,
rewriteRound,
onTraceEvent,
onAuditSummary,
}: RewriteFailedSectionsInput): Promise<OptimizedArticle> {
const llmArticle = await generateValidatedJson({
@@ -25,6 +29,10 @@ export async function rewriteFailedSections({
prompt: buildTargetedRewritePrompt({ article, factCard, failedChecks }),
temperature: 0.15,
task: "targeted_rewriter",
schemaName: "optimizedArticleSchema",
traceStage: "rewrite",
rewriteRound,
onTraceEvent,
onAuditSummary,
});