fix: increase ontology generation output budget and harden JSON parsing

This commit is contained in:
yoshhdz 2026-04-13 20:00:15 -07:00
parent 1536a79334
commit 5d30c49c79
3 changed files with 27 additions and 10 deletions

View File

@ -197,7 +197,7 @@ class OntologyGenerator:
result = self.llm_client.chat_json( result = self.llm_client.chat_json(
messages=messages, messages=messages,
temperature=0.3, temperature=0.3,
max_tokens=4096 max_tokens=32768
) )
# 验证和后处理 # 验证和后处理

View File

@ -54,9 +54,9 @@ class LLMClient:
kwargs = { kwargs = {
"model": self.model, "model": self.model,
"messages": messages, "messages": messages,
"temperature": temperature, "max_completion_tokens": max_tokens,
"max_tokens": max_tokens,
} }
kwargs["temperature"] = temperature
if response_format: if response_format:
kwargs["response_format"] = response_format kwargs["response_format"] = response_format
@ -71,7 +71,7 @@ class LLMClient:
self, self,
messages: List[Dict[str, str]], messages: List[Dict[str, str]],
temperature: float = 0.3, temperature: float = 0.3,
max_tokens: int = 4096 max_tokens: int = 16384
) -> Dict[str, Any]: ) -> Dict[str, Any]:
""" """
发送聊天请求并返回JSON 发送聊天请求并返回JSON
@ -88,7 +88,6 @@ class LLMClient:
messages=messages, messages=messages,
temperature=temperature, temperature=temperature,
max_tokens=max_tokens, max_tokens=max_tokens,
response_format={"type": "json_object"}
) )
# 清理markdown代码块标记 # 清理markdown代码块标记
cleaned_response = response.strip() cleaned_response = response.strip()
@ -99,5 +98,27 @@ class LLMClient:
try: try:
return json.loads(cleaned_response) return json.loads(cleaned_response)
except json.JSONDecodeError: except json.JSONDecodeError:
raise ValueError(f"LLM返回的JSON格式无效: {cleaned_response}") # Aggressive JSON repair for truncated responses
repaired = cleaned_response
# Try progressively trimming from the end until valid JSON
for trim in range(min(len(repaired), 2000)):
candidate = repaired[:len(repaired) - trim].rstrip(', \n\t\r')
# Remove incomplete string at end
if candidate and candidate[-1] not in ']}}"':
continue
open_braces = candidate.count('{') - candidate.count('}')
open_brackets = candidate.count('[') - candidate.count(']')
fixed = candidate
for _ in range(open_brackets):
fixed += ']'
for _ in range(open_braces):
fixed += '}'
try:
result = json.loads(fixed)
import logging
logging.getLogger(__name__).warning(f"JSON repaired by trimming {trim} chars")
return result
except json.JSONDecodeError:
continue
raise ValueError(f"LLM返回的JSON格式无效: {cleaned_response[:500]}")

View File

@ -1331,7 +1331,6 @@
"resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
"integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
"license": "ISC", "license": "ISC",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
} }
@ -1809,7 +1808,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
}, },
@ -1943,7 +1941,6 @@
"integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"esbuild": "^0.25.0", "esbuild": "^0.25.0",
"fdir": "^6.5.0", "fdir": "^6.5.0",
@ -2018,7 +2015,6 @@
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz",
"integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.5.25", "@vue/compiler-dom": "3.5.25",
"@vue/compiler-sfc": "3.5.25", "@vue/compiler-sfc": "3.5.25",