Kevin Hu
commited on
Commit
·
684f1d7
1
Parent(s):
58ecd6d
refine reteival of multi-turn conversation (#2520)
Browse files### What problem does this PR solve?
#2362 #2484
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
- [x] Performance Improvement
api/db/services/dialog_service.py
CHANGED
@@ -149,6 +149,11 @@ def chat(dialog, messages, stream=True, **kwargs):
|
|
149 |
prompt_config["system"] = prompt_config["system"].replace(
|
150 |
"{%s}" % p["key"], " ")
|
151 |
|
|
|
|
|
|
|
|
|
|
|
152 |
rerank_mdl = None
|
153 |
if dialog.rerank_id:
|
154 |
rerank_mdl = LLMBundle(dialog.tenant_id, LLMType.RERANK, dialog.rerank_id)
|
@@ -410,6 +415,58 @@ def rewrite(tenant_id, llm_id, question):
|
|
410 |
return ans
|
411 |
|
412 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
413 |
def tts(tts_mdl, text):
|
414 |
if not tts_mdl or not text: return
|
415 |
bin = b""
|
|
|
149 |
prompt_config["system"] = prompt_config["system"].replace(
|
150 |
"{%s}" % p["key"], " ")
|
151 |
|
152 |
+
if len(questions) > 1 and prompt_config.get("refine_multiturn"):
|
153 |
+
questions = [full_question(dialog.tenant_id, dialog.llm_id, messages)]
|
154 |
+
else:
|
155 |
+
questions = questions[-1:]
|
156 |
+
|
157 |
rerank_mdl = None
|
158 |
if dialog.rerank_id:
|
159 |
rerank_mdl = LLMBundle(dialog.tenant_id, LLMType.RERANK, dialog.rerank_id)
|
|
|
415 |
return ans
|
416 |
|
417 |
|
418 |
+
def full_question(tenant_id, llm_id, messages):
|
419 |
+
if llm_id2llm_type(llm_id) == "image2text":
|
420 |
+
chat_mdl = LLMBundle(tenant_id, LLMType.IMAGE2TEXT, llm_id)
|
421 |
+
else:
|
422 |
+
chat_mdl = LLMBundle(tenant_id, LLMType.CHAT, llm_id)
|
423 |
+
conv = []
|
424 |
+
for m in messages:
|
425 |
+
if m["role"] not in ["user", "assistant"]: continue
|
426 |
+
conv.append("{}: {}".format(m["role"].upper(), m["content"]))
|
427 |
+
conv = "\n".join(conv)
|
428 |
+
prompt = f"""
|
429 |
+
Role: A helpful assistant
|
430 |
+
Task: Generate a full user question that would follow the conversation.
|
431 |
+
Requirements & Restrictions:
|
432 |
+
- Text generated MUST be in the same language of the original user's question.
|
433 |
+
- If the user's latest question is completely, don't do anything, just return the original question.
|
434 |
+
- DON'T generate anything except a refined question.
|
435 |
+
|
436 |
+
######################
|
437 |
+
-Examples-
|
438 |
+
######################
|
439 |
+
|
440 |
+
# Example 1
|
441 |
+
## Conversation
|
442 |
+
USER: What is the name of Donald Trump's father?
|
443 |
+
ASSISTANT: Fred Trump.
|
444 |
+
USER: And his mother?
|
445 |
+
###############
|
446 |
+
Output: What's the name of Donald Trump's mother?
|
447 |
+
|
448 |
+
------------
|
449 |
+
# Example 2
|
450 |
+
## Conversation
|
451 |
+
USER: What is the name of Donald Trump's father?
|
452 |
+
ASSISTANT: Fred Trump.
|
453 |
+
USER: And his mother?
|
454 |
+
ASSISTANT: Mary Trump.
|
455 |
+
User: What's her full name?
|
456 |
+
###############
|
457 |
+
Output: What's the full name of Donald Trump's mother Mary Trump?
|
458 |
+
|
459 |
+
######################
|
460 |
+
|
461 |
+
# Real Data
|
462 |
+
## Conversation
|
463 |
+
{conv}
|
464 |
+
###############
|
465 |
+
"""
|
466 |
+
ans = chat_mdl.chat(prompt, [{"role": "user", "content": "Output: "}], {"temperature": 0.2})
|
467 |
+
return ans if ans.find("**ERROR**") < 0 else messages[-1]["content"]
|
468 |
+
|
469 |
+
|
470 |
def tts(tts_mdl, text):
|
471 |
if not tts_mdl or not text: return
|
472 |
bin = b""
|