如何在API调用中提升LLM返回内容的稳定性
LLM 经常会不太可控,不按套路出牌,以判断评论是否正向为例。
直接输出
直接提问时,LLM 能给出正确的判断,但输出的内容难以结构化。

这时代码里只能用是否包含来判断正向还是负向:
emotion = 'n' if '负向' in response else 'p'
似乎没问 题?但要注意会有坑!
json 输出
似乎挺好,用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官网
文章版权归作者所有,未经允许请勿转载。


共有 0 条评论