90 lines
3.8 KiB
TypeScript
90 lines
3.8 KiB
TypeScript
|
|
import type { PreviewItem, ProcessType, ResultItem, SourceLine } from './types'
|
|||
|
|
|
|||
|
|
export const DEFAULT_SOURCE_TEXT = [
|
|||
|
|
'问:如何看待当前的通货膨胀风险?',
|
|||
|
|
'答:当前通胀水平总体可控,但仍需关注能源价格与供给扰动。',
|
|||
|
|
'问:美联储下一次议息会议何时召开?',
|
|||
|
|
'答:会议时间以美联储官方日历为准,市场会重点关注利率路径指引。',
|
|||
|
|
'问:人民币汇率未来走势如何?',
|
|||
|
|
'答:人民币汇率取决于中美利差、经济基本面与政策预期。',
|
|||
|
|
'问:银行理财产品收益率为何持续走低?',
|
|||
|
|
'答:主要与市场利率下行、资产端收益下降以及风险偏好变化有关。',
|
|||
|
|
'问:什么是复利?',
|
|||
|
|
'答:复利是指在计算利息时,将上一期利息加入本金,再计算下一期利息。',
|
|||
|
|
'问:如何评估股票的投资价值?',
|
|||
|
|
'答:评估股票投资价值可以从以下几个方面进行:',
|
|||
|
|
'1. 公司基本面:分析公司的财务状况、盈利能力、成长性等。',
|
|||
|
|
'2. 行业前景:考察公司所处行业的发展趋势和竞争格局。',
|
|||
|
|
'3. 估值水平:通过市盈率、市净率等指标判断估值是否合理。',
|
|||
|
|
'4. 财务健康:关注公司的负债情况、现金流状况等。',
|
|||
|
|
'5. 管理团队:评估管理层的能力和过往业绩。',
|
|||
|
|
'此外,还需要关注宏观经济环境、政策变化等因素对股票市场的影响。',
|
|||
|
|
'问:债券和股票的主要区别是什么?',
|
|||
|
|
'答:债券收益相对稳定但上行有限,股票波动更大且承担更高风险。',
|
|||
|
|
'问:什么是市盈率?',
|
|||
|
|
'答:市盈率是股票价格与每股收益的比值,常用于衡量估值水平。',
|
|||
|
|
'问:如何进行资产配置?',
|
|||
|
|
'答:应根据投资目标、风险承受能力和市场环境合理分配资产。',
|
|||
|
|
].join('\n')
|
|||
|
|
|
|||
|
|
export function sourceLines(sourceText: string): SourceLine[] {
|
|||
|
|
const rawLines = sourceText.split('\n')
|
|||
|
|
let cursor = 0
|
|||
|
|
|
|||
|
|
return rawLines.map((content, index) => {
|
|||
|
|
const start = cursor
|
|||
|
|
const end = start + content.length
|
|||
|
|
cursor = end + (index < rawLines.length - 1 ? 1 : 0)
|
|||
|
|
return { number: index + 1, content, start, end }
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function buildPreviewItems(sourceText: string, processType: ProcessType, sourceFileId = 'default-source'): PreviewItem[] {
|
|||
|
|
const meaningfulLines = sourceLines(sourceText).filter((line) => line.content.trim())
|
|||
|
|
const groupSize = processType === 'structured' ? 1 : 3
|
|||
|
|
const items: PreviewItem[] = []
|
|||
|
|
|
|||
|
|
for (let index = 0; index < meaningfulLines.length; index += groupSize) {
|
|||
|
|
const group = meaningfulLines.slice(index, index + groupSize)
|
|||
|
|
if (!group.length) continue
|
|||
|
|
|
|||
|
|
const sourceStart = group[0].start
|
|||
|
|
const sourceEnd = group[group.length - 1].end
|
|||
|
|
const content = sourceText.slice(sourceStart, sourceEnd)
|
|||
|
|
|
|||
|
|
items.push({
|
|||
|
|
id: `preview-${sourceFileId}-${items.length + 1}`,
|
|||
|
|
sourceFileId,
|
|||
|
|
originalContent: content,
|
|||
|
|
editedContent: content,
|
|||
|
|
sourceStart,
|
|||
|
|
sourceEnd,
|
|||
|
|
sourceStartLine: group[0].number,
|
|||
|
|
sourceEndLine: group[group.length - 1].number,
|
|||
|
|
tokenCount: Math.max(1, Math.ceil(content.length / 2)),
|
|||
|
|
status: 'original',
|
|||
|
|
})
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return items
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export function createResults(items: PreviewItem[]): ResultItem[] {
|
|||
|
|
return items.slice(0, 12).map((item, index) => {
|
|||
|
|
const [firstLine = '', ...rest] = item.editedContent.split('\n')
|
|||
|
|
const output = rest.join('\n').trim() || item.editedContent.trim()
|
|||
|
|
const instruction = firstLine.replace(/^问[::]\s*/, '').trim() || `数据条目 ${index + 1}`
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
id: `result-${index + 1}`,
|
|||
|
|
instruction,
|
|||
|
|
input: '',
|
|||
|
|
output,
|
|||
|
|
originalInstruction: instruction,
|
|||
|
|
originalInput: '',
|
|||
|
|
originalOutput: output,
|
|||
|
|
status: 'valid',
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
}
|