Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
E
elleai
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-tech
E
ellehuis-group
backend
elleai
Commits
c8b7e1de
Commit
c8b7e1de
authored
Nov 28, 2024
by
陈立彬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
单题答题改为流式返回
parent
e0628f0e
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
52 additions
and
106 deletions
+52
-106
AppExamineService.java
.../breeze/elleai/application/service/AppExamineService.java
+51
-77
ExamineMobileController.java
...eeze/elleai/controller/front/ExamineMobileController.java
+1
-29
No files found.
src/main/java/cn/breeze/elleai/application/service/AppExamineService.java
View file @
c8b7e1de
...
...
@@ -1501,10 +1501,7 @@ public class AppExamineService {
* @param userPrincipal
* @param request
*/
public
SubmitAnswerStreamResultDto
submitAnswerStream
(
UserPrincipal
userPrincipal
,
SubmitAnswerMobileRequestDto
request
)
{
SubmitAnswerStreamResultDto
resultDto
=
new
SubmitAnswerStreamResultDto
();
public
Flux
<
ServerSentEvent
<
SubmitAnswerStreamResultDto
>>
submitAnswerStream
(
UserPrincipal
userPrincipal
,
SubmitAnswerMobileRequestDto
request
)
{
String
userId
=
userPrincipal
.
getUserId
();
Integer
examineId
=
request
.
getExamineId
();
String
answer
=
request
.
getAnswer
();
...
...
@@ -1572,59 +1569,8 @@ public class AppExamineService {
Integer
businessId
=
detailRecordId
;
log
.
info
(
"开始AI评分"
);
// 获取评分信息
AiSingleEvaluateResultDto
evaluateResult
=
extensionService
.
run4SingleQaScore
(
businessNo
,
userId
,
businessId
);
if
(
Objects
.
nonNull
(
evaluateResult
))
{
log
.
info
(
"获取到评分结果: "
+
JSONObject
.
toJSONString
(
evaluateResult
));
// 更新答题点评信息
ExamineRecordDetailSaveModel
detailSaveModel
=
new
ExamineRecordDetailSaveModel
();
detailSaveModel
.
setId
(
businessId
);
detailSaveModel
.
setScore
(
evaluateResult
.
getScore
());
examineService
.
saveExamineRecordDetail
(
detailSaveModel
);
// 定时任务
ExamineEvaluateJobResponseModel
evaluateJob
=
commonService
.
getEvaluateJob
(
0
,
detailRecordId
);
if
(
Objects
.
isNull
(
evaluateJob
))
{
ExamineEvaluateJobSaveModel
model
=
new
ExamineEvaluateJobSaveModel
();
model
.
setBusinessId
(
detailRecordId
);
model
.
setBusinessNo
(
businessNo
);
model
.
setType
(
0
);
model
.
setStatus
(
0
);
model
.
setUserId
(
userId
);
model
.
setCreateTime
(
new
Date
());
commonService
.
saveEvaluateJob
(
model
);
}
// 更新缓存
businessCache
.
setRecordId
(
recordId
);
redisTemplate
.
opsForValue
().
set
(
examBusinessKey
,
JSONObject
.
toJSONString
(
businessCache
),
1
,
TimeUnit
.
DAYS
);
// 最后一题答题,完成考试,执行AI总点评
if
(!
businessCache
.
isHasNext
())
{
this
.
completeExamine
(
userPrincipal
,
examineId
,
businessNo
);
}
resultDto
.
setScore
(
evaluateResult
.
getScore
());
ExamineQaDto
examineQaDto
=
this
.
qaDetail
(
questionId
);
if
(
Objects
.
nonNull
(
examineQaDto
))
{
resultDto
.
setAnswer
(
examineQaDto
.
getAnswer
());
}
return
resultDto
;
}
else
{
throw
new
InternalException
(-
1
,
"获取评分信息异常"
);
}
}
/**
* 单题评分+点评
* @param sessionId
* @param userId
* @param businessId 单题答题记录ID
*/
public
Flux
<
ServerSentEvent
<
AiSingleEvaluateResultDto
>>
run4SingleEvaluateStream
(
String
sessionId
,
String
userId
,
Integer
businessId
)
{
Map
<
String
,
String
>
inputs
=
new
HashMap
<>();
inputs
.
put
(
"scene"
,
"single_
evaluat
e"
);
inputs
.
put
(
"scene"
,
"single_
qa_scor
e"
);
inputs
.
put
(
"business_id"
,
String
.
valueOf
(
businessId
));
JSONObject
param
=
new
JSONObject
();
param
.
put
(
"query"
,
businessId
);
...
...
@@ -1633,36 +1579,64 @@ public class AppExamineService {
param
.
put
(
"conversation_id"
,
""
);
param
.
put
(
"user"
,
userId
);
final
StringBuffer
evaluationBuffer
=
new
StringBuffer
();
final
StringBuffer
scoreBuffer
=
new
StringBuffer
();
final
String
[]
difySessionId
=
{
""
};
String
finalSessionId
=
sessionId
;
final
StringBuffer
answerBuffer
=
new
StringBuffer
();
final
StringBuffer
replyBuffer
=
new
StringBuffer
();
final
String
[]
score
=
new
String
[
1
];
return
webClient
.
post
().
uri
(
"/chat-messages"
).
accept
(
MediaType
.
TEXT_EVENT_STREAM
).
bodyValue
(
param
.
toJSONString
()).
exchangeToFlux
(
r
->
r
.
bodyToFlux
(
String
.
class
))
.
mapNotNull
(
v
->
{
JSONObject
json
=
JSONObject
.
parseObject
(
v
);
String
evaluation
=
json
.
getJSONObject
(
"answer"
).
getString
(
"evaluation"
);
if
(
ObjectUtil
.
isNotNull
(
evaluation
))
{
evaluationBuffer
.
append
(
evaluation
);
}
if
(
ObjectUtil
.
isEmpty
(
difySessionId
[
0
])
&&
ObjectUtil
.
isNotEmpty
(
json
.
getString
(
"conversation_id"
)))
{
difySessionId
[
0
]
=
json
.
getString
(
"conversation_id"
);
String
reply
=
json
.
getString
(
"answer"
);
if
(
Objects
.
nonNull
(
reply
))
{
replyBuffer
.
append
(
reply
);
// ai评分正则
Pattern
scorePattern
=
Pattern
.
compile
(
"\"score\":\"(\\d+)\""
);
Matcher
scoreMatcher
=
scorePattern
.
matcher
(
replyBuffer
.
toString
());
if
(
scoreMatcher
.
find
()
&&
StringUtils
.
isEmpty
(
score
[
0
]))
{
score
[
0
]
=
scoreMatcher
.
group
(
1
);
// 提取第一个捕获组的内容
}
// 标准答案正则
Pattern
answerPattern
=
Pattern
.
compile
(
"\"answer\":\"([^\"]*)"
);
Matcher
answerMatcher
=
answerPattern
.
matcher
(
replyBuffer
.
toString
());
if
(
answerMatcher
.
find
())
{
answerBuffer
.
append
(
answerMatcher
.
group
(
1
));
}
}
S
tring
score
=
json
.
getJSONObject
(
"answer"
).
getString
(
"score"
);
if
(
ObjectUtil
.
isNotNull
(
score
))
{
scoreBuffer
.
append
(
score
);
S
ubmitAnswerStreamResultDto
result
=
new
SubmitAnswerStreamResultDto
(
);
if
(
StringUtils
.
isNotEmpty
(
score
[
0
]
))
{
result
.
setScore
(
Float
.
valueOf
(
score
[
0
])
);
}
AiSingleEvaluateResultDto
result
=
new
AiSingleEvaluateResultDto
();
result
.
setEvaluation
(
evaluationBuffer
.
toString
());
result
.
setScore
(
Float
.
valueOf
(
scoreBuffer
.
toString
()));
result
.
setDifySessionId
(
difySessionId
[
0
]);
result
.
setAnswer
(
answerBuffer
.
toString
());
return
result
;
}).
doOnComplete
(
()
->
{
// 更新DIFY会话ID
System
.
out
.
println
(
"更新"
);
// 更新答题点评信息
ExamineRecordDetailSaveModel
detailSaveModel
=
new
ExamineRecordDetailSaveModel
();
detailSaveModel
.
setId
(
businessId
);
detailSaveModel
.
setScore
(
Float
.
valueOf
(
score
[
0
]));
examineService
.
saveExamineRecordDetail
(
detailSaveModel
);
// 定时任务
ExamineEvaluateJobResponseModel
evaluateJob
=
commonService
.
getEvaluateJob
(
0
,
detailRecordId
);
if
(
Objects
.
isNull
(
evaluateJob
))
{
ExamineEvaluateJobSaveModel
model
=
new
ExamineEvaluateJobSaveModel
();
model
.
setBusinessId
(
detailRecordId
);
model
.
setBusinessNo
(
businessNo
);
model
.
setType
(
0
);
model
.
setStatus
(
0
);
model
.
setUserId
(
userId
);
model
.
setCreateTime
(
new
Date
());
commonService
.
saveEvaluateJob
(
model
);
}
// 更新缓存
businessCache
.
setRecordId
(
recordId
);
redisTemplate
.
opsForValue
().
set
(
examBusinessKey
,
JSONObject
.
toJSONString
(
businessCache
),
1
,
TimeUnit
.
DAYS
);
// 最后一题答题,完成考试,执行AI总点评
if
(!
businessCache
.
isHasNext
())
{
this
.
completeExamine
(
userPrincipal
,
examineId
,
businessNo
);
}
}
).
map
(
v
->
ServerSentEvent
.
builder
(
v
).
build
());
}
}
src/main/java/cn/breeze/elleai/controller/front/ExamineMobileController.java
View file @
c8b7e1de
...
...
@@ -164,34 +164,6 @@ public class ExamineMobileController {
public
Flux
<
ServerSentEvent
<
SubmitAnswerStreamResultDto
>>
submitAnswerStream
(
@Parameter
(
hidden
=
true
)
UserPrincipal
userPrincipal
,
@RequestBody
SubmitAnswerMobileRequestDto
request
)
{
SubmitAnswerStreamResultDto
resultDto
=
examineService
.
submitAnswerStream
(
userPrincipal
,
request
);
// 拆分答案,流式返回
List
<
String
>
arrays
=
splitStringIntoArrays
(
resultDto
.
getAnswer
());
return
Flux
.
fromIterable
(
arrays
)
.
map
(
data
->
{
SubmitAnswerStreamResultDto
rs
=
new
SubmitAnswerStreamResultDto
();
rs
.
setAnswer
(
data
);
rs
.
setScore
(
resultDto
.
getScore
());
return
ServerSentEvent
.<
SubmitAnswerStreamResultDto
>
builder
().
data
(
rs
).
build
();
})
.
delayElements
(
Duration
.
ofMillis
(
100
))
.
take
(
arrays
.
size
());
}
/**
* 将答案拆分成最多10个数组
* @param input
* @return
*/
public
static
List
<
String
>
splitStringIntoArrays
(
String
input
)
{
int
maxArrays
=
10
;
List
<
String
>
arrays
=
new
ArrayList
<>();
int
length
=
input
.
length
();
int
step
=
Math
.
max
(
1
,
length
/
maxArrays
);
for
(
int
i
=
1
;
i
<=
length
&&
arrays
.
size
()
<
maxArrays
;
i
+=
step
)
{
arrays
.
add
(
input
.
substring
(
0
,
i
));
}
return
arrays
;
return
examineService
.
submitAnswerStream
(
userPrincipal
,
request
);
}
}
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