OpenAI Completion API中conversation_memory参数未被识别的问题排查
问题
调用OpenAI Completion API时添加conversation_memory参数,触发InvalidRequestError: Unrecognized request argument supplied: conversation_memory错误,代码及报错栈如下:
调用代码
import openai # Set the API key openai.api_key = "YOUR API KEY" # Define the conversation memory conversation_memory = { "previous_question": "What is the capital of France?", "previous_answer": "The capital of France is Paris." } # Make the API request response = openai.Completion.create( model="text-davinci-003", prompt="Where is the Eiffel Tower located?", temperature=0.5, max_tokens=1024, top_p=1, frequency_penalty=0, presence_penalty=0, conversation_memory=conversation_memory ) # Print the response print(response.text)
报错栈
InvalidRequestError Traceback (most recent call last) <ipython-input-17-ace11d6ce405> in <module> 11 12 # Make the API request ---> 13 response = openai.Completion.create( 14 model="text-babbage-001", 15 prompt="Where is the Eiffel Tower located?", C:\ProgramData\Anaconda3\lib\site-packages\openai\api_resources\completion.py in create(cls, *args, **kwargs) 23 while True: 24 try: ---> 25 return super().create(*args, **kwargs) 26 except TryAgain as e: 27 if timeout is not None and time.time() > start + timeout: C:\ProgramData\Anaconda3\lib\site-packages\openai\api_resources\abstract\engine_api_resource.py in create(cls, api_key, api_base, api_type, request_id, api_version, organization, **params) 113 ) 114 url = cls.class_url(engine, api_type, api_version) --> 115 response, _, api_key = requestor.request( 116 "post", 117 url, C:\ProgramData\Anaconda3\lib\site-packages\openai\api_requestor.py in request(self, method, url, params, headers, files, stream, request_id, request_timeout) 179 request_timeout=request_timeout, 180 ) --> 181 resp, got_stream = self._interpret_response(result, stream) 182 return resp, got_stream, self.api_key 183 C:\ProgramData\Anaconda3\lib\site-packages\openai\api_requestor.py in _interpret_response(self, result, stream) 394 else: 395 return ( --> 396 self._interpret_response_line( 397 result.content, result.status_code, result.headers, stream=False 398 ), C:\ProgramData\Anaconda3\lib\site-packages\openai\api_requestor.py in _interpret_response_line(self, rbody, rcode, rheaders, stream) 427 stream_error = stream and "error" in resp.data 428 if stream_error or not 200 <= rcode < 300: --> 429 raise self.handle_error_response( 430 rbody, rcode, resp.data, rheaders, stream_error=stream_error 431 ) InvalidRequestError: Unrecognized request argument supplied: conversation_memory
原因分析
OpenAI的Completion API(包括所有text-davinci、text-babbage等模型)根本不支持conversation_memory参数,该API的设计逻辑是基于单个prompt文本进行补全,没有内置的对话记忆机制。你添加的这个参数不在官方文档定义的合法参数列表里,所以会被API拒绝。
解决方法
方法1:手动将对话历史拼接到Completion的prompt中
如果坚持使用Completion API,需要把之前的对话内容整合到prompt里,让模型感知上下文:
import openai openai.api_key = "YOUR API KEY" # 拼接对话历史到prompt conversation_history = """Q: What is the capital of France? A: The capital of France is Paris. Q: Where is the Eiffel Tower located? A:""" response = openai.Completion.create( model="text-davinci-003", prompt=conversation_history, temperature=0.5, max_tokens=1024, top_p=1, frequency_penalty=0, presence_penalty=0 ) # 提取并打印结果 print(response.choices[0].text.strip())
方法2:改用ChatCompletion API(推荐)
如果需要完整的对话记忆功能,推荐使用OpenAI的ChatCompletion API(支持gpt-3.5-turbo、gpt-4等模型),该API通过messages参数天然支持对话历史:
import openai openai.api_key = "YOUR API KEY" # 对话历史以消息数组形式存储 conversation_messages = [ {"role": "user", "content": "What is the capital of France?"}, {"role": "assistant", "content": "The capital of France is Paris."}, {"role": "user", "content": "Where is the Eiffel Tower located?"} ] response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=conversation_messages, temperature=0.5 ) # 提取并打印回复 print(response.choices[0].message["content"].strip())
内容的提问来源于stack exchange,提问作者Richard Twitty
相关产品推荐
相关产品推荐

