-
Notifications
You must be signed in to change notification settings - Fork 18
Open
Description
The error shows up as this:
ERROR:root:Failed to get candidate conclusions: string indices must be integers, not 'str'
This happens when the LLM doesn't return strictly a json object and instead a string with text and the json object (as some open source LLMs do with the default prompts). A quick fix I found for this was in the get_initial_conclusion function, adding in something like this to capture things that look like json objects:
# Regex to find JSON array enclosed in []
json_match = re.search(r'\[\s*{.*}\s*\]', response, re.DOTALL)
if json_match:
json_str = json_match.group()
try:
response = json.loads(json_str)
except json.JSONDecodeError as e:
print("Failed to parse JSON:", e)
else:
print("No JSON array found in text")
The final function would look something like this:
def get_initial_conclusion(
args,
model,
content_identifier,
prompt_input,
):
"""
This function retrieves initial conclusions from the provided document section
based on the specified model and language.
Args:
model: The model used for processing the content.
section: The section of the document to be processed.
Returns:
A list of validated conclusions, each containing the conclusion text,
its relationship (R), and the content identifier.
"""
if args.modal == "single":
developer_prompt = atomic_prompt_templates["get_initial_conclusion_for_default_prompt"]
prompt = f"""
The document content to be processed is as follows: {prompt_input}
"""
elif args.modal == "multi":
current_description = prompt_input['description']
current_analysis = prompt_input['analysis']
developer_prompt = atomic_prompt_templates["get_initial_conclusion_for_image_prompt"]
prompt = f"""
The following is the description of the image with the caption "{current_description}" in the article titled "{content_identifier}":
{current_analysis}
"""
response = run_llm_prompt(model, prompt, developer_prompt, return_json=True)
# Regex to find JSON array enclosed in []
json_match = re.search(r'\[\s*{.*}\s*\]', response, re.DOTALL)
if json_match:
json_str = json_match.group()
try:
response = json.loads(json_str)
except json.JSONDecodeError as e:
print("Failed to parse JSON:", e)
else:
print("No JSON array found in text")
validated_conclusions = []
for item in response:
conclusion = item['conclusion']
R = item['R']
validated_conclusions.append({
'conclusion': conclusion,
'R': R,
})
return validated_conclusions
Metadata
Metadata
Assignees
Labels
No labels