Python3.8.3下用OpenAI开发AI遇'module'不可调用错误求修复
问题修复方案
核心错误修复
你遇到的TypeError: 'module' object is not callable是因为错误地将openai模块当作文件打开函数使用,同时文件路径为空字符串,这两个问题需要优先解决:
1. 替换错误的文件打开调用
将ReplyBrain函数里的:
FileLog = openai("","r")
改成使用Python内置的open()函数,并指定有效的聊天日志文件名,比如:
FileLog = open("chat_log.txt", "r")
同理,后续写入文件的代码里的空文件名也要替换:
FileLog = open("chat_log.txt", "w")
其他潜在问题修复
除了核心错误,代码里还有几个需要调整的地方,避免后续出现异常:
1. 修复API密钥文件路径
Windows系统中,路径里的反斜杠需要转义,或者使用原始字符串,否则\A会被当作转义字符处理:
# 方式1:转义反斜杠 fileopen = open("Data\\Api.txt","r") # 方式2:使用原始字符串 fileopen = open(r"Data\Api.txt","r")
2. 优化OpenAI调用方式
不需要提前实例化Completion对象,直接调用openai.Completion.create()即可,删除这行:
completion = openai.Completion()
然后将response = completion.create(改成:
response = openai.Completion.create(
3. 修复聊天日志更新逻辑
当前代码每次更新日志时都会基于原始模板,导致历史聊天记录丢失,应该基于当前的chat_log来更新:
# 替换原来的chat_log_template_update chat_log_update = chat_log + f"\nYou : {question} \nJarvis : {answer}" # 写入文件时使用更新后的chat_log_update FileLog = open("chat_log.txt", "w") FileLog.write(chat_log_update)
4. 处理聊天日志文件不存在的情况
如果首次运行时chat_log.txt不存在,打开文件会报错,需要添加异常处理或者初始化文件:
def ReplyBrain(question, chat_log=None): try: FileLog = open("chat_log.txt", "r") chat_log_template = FileLog.read() FileLog.close() except FileNotFoundError: # 如果文件不存在,初始化一个默认模板 chat_log_template = "Jarvis: 我是Jarvis,有什么可以帮你的?" if chat_log is None: chat_log = chat_log_template # 后续代码保持不变...
修复后的完整代码示例
# 修复API文件路径 fileopen = open(r"Data\Api.txt","r") API = fileopen.read() fileopen.close() import openai from dotenv import load_dotenv # 如果你用.env文件存储密钥,应该先load再设置,否则可以去掉load_dotenv() load_dotenv() openai.api_key = API def ReplyBrain(question, chat_log=None): # 处理聊天日志文件不存在的情况 try: FileLog = open("chat_log.txt", "r") chat_log_template = FileLog.read() FileLog.close() except FileNotFoundError: chat_log_template = "Jarvis: 我是Jarvis,有什么可以帮你的?" if chat_log is None: chat_log = chat_log_template prompt = f'{chat_log}\nYou : {question}\nJarvis : ' response = openai.Completion.create( model = "text-davinci-002", prompt = prompt, temperature = 0.5, max_tokens = 60, top_p = 0.3, frequency_penalty = 0.5, presence_penalty = 0 ) answer = response.choices[0].text.strip() # 基于当前聊天记录更新日志 chat_log_update = chat_log + f"\nYou : {question} \nJarvis : {answer}" FileLog = open("chat_log.txt", "w") FileLog.write(chat_log_update) FileLog.close() return answer while True: kk = input("Enter :") result = ReplyBrain(kk) print(result)
内容的提问来源于stack exchange,提问作者Aryav Verma
相关产品推荐
相关产品推荐

