mirror of
https://git.mirrors.martin98.com/https://github.com/infiniflow/ragflow.git
synced 2025-08-02 06:10:36 +08:00
Refa: make Rewrite component effective to relative data expression. (#5752)
### What problem does this PR solve? #5716 ### Type of change - [x] Refactoring
This commit is contained in:
parent
0e3e129a83
commit
b1bbb9e210
@ -14,9 +14,8 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
#
|
#
|
||||||
from abc import ABC
|
from abc import ABC
|
||||||
from api.db import LLMType
|
|
||||||
from api.db.services.llm_service import LLMBundle
|
|
||||||
from agent.component import GenerateParam, Generate
|
from agent.component import GenerateParam, Generate
|
||||||
|
from rag.prompts import full_question
|
||||||
|
|
||||||
|
|
||||||
class RewriteQuestionParam(GenerateParam):
|
class RewriteQuestionParam(GenerateParam):
|
||||||
@ -33,48 +32,6 @@ class RewriteQuestionParam(GenerateParam):
|
|||||||
def check(self):
|
def check(self):
|
||||||
super().check()
|
super().check()
|
||||||
|
|
||||||
def get_prompt(self, conv, language, query):
|
|
||||||
prompt = """
|
|
||||||
Role: A helpful assistant
|
|
||||||
Task: Generate a full user question that would follow the conversation.
|
|
||||||
Requirements & Restrictions:
|
|
||||||
- Text generated MUST be in the same language of the original user's question.
|
|
||||||
- If the user's latest question is completely, don't do anything, just return the original question.
|
|
||||||
- DON'T generate anything except a refined question."""
|
|
||||||
|
|
||||||
if language:
|
|
||||||
prompt += f"""
|
|
||||||
- Text generated MUST be in {language}"""
|
|
||||||
|
|
||||||
prompt += f"""
|
|
||||||
######################
|
|
||||||
-Examples-
|
|
||||||
######################
|
|
||||||
# Example 1
|
|
||||||
## Conversation
|
|
||||||
USER: What is the name of Donald Trump's father?
|
|
||||||
ASSISTANT: Fred Trump.
|
|
||||||
USER: And his mother?
|
|
||||||
###############
|
|
||||||
Output: What's the name of Donald Trump's mother?
|
|
||||||
------------
|
|
||||||
# Example 2
|
|
||||||
## Conversation
|
|
||||||
USER: What is the name of Donald Trump's father?
|
|
||||||
ASSISTANT: Fred Trump.
|
|
||||||
USER: And his mother?
|
|
||||||
ASSISTANT: Mary Trump.
|
|
||||||
USER: What's her full name?
|
|
||||||
###############
|
|
||||||
Output: What's the full name of Donald Trump's mother Mary Trump?
|
|
||||||
######################
|
|
||||||
# Real Data
|
|
||||||
## Conversation
|
|
||||||
{conv}
|
|
||||||
###############
|
|
||||||
"""
|
|
||||||
return prompt
|
|
||||||
|
|
||||||
|
|
||||||
class RewriteQuestion(Generate, ABC):
|
class RewriteQuestion(Generate, ABC):
|
||||||
component_name = "RewriteQuestion"
|
component_name = "RewriteQuestion"
|
||||||
@ -83,15 +40,10 @@ class RewriteQuestion(Generate, ABC):
|
|||||||
hist = self._canvas.get_history(self._param.message_history_window_size)
|
hist = self._canvas.get_history(self._param.message_history_window_size)
|
||||||
query = self.get_input()
|
query = self.get_input()
|
||||||
query = str(query["content"][0]) if "content" in query else ""
|
query = str(query["content"][0]) if "content" in query else ""
|
||||||
conv = []
|
messages = [h for h in hist if h["role"]!="system"]
|
||||||
for m in hist:
|
if messages[-1]["role"] != "user":
|
||||||
if m["role"] not in ["user", "assistant"]:
|
messages.append({"role": "user", "content": query})
|
||||||
continue
|
ans = full_question(self._canvas.get_tenant_id(), self._param.llm_id, messages, self.gen_lang(self._param.language))
|
||||||
conv.append("{}: {}".format(m["role"].upper(), m["content"]))
|
|
||||||
conv = "\n".join(conv)
|
|
||||||
chat_mdl = LLMBundle(self._canvas.get_tenant_id(), LLMType.CHAT, self._param.llm_id)
|
|
||||||
ans = chat_mdl.chat(self._param.get_prompt(conv, self.gen_lang(self._param.language), query),
|
|
||||||
[{"role": "user", "content": "Output: "}], self._param.gen_conf())
|
|
||||||
self._canvas.history.pop()
|
self._canvas.history.pop()
|
||||||
self._canvas.history.append(("user", ans))
|
self._canvas.history.append(("user", ans))
|
||||||
return RewriteQuestion.be_output(ans)
|
return RewriteQuestion.be_output(ans)
|
||||||
|
@ -182,7 +182,7 @@ Requirements:
|
|||||||
return kwd
|
return kwd
|
||||||
|
|
||||||
|
|
||||||
def full_question(tenant_id, llm_id, messages):
|
def full_question(tenant_id, llm_id, messages, language=None):
|
||||||
if llm_id2llm_type(llm_id) == "image2text":
|
if llm_id2llm_type(llm_id) == "image2text":
|
||||||
chat_mdl = LLMBundle(tenant_id, LLMType.IMAGE2TEXT, llm_id)
|
chat_mdl = LLMBundle(tenant_id, LLMType.IMAGE2TEXT, llm_id)
|
||||||
else:
|
else:
|
||||||
@ -204,9 +204,16 @@ Task and steps:
|
|||||||
2. If the user's question involves relative date, you need to convert it into absolute date based on the current date, which is {today}. For example: 'yesterday' would be converted to {yesterday}.
|
2. If the user's question involves relative date, you need to convert it into absolute date based on the current date, which is {today}. For example: 'yesterday' would be converted to {yesterday}.
|
||||||
|
|
||||||
Requirements & Restrictions:
|
Requirements & Restrictions:
|
||||||
- Text generated MUST be in the same language of the original user's question.
|
|
||||||
- If the user's latest question is completely, don't do anything, just return the original question.
|
- If the user's latest question is completely, don't do anything, just return the original question.
|
||||||
- DON'T generate anything except a refined question.
|
- DON'T generate anything except a refined question."""
|
||||||
|
if language:
|
||||||
|
prompt += f"""
|
||||||
|
- Text generated MUST be in {language}."""
|
||||||
|
else:
|
||||||
|
prompt += """
|
||||||
|
- Text generated MUST be in the same language of the original user's question.
|
||||||
|
"""
|
||||||
|
prompt += f"""
|
||||||
|
|
||||||
######################
|
######################
|
||||||
-Examples-
|
-Examples-
|
||||||
@ -239,8 +246,8 @@ ASSISTANT: Cloudy.
|
|||||||
USER: What's about tomorrow in Rochester?
|
USER: What's about tomorrow in Rochester?
|
||||||
###############
|
###############
|
||||||
Output: What's the weather in Rochester on {tomorrow}?
|
Output: What's the weather in Rochester on {tomorrow}?
|
||||||
######################
|
|
||||||
|
|
||||||
|
######################
|
||||||
# Real Data
|
# Real Data
|
||||||
## Conversation
|
## Conversation
|
||||||
{conv}
|
{conv}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user