Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
赵月辉
/
fastgpt-migrated
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Unverified
Commit
02cee35a
authored
Mar 25, 2023
by
archer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 数据集管理
parent
0cee404c
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
285 additions
and
86 deletions
+285
-86
public/TrainingTemplate.jsonl
+15
-21
src/api/data.ts
+7
-0
src/components/Layout/index.tsx
+1
-1
src/pages/api/data/getDataItems.ts
+50
-0
src/pages/api/data/getDataList.ts
+0
-1
src/pages/data/components/ImportDataModal.tsx
+34
-11
src/pages/data/defail.tsx
+0
-15
src/pages/data/detail.tsx
+61
-0
src/pages/data/list.tsx
+66
-8
src/pages/model/detail.tsx
+20
-6
src/service/models/authCode.ts
+4
-2
src/service/models/bill.ts
+3
-2
src/service/models/chat.ts
+3
-2
src/service/models/data.ts
+3
-2
src/service/models/dataItem.ts
+4
-2
src/service/models/model.ts
+3
-3
src/service/models/pay.ts
+3
-3
src/service/models/training.ts
+4
-3
src/service/models/user.ts
+3
-3
src/types/index.d.ts
+1
-1
No files found.
public/TrainingTemplate.jsonl
View file @
02cee35a
{"prompt":"什么是死锁?如何避免死锁?\n\n###\n\n","completion":" 死锁是指两个或多个进程在执行过程中,由于互相等待对方释放资源而造成的一种僵局。避免死锁的常用方法包括:破坏互斥条件、破坏请求和保持条件、破坏不剥夺条件、破坏循环等待条件。###"}
{"prompt":"什么是百度plato?</s>","completion":" 百度PLATO是一种聊天机器人,发布于2021年10月,参数量为百亿,是GPT-3的1/17。</s>"}
{"prompt":"什么是虚拟内存?\n\n###\n\n","completion":" 虚拟内存是指一种计算机内存管理技术,它使得操作系统可以将进程所使用的虚拟地址空间映射到物理内存中,从而可以让多个进程共享物理内存。当物理内存不足时,操作系统会将一部分不常用的内存页面暂时存储到硬盘上,这样就可以释放出更多的物理内存供其他进程使用。###"}
{"prompt":"与百度plato相比,chatgpt有哪些优点?</s>","completion":" 与百度PLATO相比,ChatGPT体现出耐心、体贴和妥当,被网友们普遍称赞。ChatGPT可以用于个性化聊天机器人,例如生成一个很相似的数字人,提供一位温柔健谈的朋友,指导语言学习等。</s>"}
{"prompt":"什么是分页和分段?有什么区别?\n\n###\n\n","completion":" 分页和分段是虚拟内存管理中常用的两种技术。分页是将虚拟地址空间划分为固定大小的页面,而分段则是将虚拟地址空间划分为不同大小的段。区别在于,分页的页面大小是固定的,而分段的段大小是可变的;另外,分页是为了实现虚拟内存,而分段则是为了实现逻辑地址空间的管理。###"}
{"prompt":"replika是什么?</s>","completion":" Replika是一个产品,使用ChatGPT的技术,可以根据自己的需求生成一个虚拟女友、男友或单纯的朋友。目前还引起了不少有关性骚扰、家暴、隐私等问题的争议。</s>"}
{"prompt":"什么是lru算法?\n\n###\n\n","completion":" lru算法是一种页面置换算法,它的全称是least recently used,即最近最少使用算法。lru算法的基本思想是在物理内存中维护一个页面访问历史记录,当需要替换一页时,选择最近最少被访问的页面进行替换。###"}
{"prompt":"聊天机器人可以用于哪些场景?</s>","completion":" 聊天机器人可以用于很多陪伴的场景,例如亲人去世、抑郁症或自闭症患者、语言学习、小朋友、养老院或独居在家的老人等。</s>"}
{"prompt":"什么是文件系统?\n\n###\n\n","completion":" 文件系统是一种用于管理计算机存储设备上文件和目录的组织方式。文件系统通常包括存储管理、目录管理、文件访问控制、文件系统维护等功能。常见的文件系统包括fat、ntfs、ext等。###"}
{"prompt":"有人反对使用聊天机器人解决孤独困境,为什么?</s>","completion":" 有人反对使用聊天机器人解决孤独困境,认为孤独困境应该用人与人真正的交往解决,机器是冰冷的。</s>"}
{"prompt":"什么是并发和并行?\n\n###\n\n","completion":" 并发是指多个任务交替执行的情况,而并行是指多个任务同时执行的情况。并发的实现方式是通过时间分片技术,而并行的实现方式是通过多核处理器等硬件设备。###"}
{"prompt":"为什么聊天机器人仍然需要解决当下的需求?</s>","completion":" 在社会结构性的困局还没有解开时,长夜漫漫的独身打工人、养老院里卧床的老人、父母在外留守在家的儿童,当下的需求仍需要解决。</s>"}
{"prompt":"什么是系统调用?\n\n###\n\n","completion":" 系统调用是操作系统中的一种机制,它允许用户空间程序请求操作系统内核提供一些服务,如读写文件、创建进程等。系统调用通常是通过软中断实现的###"}
{"prompt":"ai在未来会被戴上什么样的帽子?</s>","completion":" AI在未来各个场景下都会被戴上一个很虚无的帽子:“机器是冰冷的”、“没有灵魂”、“它并不是真正在思考”。</s>"}
{"prompt":"什么是进程间通信?\n\n###\n\n","completion":" 进程间通信是指不同进程之间进行数据交换和通信的机制,常见的方式有管道、共享内存、消息队列、信号量等。###"}
{"prompt":"怎么回答“ai是否真正思考”的问题?</s>","completion":" 引用乔姆斯基老爷子的那句名言:“思考是人类特性。AI有天会思考吗?那就像是在问潜水艇会不会游泳一样。”</s>"}
{"prompt":"什么是文件描述符?\n\n###\n\n","completion":" 文件描述符是一个非负整数,它是操作系统内核为了管理打开的文件而维护的一种抽象概念。应用程序使用文件描述符来访问文件或其他i\/o设备###"}
{"prompt":"聊天机器人与人类完成任务的方式有何不同?</s>","completion":" 聊天机器人与人类完成任务的方式不同,但并不重要。它们能跟人一样完成任务,这是最重要的。</s>"}
{"prompt":"什么是中断? \n\n###\n\n","completion":" 中断是指计算机硬件或软件在执行程序时,暂停当前程序的执行,转而去执行另一个程序或处理器所需的其他任务的过程。中断可以是外部中断、内部中断或软中断。###"}
{"prompt":"聊天机器人的发展前景如何?</s>","completion":" 聊天机器人的发展前景广阔,可以应用于很多领域,例如客服、教育、医疗等。</s>"}
{"prompt":"什么是页表?\n\n###\n\n","completion":" 页表是一种数据结构,它用于将虚拟地址转换为物理地址。在虚拟内存中,每个进程都有自己的页表,它描述了虚拟地址空间中每个页面对应的物理地址。 ###"}
{"prompt":"什么是百度plato?</s>","completion":" 百度PLATO是一种聊天机器人,发布于2021年10月,参数量为百亿,是GPT-3的1/17。</s>"}
{"prompt":"什么是僵尸进程?\n\n###\n\n","completion":" 僵尸进程是指一个已经完成执行但其父进程还没有对其进行善后处理的进程,它会一直占用系统资源,直到其父进程将其处理为止。###"}
{"prompt":"与百度plato相比,chatgpt有哪些优点?</s>","completion":" 与百度PLATO相比,ChatGPT体现出耐心、体贴和妥当,被网友们普遍称赞。ChatGPT还可以用于很多陪伴的场景,如亲人去世、抑郁症或自闭症患者、语言学习、小朋友、养老院或独居在家的老人等。</s>"}
{"prompt":"什么是守护进程? \n\n###\n\n","completion":" 守护进程是一种在后台运行的特殊进程,它通常用于提供某种服务或执行某种系统任务。守护进程通常不与任何用户界面交互,也不会终止,直到操作系统关机或重启。###"}
{"prompt":"replika是什么产品?</s>","completion":" Replika是一个产品,用的是ChatGPT的技术。用户可以根据自己的需求生成一个虚拟女友、男友或单纯的朋友。目前还引起了不少有关性骚扰、家暴、隐私等问题的争议。</s>"}
{"prompt":"计算机操作系统是什么?\n\n###\n\n","completion":" 计算机操作系统是一种控制计算机硬件和协调应用程序运行的系统软件。###"}
{"prompt":"聊天机器人能够解决哪些现实问题?</s>","completion":" 聊天机器人能够解决现代人面临的孤独困境,如长夜漫漫的独身打工人、养老院里卧床的老人、父母在外留守在家的儿童等。</s>"}
{"prompt":"什么是进程?\n\n###\n\n","completion":" 进程是一个正在执行中的程序实例,它包括了程序计数器、堆栈、数据区等信息。###"}
{"prompt":"有人反对使用聊天机器人解决孤独困境,为什么?</s>","completion":" 有人反对使用聊天机器人解决孤独困境,认为孤独困境应该用人与人真正的交往解决,机器是冰冷的。</s>"}
{"prompt":"什么是线程?\n\n###\n\n","completion":" 线程是操作系统能够进行运算调度的最小单位,它是进程的一个执行流程,共享进程的地址空间。###"}
{"prompt":"什么是虚拟内存?\n\n###\n\n","completion":" 虚拟内存是一种计算机系统内存管理技术,它使得应用程序认为它拥有连续的可用的内存,而实际上它通常是被分成多个物理内存碎片。###"}
{"prompt":"什么是死锁?\n\n###\n\n","completion":" 死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,导致所有进程都无法继续执行。###"}
{"prompt":"什么是缓存?\n\n###\n\n","completion":" 缓存是指在计算机中暂存数据的高速存储器,它可以提高计算机对数据的访问速度,避免频繁地访问较慢的主存储器。###"}
{"prompt":"什么是文件系统?\n\n###\n\n","completion":" 文件系统是计算机中用来管理和组织文件的一种机制,它通过一系列的数据结构来描述文件和目录的组织方式,以及文件如何存储和访问。###"}
{"prompt":"什么是调度算法?\n\n###\n\n","completion":" 调度算法是指操作系统中用来决定进程或线程在cpu上执行顺序的一种算法,它的目标是最大化系统吞吐量、最小化响应时间或最大化资源利用率等。###"}
src/api/data.ts
View file @
02cee35a
...
@@ -3,6 +3,7 @@ import { RequestPaging } from '../types/index';
...
@@ -3,6 +3,7 @@ import { RequestPaging } from '../types/index';
import
{
Obj2Query
}
from
'@/utils/tools'
;
import
{
Obj2Query
}
from
'@/utils/tools'
;
import
type
{
DataListItem
}
from
'@/types/data'
;
import
type
{
DataListItem
}
from
'@/types/data'
;
import
type
{
PagingData
}
from
'../types/index'
;
import
type
{
PagingData
}
from
'../types/index'
;
import
{
DataItemSchema
}
from
'@/types/mongoSchema'
;
export
const
getDataList
=
(
data
:
RequestPaging
)
=>
export
const
getDataList
=
(
data
:
RequestPaging
)
=>
GET
<
PagingData
<
DataListItem
>>
(
`/data/getDataList?
${
Obj2Query
(
data
)}
`
);
GET
<
PagingData
<
DataListItem
>>
(
`/data/getDataList?
${
Obj2Query
(
data
)}
`
);
...
@@ -16,3 +17,9 @@ export const updateDataName = (dataId: string, name: string) =>
...
@@ -16,3 +17,9 @@ export const updateDataName = (dataId: string, name: string) =>
PUT
(
`/data/putDataName?dataId=
${
dataId
}
&name=
${
name
}
`
);
PUT
(
`/data/putDataName?dataId=
${
dataId
}
&name=
${
name
}
`
);
export
const
delData
=
(
dataId
:
string
)
=>
DELETE
(
`/data/delData?dataId=
${
dataId
}
`
);
export
const
delData
=
(
dataId
:
string
)
=>
DELETE
(
`/data/delData?dataId=
${
dataId
}
`
);
type
GetDataItemsProps
=
RequestPaging
&
{
dataId
:
string
;
};
export
const
getDataItems
=
(
data
:
GetDataItemsProps
)
=>
GET
<
PagingData
<
DataItemSchema
>>
(
`/data/getDataItems?
${
Obj2Query
(
data
)}
`
);
src/components/Layout/index.tsx
View file @
02cee35a
...
@@ -30,7 +30,7 @@ const navbarList = [
...
@@ -30,7 +30,7 @@ const navbarList = [
label
:
'数据'
,
label
:
'数据'
,
icon
:
'icon-datafull'
,
icon
:
'icon-datafull'
,
link
:
'/data/list'
,
link
:
'/data/list'
,
activeLink
:
[
'/data/list'
]
activeLink
:
[
'/data/list'
,
'/data/detail'
]
},
},
{
{
label
:
'账号'
,
label
:
'账号'
,
...
...
src/pages/api/data/getDataItems.ts
0 → 100644
View file @
02cee35a
import
type
{
NextApiRequest
,
NextApiResponse
}
from
'next'
;
import
{
jsonRes
}
from
'@/service/response'
;
import
{
connectToDatabase
,
DataItem
}
from
'@/service/mongo'
;
import
{
authToken
}
from
'@/service/utils/tools'
;
export
default
async
function
handler
(
req
:
NextApiRequest
,
res
:
NextApiResponse
)
{
try
{
let
{
dataId
,
pageNum
=
1
,
pageSize
=
10
}
=
req
.
query
as
{
dataId
:
string
;
pageNum
:
string
;
pageSize
:
string
};
pageNum
=
+
pageNum
;
pageSize
=
+
pageSize
;
if
(
!
dataId
)
{
throw
new
Error
(
'参数错误'
);
}
await
connectToDatabase
();
const
{
authorization
}
=
req
.
headers
;
await
authToken
(
authorization
);
const
dataItems
=
await
DataItem
.
find
({
dataId
,
status
:
0
})
.
sort
({
time
:
-
1
})
// 按照创建时间倒序排列
.
skip
((
pageNum
-
1
)
*
pageSize
)
.
limit
(
pageSize
);
jsonRes
(
res
,
{
data
:
{
pageNum
,
pageSize
,
data
:
dataItems
,
total
:
await
DataItem
.
countDocuments
({
dataId
,
status
:
0
})
}
});
}
catch
(
err
)
{
jsonRes
(
res
,
{
code
:
500
,
error
:
err
});
}
}
src/pages/api/data/getDataList.ts
View file @
02cee35a
...
@@ -24,7 +24,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
...
@@ -24,7 +24,6 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
await
connectToDatabase
();
await
connectToDatabase
();
// 根据 id 获取用户账单
const
datalist
=
await
Data
.
aggregate
<
DataListItem
>
([
const
datalist
=
await
Data
.
aggregate
<
DataListItem
>
([
{
{
$match
:
{
$match
:
{
...
...
src/pages/data/components/ImportDataModal.tsx
View file @
02cee35a
...
@@ -22,18 +22,20 @@ import { useMutation } from '@tanstack/react-query';
...
@@ -22,18 +22,20 @@ import { useMutation } from '@tanstack/react-query';
import
{
useToast
}
from
'@/hooks/useToast'
;
import
{
useToast
}
from
'@/hooks/useToast'
;
import
{
useLoading
}
from
'@/hooks/useLoading'
;
import
{
useLoading
}
from
'@/hooks/useLoading'
;
const
fileExtension
=
'.txt,.doc,.docx,.pdf,.md'
;
const
ImportDataModal
=
({
dataId
,
onClose
}:
{
dataId
:
string
;
onClose
:
()
=>
void
})
=>
{
const
ImportDataModal
=
({
dataId
,
onClose
}:
{
dataId
:
string
;
onClose
:
()
=>
void
})
=>
{
const
{
openConfirm
,
ConfirmChild
}
=
useConfirm
({
const
{
openConfirm
,
ConfirmChild
}
=
useConfirm
({
content
:
'确认提交生成任务?该任务无法终止!'
content
:
'确认提交生成任务?该任务无法终止!'
});
});
const
{
toast
}
=
useToast
();
const
{
toast
}
=
useToast
();
const
{
setIsLoading
,
Loading
}
=
useLoading
();
const
{
setIsLoading
,
Loading
}
=
useLoading
();
const
{
File
,
onOpen
}
=
useSelectFile
({
fileType
:
'.txt,.doc,.docx,.pdf'
,
multiple
:
true
});
const
{
File
,
onOpen
}
=
useSelectFile
({
fileType
:
fileExtension
,
multiple
:
true
});
const
{
tabs
,
activeTab
,
setActiveTab
}
=
useTabs
({
const
{
tabs
,
activeTab
,
setActiveTab
}
=
useTabs
({
tabs
:
[
tabs
:
[
{
id
:
'text'
,
label
:
'文本'
},
{
id
:
'text'
,
label
:
'文本'
},
{
id
:
'doc'
,
label
:
'文件'
}
,
{
id
:
'doc'
,
label
:
'文件'
}
{
id
:
'url'
,
label
:
'链接'
}
//
{ id: 'url', label: '链接' }
]
]
});
});
...
@@ -76,14 +78,18 @@ const ImportDataModal = ({ dataId, onClose }: { dataId: string; onClose: () => v
...
@@ -76,14 +78,18 @@ const ImportDataModal = ({ dataId, onClose }: { dataId: string; onClose: () => v
e
.
map
((
file
)
=>
{
e
.
map
((
file
)
=>
{
// @ts-ignore
// @ts-ignore
const
extension
=
file
?.
name
?.
split
(
'.'
).
pop
().
toLowerCase
();
const
extension
=
file
?.
name
?.
split
(
'.'
).
pop
().
toLowerCase
();
if
(
extension
===
'txt'
)
{
switch
(
extension
)
{
return
readTxtContent
(
file
);
case
'txt'
:
}
else
if
(
extension
===
'pdf'
)
{
case
'md'
:
return
readPdfContent
(
file
);
return
readTxtContent
(
file
);
}
else
if
(
extension
===
'docx'
||
extension
===
'doc'
)
{
case
'pdf'
:
return
readDocContent
(
file
);
return
readPdfContent
(
file
);
case
'doc'
:
case
'docx'
:
return
readDocContent
(
file
);
default
:
return
''
;
}
}
return
''
;
})
})
)
)
).
join
(
'\n'
);
).
join
(
'\n'
);
...
@@ -137,6 +143,7 @@ const ImportDataModal = ({ dataId, onClose }: { dataId: string; onClose: () => v
...
@@ -137,6 +143,7 @@ const ImportDataModal = ({ dataId, onClose }: { dataId: string; onClose: () => v
{
activeTab
===
'doc'
&&
(
{
activeTab
===
'doc'
&&
(
<
Flex
<
Flex
flexDirection=
{
'column'
}
flexDirection=
{
'column'
}
p=
{
2
}
h=
{
'100%'
}
h=
{
'100%'
}
alignItems=
{
'center'
}
alignItems=
{
'center'
}
justifyContent=
{
'center'
}
justifyContent=
{
'center'
}
...
@@ -145,7 +152,23 @@ const ImportDataModal = ({ dataId, onClose }: { dataId: string; onClose: () => v
...
@@ -145,7 +152,23 @@ const ImportDataModal = ({ dataId, onClose }: { dataId: string; onClose: () => v
borderRadius=
{
'md'
}
borderRadius=
{
'md'
}
>
>
<
Button
onClick=
{
onOpen
}
>
选择文件
</
Button
>
<
Button
onClick=
{
onOpen
}
>
选择文件
</
Button
>
{
fileText
&&
<
Box
mt=
{
2
}
>
一共
{
fileText
.
length
}
个字
</
Box
>
}
<
Box
mt=
{
2
}
>
支持
{
fileExtension
}
文件
</
Box
>
{
fileText
&&
(
<>
<
Box
mt=
{
2
}
>
一共
{
fileText
.
length
}
个字
</
Box
>
<
Box
maxH=
{
'300px'
}
w=
{
'100%'
}
overflow=
{
'auto'
}
p=
{
2
}
backgroundColor=
{
'blackAlpha.50'
}
whiteSpace=
{
'pre'
}
fontSize=
{
'xs'
}
>
{
fileText
}
</
Box
>
</>
)
}
</
Flex
>
</
Flex
>
)
}
)
}
</
Box
>
</
Box
>
...
...
src/pages/data/defail.tsx
deleted
100644 → 0
View file @
0cee404c
import
React
from
'react'
;
const
DataDetail
=
({
dataId
}:
{
dataId
:
string
})
=>
{
return
<
div
>
DataDetail
</
div
>;
};
export
default
DataDetail
;
export
async
function
getServerSideProps
(
context
:
any
)
{
const
dataId
=
context
.
query
?.
dataId
||
''
;
return
{
props
:
{
dataId
}
};
}
src/pages/data/detail.tsx
0 → 100644
View file @
02cee35a
import
React
from
'react'
;
import
{
Box
,
Card
,
Table
,
Thead
,
Tbody
,
Tr
,
Th
,
Td
,
TableContainer
}
from
'@chakra-ui/react'
;
import
ScrollData
from
'@/components/ScrollData'
;
import
{
getDataItems
}
from
'@/api/data'
;
import
{
usePaging
}
from
'@/hooks/usePaging'
;
import
type
{
DataItemSchema
}
from
'@/types/mongoSchema'
;
const
DataDetail
=
({
dataName
,
dataId
}:
{
dataName
:
string
;
dataId
:
string
})
=>
{
const
{
nextPage
,
isLoadAll
,
requesting
,
data
:
dataItems
}
=
usePaging
<
DataItemSchema
>
({
api
:
getDataItems
,
pageSize
:
10
,
params
:
{
dataId
}
});
return
(
<
Card
py=
{
4
}
h=
{
'100%'
}
display=
{
'flex'
}
flexDirection=
{
'column'
}
>
<
Box
px=
{
6
}
fontSize=
{
'xl'
}
fontWeight=
{
'bold'
}
>
{
dataName
}
拆分结果
</
Box
>
<
ScrollData
flex=
{
'1 0 0'
}
h=
{
0
}
px=
{
6
}
mt=
{
3
}
isLoadAll=
{
isLoadAll
}
requesting=
{
requesting
}
nextPage=
{
nextPage
}
fontSize=
{
'xs'
}
>
{
dataItems
.
map
((
item
)
=>
(
<
Box
key=
{
item
.
_id
}
>
{
item
.
result
.
map
((
result
,
i
)
=>
(
<
Box
key=
{
i
}
mb=
{
3
}
>
<
Box
fontWeight=
{
'bold'
}
>
Q:
{
result
.
q
}
</
Box
>
<
Box
>
A:
{
result
.
a
}
</
Box
>
</
Box
>
))
}
</
Box
>
))
}
</
ScrollData
>
</
Card
>
);
};
export
default
DataDetail
;
export
async
function
getServerSideProps
(
context
:
any
)
{
return
{
props
:
{
dataName
:
context
.
query
?.
dataName
||
''
,
dataId
:
context
.
query
?.
dataId
||
''
}
};
}
src/pages/data/list.tsx
View file @
02cee35a
import
React
,
{
useState
}
from
'react'
;
import
React
,
{
useState
,
useCallback
}
from
'react'
;
import
{
import
{
Card
,
Card
,
Box
,
Box
,
...
@@ -12,21 +12,30 @@ import {
...
@@ -12,21 +12,30 @@ import {
Td
,
Td
,
TableContainer
,
TableContainer
,
useDisclosure
,
useDisclosure
,
Input
Input
,
Menu
,
MenuButton
,
MenuList
,
MenuItem
}
from
'@chakra-ui/react'
;
}
from
'@chakra-ui/react'
;
import
{
getDataList
,
updateDataName
,
delData
}
from
'@/api/data'
;
import
{
getDataList
,
updateDataName
,
delData
,
getDataItems
}
from
'@/api/data'
;
import
{
usePaging
}
from
'@/hooks/usePaging'
;
import
{
usePaging
}
from
'@/hooks/usePaging'
;
import
type
{
DataListItem
}
from
'@/types/data'
;
import
type
{
DataListItem
}
from
'@/types/data'
;
import
ScrollData
from
'@/components/ScrollData'
;
import
ScrollData
from
'@/components/ScrollData'
;
import
dayjs
from
'dayjs'
;
import
dayjs
from
'dayjs'
;
import
dynamic
from
'next/dynamic'
;
import
dynamic
from
'next/dynamic'
;
import
{
useRouter
}
from
'next/router'
;
import
{
useConfirm
}
from
'@/hooks/useConfirm'
;
import
{
useConfirm
}
from
'@/hooks/useConfirm'
;
import
{
useRequest
}
from
'@/hooks/useRequest'
;
import
{
useRequest
}
from
'@/hooks/useRequest'
;
import
{
DataItemSchema
}
from
'@/types/mongoSchema'
;
const
CreateDataModal
=
dynamic
(()
=>
import
(
'./components/CreateDataModal'
));
const
CreateDataModal
=
dynamic
(()
=>
import
(
'./components/CreateDataModal'
));
const
ImportDataModal
=
dynamic
(()
=>
import
(
'./components/ImportDataModal'
));
const
ImportDataModal
=
dynamic
(()
=>
import
(
'./components/ImportDataModal'
));
export
type
ExportDataType
=
'jsonl'
;
const
DataList
=
()
=>
{
const
DataList
=
()
=>
{
const
router
=
useRouter
();
const
{
const
{
nextPage
,
nextPage
,
isLoadAll
,
isLoadAll
,
...
@@ -58,13 +67,51 @@ const DataList = () => {
...
@@ -58,13 +67,51 @@ const DataList = () => {
}
}
});
});
const
{
mutate
:
handleExportData
,
isLoading
:
isExporting
}
=
useRequest
({
mutationFn
:
async
({
data
,
type
}:
{
data
:
DataListItem
;
type
:
ExportDataType
})
=>
({
type
,
data
:
await
getDataItems
({
dataId
:
data
.
_id
,
pageNum
:
1
,
pageSize
:
data
.
totalData
}).
then
(
(
res
)
=>
res
.
data
)
}),
successToast
:
'导出数据集成功'
,
errorToast
:
'导出数据集异常'
,
onSuccess
(
res
:
{
type
:
ExportDataType
;
data
:
DataItemSchema
[]
})
{
// 合并数据
const
data
=
res
.
data
.
map
((
item
)
=>
item
.
result
).
flat
();
let
text
=
''
;
// 生成 jsonl
data
.
forEach
((
item
)
=>
{
const
result
=
JSON
.
stringify
({
prompt
:
`
${
item
.
q
.
toLocaleLowerCase
()}
</s>`
,
completion
:
`
${
item
.
a
}
</s>`
});
text
+=
`
${
result
}
\n`
;
});
// 去掉最后一个 \n
text
=
text
.
substring
(
0
,
text
.
length
-
1
);
// 导出为文件
const
blob
=
new
Blob
([
text
],
{
type
:
'application/json;charset=utf-8'
});
// 创建下载链接
const
downloadLink
=
document
.
createElement
(
'a'
);
downloadLink
.
href
=
window
.
URL
.
createObjectURL
(
blob
);
downloadLink
.
download
=
'file.jsonl'
;
// 添加链接到页面并触发下载
document
.
body
.
appendChild
(
downloadLink
);
downloadLink
.
click
();
document
.
body
.
removeChild
(
downloadLink
);
}
});
return
(
return
(
<
Box
display=
{
[
'block'
,
'flex'
]
}
flexDirection=
{
'column'
}
h=
{
'100%'
}
>
<
Box
display=
{
[
'block'
,
'flex'
]
}
flexDirection=
{
'column'
}
h=
{
'100%'
}
>
<
Card
px=
{
6
}
py=
{
4
}
>
<
Card
px=
{
6
}
py=
{
4
}
>
<
Flex
>
<
Flex
>
<
Box
flex=
{
1
}
mr=
{
1
}
>
<
Box
flex=
{
1
}
mr=
{
1
}
>
<
Box
fontSize=
{
'xl'
}
fontWeight=
{
'bold'
}
>
<
Box
fontSize=
{
'xl'
}
fontWeight=
{
'bold'
}
>
对话
数据管理
训练
数据管理
</
Box
>
</
Box
>
<
Box
fontSize=
{
'xs'
}
color=
{
'blackAlpha.600'
}
>
<
Box
fontSize=
{
'xs'
}
color=
{
'blackAlpha.600'
}
>
允许你将任意文本数据拆分成 QA 的形式。你可以使用这些 QA 去微调你的对话模型。
允许你将任意文本数据拆分成 QA 的形式。你可以使用这些 QA 去微调你的对话模型。
...
@@ -99,6 +146,7 @@ const DataList = () => {
...
@@ -99,6 +146,7 @@ const DataList = () => {
<
Tr
key=
{
item
.
_id
}
>
<
Tr
key=
{
item
.
_id
}
>
<
Td
>
<
Td
>
<
Input
<
Input
minW=
{
'150px'
}
placeholder=
"请输入数据集名称"
placeholder=
"请输入数据集名称"
defaultValue=
{
item
.
name
}
defaultValue=
{
item
.
name
}
size=
{
'sm'
}
size=
{
'sm'
}
...
@@ -118,7 +166,9 @@ const DataList = () => {
...
@@ -118,7 +166,9 @@ const DataList = () => {
variant=
{
'outline'
}
variant=
{
'outline'
}
colorScheme=
{
'gray'
}
colorScheme=
{
'gray'
}
mr=
{
2
}
mr=
{
2
}
onClick=
{
()
=>
setImportDataId
(
item
.
_id
)
}
onClick=
{
()
=>
router
.
push
(
`/data/detail?dataId=${item._id}&dataName=${item.name}`
)
}
>
>
详细
详细
</
Button
>
</
Button
>
...
@@ -130,9 +180,17 @@ const DataList = () => {
...
@@ -130,9 +180,17 @@ const DataList = () => {
>
>
导入
导入
</
Button
>
</
Button
>
<
Button
mr=
{
2
}
size=
{
'sm'
}
>
<
Menu
>
导出
<
MenuButton
as=
{
Button
}
mr=
{
2
}
size=
{
'sm'
}
>
</
Button
>
导出
</
MenuButton
>
<
MenuList
>
<
MenuItem
onClick=
{
()
=>
handleExportData
({
data
:
item
,
type
:
'jsonl'
})
}
>
jsonl
</
MenuItem
>
</
MenuList
>
</
Menu
>
<
Button
<
Button
size=
{
'sm'
}
size=
{
'sm'
}
colorScheme=
{
'red'
}
colorScheme=
{
'red'
}
...
...
src/pages/model/detail.tsx
View file @
02cee35a
...
@@ -264,10 +264,10 @@ const ModelDetail = ({ modelId }: { modelId: string }) => {
...
@@ -264,10 +264,10 @@ const ModelDetail = ({ modelId }: { modelId: string }) => {
onClick=
{
()
=>
{
onClick=
{
()
=>
{
SelectFileDom
.
current
?.
click
();
SelectFileDom
.
current
?.
click
();
}
}
}
}
title=
{
!
canTrain
?
'
'
:
'模型不支持微调
'
}
title=
{
!
canTrain
?
'
模型不支持微调'
:
'
'
}
isDisabled=
{
!
canTrain
}
isDisabled=
{
!
canTrain
}
>
>
上传
微调
数据集
上传数据集
</
Button
>
</
Button
>
<
Flex
<
Flex
as=
{
'a'
}
as=
{
'a'
}
...
@@ -283,16 +283,30 @@ const ModelDetail = ({ modelId }: { modelId: string }) => {
...
@@ -283,16 +283,30 @@ const ModelDetail = ({ modelId }: { modelId: string }) => {
</
Flex
>
</
Flex
>
</
Flex
>
</
Flex
>
{
/* 提示 */
}
{
/* 提示 */
}
<
Box
mt=
{
3
}
py=
{
3
}
color=
{
'blackAlpha.500'
}
>
<
Box
mt=
{
3
}
py=
{
3
}
color=
{
'blackAlpha.600'
}
>
<
Box
as=
{
'li'
}
lineHeight=
{
1.9
}
>
可以使用
<
Box
as=
{
'span'
}
fontWeight=
{
'bold'
}
textDecoration=
{
'underline'
}
color=
{
'blackAlpha.800'
}
mx=
{
2
}
cursor=
{
'pointer'
}
onClick=
{
()
=>
router
.
push
(
'/data/list'
)
}
>
数据拆分
</
Box
>
功能,从任意文本中提取数据集。
</
Box
>
<
Box
as=
{
'li'
}
lineHeight=
{
1.9
}
>
<
Box
as=
{
'li'
}
lineHeight=
{
1.9
}
>
每行包括一个 prompt 和一个 completion
每行包括一个 prompt 和一个 completion
</
Box
>
</
Box
>
<
Box
as=
{
'li'
}
lineHeight=
{
1.9
}
>
<
Box
as=
{
'li'
}
lineHeight=
{
1.9
}
>
prompt 必须以 \n\n###\n\n 结尾,且尽量保障每个 prompt
prompt 必须以
{
'</s>'
}
结尾
内容不都是同一个标点结尾,可以加一个空格打断相同性,
</
Box
>
</
Box
>
<
Box
as=
{
'li'
}
lineHeight=
{
1.9
}
>
<
Box
as=
{
'li'
}
lineHeight=
{
1.9
}
>
completion 开头必须有一个空格,
末尾必须以 ### 结尾,同样的不要都是同一个标点结尾。
completion 开头必须有一个空格,
必须以
{
'</s>'
}
结尾
</
Box
>
</
Box
>
</
Box
>
</
Box
>
<
Flex
mt=
{
5
}
alignItems=
{
'center'
}
>
<
Flex
mt=
{
5
}
alignItems=
{
'center'
}
>
...
...
src/service/models/authCode.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
import
{
AuthCodeSchema
as
AuthCodeType
}
from
'@/types/mongoSchema'
;
const
AuthCodeSchema
=
new
Schema
({
const
AuthCodeSchema
=
new
Schema
({
email
:
{
email
:
{
...
@@ -21,4 +22,5 @@ const AuthCodeSchema = new Schema({
...
@@ -21,4 +22,5 @@ const AuthCodeSchema = new Schema({
}
}
});
});
export
const
AuthCode
=
models
[
'auth_code'
]
||
model
(
'auth_code'
,
AuthCodeSchema
);
export
const
AuthCode
:
Model
<
AuthCodeType
>
=
models
[
'auth_code'
]
||
model
(
'auth_code'
,
AuthCodeSchema
);
src/service/models/bill.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
import
{
modelList
}
from
'@/constants/model'
;
import
{
modelList
}
from
'@/constants/model'
;
import
{
BillSchema
as
BillType
}
from
'@/types/mongoSchema'
;
const
BillSchema
=
new
Schema
({
const
BillSchema
=
new
Schema
({
userId
:
{
userId
:
{
...
@@ -42,4 +43,4 @@ const BillSchema = new Schema({
...
@@ -42,4 +43,4 @@ const BillSchema = new Schema({
}
}
});
});
export
const
Bill
=
models
[
'bill'
]
||
model
(
'bill'
,
BillSchema
);
export
const
Bill
:
Model
<
BillType
>
=
models
[
'bill'
]
||
model
(
'bill'
,
BillSchema
);
src/service/models/chat.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
import
{
ChatSchema
as
ChatType
}
from
'@/types/mongoSchema'
;
const
ChatSchema
=
new
Schema
({
const
ChatSchema
=
new
Schema
({
userId
:
{
userId
:
{
...
@@ -47,4 +48,4 @@ const ChatSchema = new Schema({
...
@@ -47,4 +48,4 @@ const ChatSchema = new Schema({
}
}
});
});
export
const
Chat
=
models
[
'chat'
]
||
model
(
'chat'
,
ChatSchema
);
export
const
Chat
:
Model
<
ChatType
>
=
models
[
'chat'
]
||
model
(
'chat'
,
ChatSchema
);
src/service/models/data.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
import
{
DataItemSchema
as
Datatype
}
from
'@/types/mongoSchema'
;
const
DataSchema
=
new
Schema
({
const
DataSchema
=
new
Schema
({
userId
:
{
userId
:
{
...
@@ -20,4 +21,4 @@ const DataSchema = new Schema({
...
@@ -20,4 +21,4 @@ const DataSchema = new Schema({
}
}
});
});
export
const
Data
=
models
[
'data'
]
||
model
(
'data'
,
DataSchema
);
export
const
Data
:
Model
<
Datatype
>
=
models
[
'data'
]
||
model
(
'data'
,
DataSchema
);
src/service/models/dataItem.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
type
{
DataItemSchema
as
DataItemType
}
from
'@/types/mongoSchema'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
const
DataItemSchema
=
new
Schema
({
const
DataItemSchema
=
new
Schema
({
userId
:
{
userId
:
{
...
@@ -45,4 +46,5 @@ const DataItemSchema = new Schema({
...
@@ -45,4 +46,5 @@ const DataItemSchema = new Schema({
}
}
});
});
export
const
DataItem
=
models
[
'dataItem'
]
||
model
(
'dataItem'
,
DataItemSchema
);
export
const
DataItem
:
Model
<
DataItemType
>
=
models
[
'dataItem'
]
||
model
(
'dataItem'
,
DataItemSchema
);
src/service/models/model.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
as
MongoModel
}
from
'mongoose'
;
import
{
ModelSchema
as
ModelType
}
from
'@/types/mongoSchema'
;
const
ModelSchema
=
new
Schema
({
const
ModelSchema
=
new
Schema
({
userId
:
{
userId
:
{
type
:
Schema
.
Types
.
ObjectId
,
type
:
Schema
.
Types
.
ObjectId
,
...
@@ -95,4 +95,4 @@ const ModelSchema = new Schema({
...
@@ -95,4 +95,4 @@ const ModelSchema = new Schema({
}
}
});
});
export
const
Model
=
models
[
'model'
]
||
model
(
'model'
,
ModelSchema
);
export
const
Model
:
MongoModel
<
ModelType
>
=
models
[
'model'
]
||
model
(
'model'
,
ModelSchema
);
src/service/models/pay.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
import
{
PaySchema
as
PayType
}
from
'@/types/mongoSchema'
;
const
PaySchema
=
new
Schema
({
const
PaySchema
=
new
Schema
({
userId
:
{
userId
:
{
type
:
Schema
.
Types
.
ObjectId
,
type
:
Schema
.
Types
.
ObjectId
,
...
@@ -26,4 +26,4 @@ const PaySchema = new Schema({
...
@@ -26,4 +26,4 @@ const PaySchema = new Schema({
}
}
});
});
export
const
Pay
=
models
[
'pay'
]
||
model
(
'pay'
,
PaySchema
);
export
const
Pay
:
Model
<
PayType
>
=
models
[
'pay'
]
||
model
(
'pay'
,
PaySchema
);
src/service/models/training.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
import
{
TrainingSchema
as
TrainingType
}
from
'@/types/mongoSchema'
;
const
TrainingSChema
=
new
Schema
({
const
TrainingSChema
=
new
Schema
({
serviceName
:
{
serviceName
:
{
// 模型厂商名
// 模型厂商名
...
@@ -25,4 +25,5 @@ const TrainingSChema = new Schema({
...
@@ -25,4 +25,5 @@ const TrainingSChema = new Schema({
}
}
});
});
export
const
Training
=
models
[
'training'
]
||
model
(
'training'
,
TrainingSChema
);
export
const
Training
:
Model
<
TrainingType
>
=
models
[
'training'
]
||
model
(
'training'
,
TrainingSChema
);
src/service/models/user.ts
View file @
02cee35a
import
{
Schema
,
model
,
models
}
from
'mongoose'
;
import
{
Schema
,
model
,
models
,
Model
}
from
'mongoose'
;
import
{
hashPassword
}
from
'@/service/utils/tools'
;
import
{
hashPassword
}
from
'@/service/utils/tools'
;
import
{
PRICE_SCALE
}
from
'@/constants/common'
;
import
{
PRICE_SCALE
}
from
'@/constants/common'
;
import
{
UserModelSchema
}
from
'@/types/mongoSchema'
;
const
UserSchema
=
new
Schema
({
const
UserSchema
=
new
Schema
({
email
:
{
email
:
{
type
:
String
,
type
:
String
,
...
@@ -38,4 +38,4 @@ const UserSchema = new Schema({
...
@@ -38,4 +38,4 @@ const UserSchema = new Schema({
}
}
});
});
export
const
User
=
models
[
'user'
]
||
model
(
'user'
,
UserSchema
);
export
const
User
:
Model
<
UserModelSchema
>
=
models
[
'user'
]
||
model
(
'user'
,
UserSchema
);
src/types/index.d.ts
View file @
02cee35a
...
@@ -16,4 +16,4 @@ export type PagingData<T> = {
...
@@ -16,4 +16,4 @@ export type PagingData<T> = {
total
;
total
;
};
};
export
type
RequestPaging
=
{
pageNum
:
number
;
pageSize
:
number
};
export
type
RequestPaging
=
{
pageNum
:
number
;
pageSize
:
number
;
[
key
]:
any
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment