如何在API调用中提升LLM返回内容的稳定性

LLM 经常会不太可控,不按套路出牌,以判断评论是否正向为例。

直接输出

直接提问时,LLM 能给出正确的判断,但输出的内容难以结构化。

如何在API调用中提升LLM返回内容的稳定性-2

这时代码里只能用是否包含来判断正向还是负向:

emotion = 'n' if '负向' in response else 'p'

似乎没问 题?但要注意会有坑!

如何在API调用中提升LLM返回内容的稳定性-3

json 输出

如何在API调用中提升LLM返回内容的稳定性-4

似乎挺好,用json 解 析一下即可:

res = json.loads(response)

LLM 输出多余字符

```json{ "emotion": "n"}```

这时就需要处理了,比如字符串匹配和处理,代码略。

list 的json 格式

但json 除了dict 格式,还可能是dict 格式的,我写了个解析代码:

def extract_json(text: str): # 查找 '{' 和 '[' 的位置 start_brace = text.find('{') start_bracket = text.find('[') # 确定 JSON 的起始字符 if start_brace == -1 and start_bracket == -1: return None # 没有找到 JSON elif start_brace == -1 or (start_bracket != -1 and start_bracket < start_brace): start_char, end_char = '[', ']' start = start_bracket else: start_char, end_char = '{', '}' start = start_brace # 查找 JSON 的结束位置 end = text.rfind(end_char) if end == -1: return None # 没有找到 JSON # 提取 JSON 字符串 json_str = text[start:end + 1] # 尝试解析 JSON try: return json.loads(json_str) except json.JSONDecodeError: return None # JSON 格式不正确

可以同时支持list 和dict 的json 格式

LLM 请求头控制

但即使这样,有时LLM 也会不听话,会返回非json 的格式,如引号不闭合之类的问题。OpenAI 率先支持了json 格式的响应,其他模型如 claude 也跟上了。以oai 为例,可以在请求头中加上json 返回的参数:

response_format={ "type": "json_object"}

我的使用经验里,添加此请求头后就极少碰到不符合json 格式的了

返回结构的处理

虽然极少,但偶尔还会有,比如响应一:

{ "summary": "中国已明确实施"以铝节铜"战略,但铝合金电缆完全取代铜缆是一个渐进过程。"}

或者响应二:

{  "summary": "中国已明确实施“以铝节铜”战略,但铝合金电缆完全取代铜缆是一个渐进过程。铝合金电缆已在北美使用超过50年,占据市场主导地位,并被证实是安全的。"}

响应一存在的问题是引号没做json escape,一行中有多个" 不符合json 格式;响应二存在的问题是换行没做json escape,也不符合json 格式。还会有其他情况,如" 用' 的,符合某些语言如python 或js 的字符串使用,但不符合json 的 " 用法。

可以用一些相关的json 修复的库来做修复,或者直接retry.

Retry

以python 为例,retry 时可以使用tenacity 来控制,如:

@retry(wait=wait_fixed(0), stop=stop_after_attempt(2))def openai_request(prompt: str): pass

prompt 调整

版权声明:
作者:clash
链接:https://www.shadowrocket6.top/270.html
来源:Shadowrocket官网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>