feat: chat前的前文剪裁逻辑

This commit is contained in:
RockChinQ
2024-02-01 17:42:51 +08:00
parent 6f2d7d96d0
commit a9d92115f8
4 changed files with 33 additions and 14 deletions
+2 -1
View File
@@ -149,7 +149,8 @@ class Controller:
await self._execute_from_stage(0, query) await self._execute_from_stage(0, query)
except Exception as e: except Exception as e:
self.ap.logger.error(f"处理请求时出错 {query}: {e}") self.ap.logger.error(f"处理请求时出错 {query}: {e}")
self.ap.logger.debug(f"处理请求时出错 {query}: {e}", exc_info=True) # self.ap.logger.debug(f"处理请求时出错 {query}: {e}", exc_info=True)
traceback.print_exc()
finally: finally:
self.ap.logger.debug(f"Query {query} processed") self.ap.logger.debug(f"Query {query} processed")
+20
View File
@@ -52,6 +52,26 @@ class PreProcessor(stage.PipelineStage):
query.messages = event_ctx.event.prompt query.messages = event_ctx.event.prompt
# 根据模型max_tokens剪裁 # 根据模型max_tokens剪裁
max_tokens = min(query.use_model.max_tokens, self.ap.cfg_mgr.data['prompt_submit_length'])
test_messages = query.prompt.messages + query.messages + [query.user_message]
while await query.use_model.tokenizer.count_token(test_messages, query.use_model) > max_tokens:
# 前文都pop完了,还是大于max_tokens,由于prompt和user_messages不能删减,报错
if len(query.prompt.messages) == 0:
return entities.StageProcessResult(
result_type=entities.ResultType.INTERRUPT,
new_query=query,
user_notice='输入内容过长,请减少情景预设或者输入内容长度',
console_notice='输入内容过长,请减少情景预设或者输入内容长度,或者增大配置文件中的 prompt_submit_length 项(但不能超过所用模型最大tokens数)'
)
query.messages.pop(0) # pop第一个肯定是role=user的
# 继续pop到第二个role=user前一个
while len(query.messages) > 0 and query.messages[0].role != 'user':
query.messages.pop(0)
test_messages = query.prompt.messages + query.messages + [query.user_message]
return entities.StageProcessResult( return entities.StageProcessResult(
result_type=entities.ResultType.CONTINUE, result_type=entities.ResultType.CONTINUE,
+9 -11
View File
@@ -82,14 +82,12 @@ class ChatMessageHandler(handler.MessageHandler):
query.session.using_conversation.messages.append(query.user_message) query.session.using_conversation.messages.append(query.user_message)
query.session.using_conversation.messages.extend(query.resp_messages) query.session.using_conversation.messages.extend(query.resp_messages)
print(query.session.using_conversation.messages) await self.ap.ctr_mgr.usage.post_query_record(
session_type=query.session.launcher_type.value,
await self.ap.ctr_mgr.usage.post_query_record( session_id=str(query.session.launcher_id),
session_type=query.session.launcher_type.value, query_ability_provider="QChatGPT.Chat",
session_id=str(query.session.launcher_id), usage=text_length,
query_ability_provider="QChatGPT.Chat", model_name=query.use_model.name,
usage=text_length, response_seconds=int(time.time() - start_time),
model_name=query.use_model.name, retry_times=-1,
response_seconds=int(time.time() - start_time), )
retry_times=-1,
)
@@ -23,6 +23,6 @@ class Tiktoken(tokenizer.LLMTokenizer):
num_tokens = 0 num_tokens = 0
for message in messages: for message in messages:
num_tokens += len(encoding.encode(message.role)) num_tokens += len(encoding.encode(message.role))
num_tokens += len(encoding.encode(message.content)) num_tokens += len(encoding.encode(message.content if message.content is not None else ''))
num_tokens += 3 # every reply is primed with <|start|>assistant<|message|> num_tokens += 3 # every reply is primed with <|start|>assistant<|message|>
return num_tokens return num_tokens