From 7b8879a7a8130cddf5cdb84e837049272648cb83 Mon Sep 17 00:00:00 2001 From: zhaoweijie Date: Sun, 23 Feb 2025 13:02:32 +0800 Subject: [PATCH] feat: add metering data --- bun.lockb | Bin 446138 -> 446330 bytes package.json | 2 +- src/components/Option/Metering/ListDetail.tsx | 243 +++++++++--------- src/components/Option/Metering/detail.tsx | 76 ++++-- src/hooks/useMessageOption.tsx | 17 +- src/store/option.tsx | 18 +- src/types/iod.ts | 1 + src/web/iod.ts | 8 +- src/web/web.ts | 22 +- 9 files changed, 225 insertions(+), 162 deletions(-) mode change 100644 => 100755 bun.lockb diff --git a/bun.lockb b/bun.lockb old mode 100644 new mode 100755 index b9821061ac2f39beff3f78e2884a9741c2ba48e2..82717455c11b1ba1f266513b088dda3493520d46 GIT binary patch delta 13403 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 delta 13244 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 j4R|)(wrp^wSKJ3|yS["columns"] = [ { - title: "序号", - dataIndex: "key", - key: "name", - render: (text) => {text} + title: '序号', + key: 'index', + width: 100, + render: (_text, _record, index) => index + 1, // 索引从0开始,+1后从1显示 }, { title: "标识", - dataIndex: "age", - key: "age" + dataIndex: "doId", + key: "doId" }, { title: "提供方", - dataIndex: "address", - key: "address" + dataIndex: "data_space", + key: "data_space" }, { title: "token数量", - key: "tags", - dataIndex: "tags" + key: "tokenCount", + dataIndex: "tokenCount", + width: 100 }, { title: "内容", key: "content", - dataIndex: "content" - } -] - -const data1: DataType[] = [ - { - key: "1", - name: "John Brown", - age: 32, - address: "New York No. 1 Lake Park", - tags: 2, - content: "内容" - }, - { - key: "2", - name: "Jim Green", - age: 42, - address: "London No. 1 Lake Park", - tags: 3, - content: "内容" - }, - { - key: "3", - name: "Joe Black", - age: 32, - address: "Sydney No. 1 Lake Park", - tags: 3, - content: "内容" + dataIndex: "content", + ellipsis: { + showTitle: false + }, + render: (content) => ( + + {content} + + ) } ] export const ListDetail = () => { + const { chatMessages } = useStoreMessageOption() + const { id } = useParams() + const record = useMemo( + () => chatMessages.find((item) => item.id === id), + [chatMessages] + ) + + const modelData = useMemo( + () => [ + { + key: "大模型输入token数", + value: record.modelInputTokenCount + }, + { + key: "大模型输出token数", + value: record.modelOutputTokenCount + }, + { + key: "模型", + value: record.model + } + ], + [record] + ) + + const inputTokenData = useMemo( + () => [ + { + key: "内容:", + value: record.queryContent + }, + { + key: "token数量:", + value: record.queryContent.length + } + ], + [record] + ) + const keywordsData = useMemo( + () => [ + { + key: "token数量:", + value: record.iodKeywords.reduce((acc, cur) => acc + cur.length, 0) + }, + { + key: "内容:", + value: record.iodKeywords.join(", ") + } + ], + [record] + ) + const responseContent = useMemo( + () => [ + { + key: "token数量:", + value: record.modelResponseContent.length + }, + { + key: "内容:", + value: record.modelResponseContent + } + ], + [record] + ) + return (

( {item.value} @@ -150,43 +139,65 @@ export const ListDetail = () => { style={{ marginBottom: "2rem" }} /> -
+ 输入token详情 问题
} dataSource={inputTokenData} renderItem={(item) => ( - + {item.key} - - + + {item.value} )} style={{ marginBottom: "1rem" }} /> - columns={columns} dataSource={data1} /> -
+ + columns={columns} dataSource={record.iodData} /> + + -
+ 输出token详情 数联网搜索关键词
} renderItem={(item) => ( - - {item.key} - - + {item.key} + {item.value} )} /> - + 回答} + renderItem={(item) => ( + + + {item.key} + + + {item.value} + + + )} + /> + ) } diff --git a/src/components/Option/Metering/detail.tsx b/src/components/Option/Metering/detail.tsx index 833d4d4..b123fe0 100644 --- a/src/components/Option/Metering/detail.tsx +++ b/src/components/Option/Metering/detail.tsx @@ -1,24 +1,9 @@ -import React from "react" +import React, { useMemo } from "react" import { ChatMessage, useStoreMessageOption } from "@/store/option" import { Card, List, Table, Tag, Space, TableProps, Tooltip } from "antd" import { NavLink } from "react-router-dom" import { formatDate } from "@/utils/date" -const data = [ - { - key: "对话数量", - value: 2 - }, - { - key: "输出token数", - value: 2 - }, - { - key: "输入token数", - value: 2 - } -] - const columns: TableProps["columns"] = [ { title: "id", @@ -49,6 +34,14 @@ const columns: TableProps["columns"] = [ title: "思维链", key: "thinkingChain", dataIndex: "thinkingChain", + ellipsis: { + showTitle: false + }, + render: (responseContent) => ( + + {responseContent} + + ), width: "10%" }, @@ -73,9 +66,8 @@ const columns: TableProps["columns"] = [ }, { title: "数联网token", - dataIndex: "iodOutputToken", - key: "iodOutputToken", - render: (iodOutputToken) =>
{iodOutputToken?.length}
+ dataIndex: "iodDataTokenCount", + key: "iodDataTokenCount" }, { title: "大模型token", @@ -83,9 +75,7 @@ const columns: TableProps["columns"] = [ dataIndex: "largeModelToken", render: (_, record) => { return ( -
- {record.iodInputToken?.length + record.iodOutputToken?.length} -
+
{record.modelInputTokenCount + record.modelOutputTokenCount}
) } }, @@ -119,13 +109,49 @@ const columns: TableProps["columns"] = [ export const MeteringDetail = () => { const { chatMessages } = useStoreMessageOption() - console.log(chatMessages, "opppp") + const data = useMemo( + () => [ + { + key: "对话数量", + value: chatMessages.length + }, + { + key: "数联网输入token数", + value: chatMessages.reduce((acc, cur) => { + for (const item of cur.iodKeywords) { + acc += item.length + } + return acc + }, 0) + }, + { + key: "数联网输出token数", + value: chatMessages.reduce((acc, cur) => acc + cur.iodDataTokenCount, 0) + }, + { + key: "大模型输入token数", + value: chatMessages.reduce( + (acc, cur) => acc + cur.modelInputTokenCount, + 0 + ) + }, + { + key: "大模型输出token数", + value: chatMessages.reduce( + (acc, cur) => acc + cur.modelOutputTokenCount, + 0 + ) + } + ], + [chatMessages] + ) return ( -
+
( {item.value} diff --git a/src/hooks/useMessageOption.tsx b/src/hooks/useMessageOption.tsx index d48134d..676b686 100644 --- a/src/hooks/useMessageOption.tsx +++ b/src/hooks/useMessageOption.tsx @@ -316,15 +316,14 @@ export const useMessageOption = () => { .map((k) => k.trim()) } - const { prompt, webSources, iodSources } = await getSystemPromptForWeb( - query, - keywords, - webSearch, - iodSearch - ) + const { prompt, webSources, iodSources, iodData, iodDataTokenCount } = + await getSystemPromptForWeb(query, keywords, webSearch, iodSearch) console.log("prompt:\n" + prompt) setIsSearchingInternet(false) chatMessage.prompt = prompt + chatMessage.iodKeywords = keywords + chatMessage.iodData = iodData + chatMessage.iodDataTokenCount = iodDataTokenCount // message = message.trim().replaceAll("\n", " ") @@ -485,12 +484,16 @@ export const useMessageOption = () => { setIsProcessing(false) setStreaming(false) - chatMessage.relatedDataCount = keywords.length + chatMessage.modelInputTokenCount = generationInfo?.prompt_eval_count ?? 0 + chatMessage.modelOutputTokenCount = generationInfo?.eval_count ?? 0 + chatMessage.model = generationInfo?.model ?? "" + chatMessage.relatedDataCount = iodData?.length ?? 0 chatMessage.timeTaken = timetaken chatMessage.date = reasoningStartTime const { think, content } = responseResolver(fullText) chatMessage.thinkingChain = think chatMessage.responseContent = content + chatMessage.modelResponseContent = fullText setChatMessages([...chatMessages, chatMessage]) } catch (e) { const errorSave = await saveMessageOnError({ diff --git a/src/store/option.tsx b/src/store/option.tsx index 9266c59..608ee4c 100644 --- a/src/store/option.tsx +++ b/src/store/option.tsx @@ -46,14 +46,24 @@ export type ChatMessage = { iodInputToken: string // 数联网输出token iodOutputToken: string - // 大模型输入token - modelInputToken: string - // 大模型输出token - modelOutputToken: string + // 大模型输入token数量 + modelInputTokenCount: number + // 大模型输出token数量 + modelOutputTokenCount: number // 日期 date: Date // 耗时 timeTaken: number + // 大模型回答的全部内容 + modelResponseContent: string + // iod的全部内容的token数量 + iodDataTokenCount: number + // iod返回的数据 + iodData: any[] + // iod keywords + iodKeywords: string[] + // 模型 + model: string } type State = { diff --git a/src/types/iod.ts b/src/types/iod.ts index 48de6e3..6b36440 100644 --- a/src/types/iod.ts +++ b/src/types/iod.ts @@ -5,4 +5,5 @@ export type IodRegistryEntry = { pdf_url?: string description: string content?: string + data_space?: string } diff --git a/src/web/iod.ts b/src/web/iod.ts index cb68b2c..eabe9aa 100644 --- a/src/web/iod.ts +++ b/src/web/iod.ts @@ -91,7 +91,13 @@ export async function localIodSearch( ) ).flat() - return results + // results 根据 doId 去重 + const map = new Map() + for (const r of results) { + map.set(r.doId, r) + } + + return Array.from(map.values()) } const ARXIV_URL_PATTERN = /^https?:\/\/arxiv\.org\// diff --git a/src/web/web.ts b/src/web/web.ts index 2168f28..7332766 100644 --- a/src/web/web.ts +++ b/src/web/web.ts @@ -95,13 +95,17 @@ export const getSystemPromptForWeb = async ( // ) // .join("\n") } - const iod_search_results = iodSearchResults - .map((res) => ({ - doId: res.doId, - name: res.name, - url: res.url, - content: res.content || res.description - })) + const _iodSearchResults = iodSearchResults + .map((res) => ({ + doId: res.doId, + name: res.name, + url: res.url, + data_space: res.data_space, + tokenCount: (res.content || res.description)?.length ?? 0, + content: res.content || res.description + })) + + const iod_search_results = _iodSearchResults .map( (result, idx) => `${result.content}` @@ -135,7 +139,9 @@ export const getSystemPromptForWeb = async ( type: "url" } }), - iodSources: iodSearchResults + iodSources: iodSearchResults, + iodData: _iodSearchResults, + iodDataTokenCount: _iodSearchResults.reduce((acc, cur) => (acc + cur.content.length), 0) } } catch (e) { console.error(e)