mirror of
https://github.com/langgenius/dify.git
synced 2026-04-29 20:48:01 +08:00
fix knowledge single retrieve when function call response is none
This commit is contained in:
parent
1c7573a686
commit
4ec14d8d91
@ -342,12 +342,21 @@ class AnthropicLargeLanguageModel(LargeLanguageModel):
|
|||||||
Convert prompt messages to dict list and system
|
Convert prompt messages to dict list and system
|
||||||
"""
|
"""
|
||||||
system = ""
|
system = ""
|
||||||
|
first_loop = True
|
||||||
|
for message in prompt_messages:
|
||||||
|
if isinstance(message, SystemPromptMessage):
|
||||||
|
message.content = message.content.strip()
|
||||||
|
if first_loop:
|
||||||
|
system = message.content
|
||||||
|
first_loop = False
|
||||||
|
else:
|
||||||
|
system += "\n"
|
||||||
|
system += message.content
|
||||||
|
|
||||||
prompt_message_dicts = []
|
prompt_message_dicts = []
|
||||||
|
|
||||||
for message in prompt_messages:
|
for message in prompt_messages:
|
||||||
if isinstance(message, SystemPromptMessage):
|
if not isinstance(message, SystemPromptMessage):
|
||||||
system += message.content + ("\n" if not system else "")
|
|
||||||
else:
|
|
||||||
prompt_message_dicts.append(self._convert_prompt_message_to_dict(message))
|
prompt_message_dicts.append(self._convert_prompt_message_to_dict(message))
|
||||||
|
|
||||||
return system, prompt_message_dicts
|
return system, prompt_message_dicts
|
||||||
|
|||||||
@ -103,69 +103,69 @@ class KnowledgeRetrievalNode(BaseNode):
|
|||||||
elif node_data.retrieval_mode == DatasetRetrieveConfigEntity.RetrieveStrategy.MULTIPLE.value:
|
elif node_data.retrieval_mode == DatasetRetrieveConfigEntity.RetrieveStrategy.MULTIPLE.value:
|
||||||
all_documents = self._multiple_retrieve(available_datasets, node_data, query)
|
all_documents = self._multiple_retrieve(available_datasets, node_data, query)
|
||||||
|
|
||||||
document_score_list = {}
|
|
||||||
for item in all_documents:
|
|
||||||
if 'score' in item.metadata and item.metadata['score']:
|
|
||||||
document_score_list[item.metadata['doc_id']] = item.metadata['score']
|
|
||||||
|
|
||||||
document_context_list = []
|
|
||||||
index_node_ids = [document.metadata['doc_id'] for document in all_documents]
|
|
||||||
segments = DocumentSegment.query.filter(
|
|
||||||
DocumentSegment.dataset_id.in_(dataset_ids),
|
|
||||||
DocumentSegment.completed_at.isnot(None),
|
|
||||||
DocumentSegment.status == 'completed',
|
|
||||||
DocumentSegment.enabled == True,
|
|
||||||
DocumentSegment.index_node_id.in_(index_node_ids)
|
|
||||||
).all()
|
|
||||||
context_list = []
|
context_list = []
|
||||||
if segments:
|
if all_documents:
|
||||||
index_node_id_to_position = {id: position for position, id in enumerate(index_node_ids)}
|
document_score_list = {}
|
||||||
sorted_segments = sorted(segments,
|
for item in all_documents:
|
||||||
key=lambda segment: index_node_id_to_position.get(segment.index_node_id,
|
if 'score' in item.metadata and item.metadata['score']:
|
||||||
float('inf')))
|
document_score_list[item.metadata['doc_id']] = item.metadata['score']
|
||||||
for segment in sorted_segments:
|
|
||||||
if segment.answer:
|
|
||||||
document_context_list.append(f'question:{segment.content} answer:{segment.answer}')
|
|
||||||
else:
|
|
||||||
document_context_list.append(segment.content)
|
|
||||||
|
|
||||||
for segment in sorted_segments:
|
document_context_list = []
|
||||||
dataset = Dataset.query.filter_by(
|
index_node_ids = [document.metadata['doc_id'] for document in all_documents]
|
||||||
id=segment.dataset_id
|
segments = DocumentSegment.query.filter(
|
||||||
).first()
|
DocumentSegment.dataset_id.in_(dataset_ids),
|
||||||
document = Document.query.filter(Document.id == segment.document_id,
|
DocumentSegment.completed_at.isnot(None),
|
||||||
Document.enabled == True,
|
DocumentSegment.status == 'completed',
|
||||||
Document.archived == False,
|
DocumentSegment.enabled == True,
|
||||||
).first()
|
DocumentSegment.index_node_id.in_(index_node_ids)
|
||||||
resource_number = 1
|
).all()
|
||||||
if dataset and document:
|
if segments:
|
||||||
|
index_node_id_to_position = {id: position for position, id in enumerate(index_node_ids)}
|
||||||
source = {
|
sorted_segments = sorted(segments,
|
||||||
'metadata': {
|
key=lambda segment: index_node_id_to_position.get(segment.index_node_id,
|
||||||
'_source': 'knowledge',
|
float('inf')))
|
||||||
'position': resource_number,
|
for segment in sorted_segments:
|
||||||
'dataset_id': dataset.id,
|
|
||||||
'dataset_name': dataset.name,
|
|
||||||
'document_id': document.id,
|
|
||||||
'document_name': document.name,
|
|
||||||
'document_data_source_type': document.data_source_type,
|
|
||||||
'segment_id': segment.id,
|
|
||||||
'retriever_from': 'workflow',
|
|
||||||
'score': document_score_list.get(segment.index_node_id, None),
|
|
||||||
'segment_hit_count': segment.hit_count,
|
|
||||||
'segment_word_count': segment.word_count,
|
|
||||||
'segment_position': segment.position,
|
|
||||||
'segment_index_node_hash': segment.index_node_hash,
|
|
||||||
},
|
|
||||||
'title': document.name
|
|
||||||
}
|
|
||||||
if segment.answer:
|
if segment.answer:
|
||||||
source['content'] = f'question:{segment.content} \nanswer:{segment.answer}'
|
document_context_list.append(f'question:{segment.content} answer:{segment.answer}')
|
||||||
else:
|
else:
|
||||||
source['content'] = segment.content
|
document_context_list.append(segment.content)
|
||||||
context_list.append(source)
|
|
||||||
resource_number += 1
|
|
||||||
|
|
||||||
|
for segment in sorted_segments:
|
||||||
|
dataset = Dataset.query.filter_by(
|
||||||
|
id=segment.dataset_id
|
||||||
|
).first()
|
||||||
|
document = Document.query.filter(Document.id == segment.document_id,
|
||||||
|
Document.enabled == True,
|
||||||
|
Document.archived == False,
|
||||||
|
).first()
|
||||||
|
resource_number = 1
|
||||||
|
if dataset and document:
|
||||||
|
|
||||||
|
source = {
|
||||||
|
'metadata': {
|
||||||
|
'_source': 'knowledge',
|
||||||
|
'position': resource_number,
|
||||||
|
'dataset_id': dataset.id,
|
||||||
|
'dataset_name': dataset.name,
|
||||||
|
'document_id': document.id,
|
||||||
|
'document_name': document.name,
|
||||||
|
'document_data_source_type': document.data_source_type,
|
||||||
|
'segment_id': segment.id,
|
||||||
|
'retriever_from': 'workflow',
|
||||||
|
'score': document_score_list.get(segment.index_node_id, None),
|
||||||
|
'segment_hit_count': segment.hit_count,
|
||||||
|
'segment_word_count': segment.word_count,
|
||||||
|
'segment_position': segment.position,
|
||||||
|
'segment_index_node_hash': segment.index_node_hash,
|
||||||
|
},
|
||||||
|
'title': document.name
|
||||||
|
}
|
||||||
|
if segment.answer:
|
||||||
|
source['content'] = f'question:{segment.content} \nanswer:{segment.answer}'
|
||||||
|
else:
|
||||||
|
source['content'] = segment.content
|
||||||
|
context_list.append(source)
|
||||||
|
resource_number += 1
|
||||||
return context_list
|
return context_list
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -257,6 +257,7 @@ class KnowledgeRetrievalNode(BaseNode):
|
|||||||
top_k=top_k, score_threshold=score_threshold,
|
top_k=top_k, score_threshold=score_threshold,
|
||||||
reranking_model=reranking_model)
|
reranking_model=reranking_model)
|
||||||
return results
|
return results
|
||||||
|
return []
|
||||||
|
|
||||||
def _fetch_model_config(self, node_data: KnowledgeRetrievalNodeData) -> tuple[
|
def _fetch_model_config(self, node_data: KnowledgeRetrievalNodeData) -> tuple[
|
||||||
ModelInstance, ModelConfigWithCredentialsEntity]:
|
ModelInstance, ModelConfigWithCredentialsEntity]:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user