RASA与GPT-3集成无正确响应,请求协助排查代码问题
Rasa与GPT-3集成无正确响应问题排查
问题概述
尝试将Rasa与GPT-3集成后无法获得正确响应,以下是相关代码及问题分析:
GPT-3调用函数代码
def gpt3(text): response = openai.Completion.create( model="code-cushman-001", # engine="ada", prompt="\n\n" + text, temperature=0, logprobs=10, max_tokens=150, top_p=0, frequency_penalty=0, presence_penalty=0, stop=["\n\n"] ) return response['choices'][0]['text']
action.py代码
class ActionDefaultFallback(Action): def init(self): # self.gpt3 = gpt3() super()._init_() def name(self) -> Text: return "action_default_fallback" async def run(self, dispatcher, tracker, domain): query = tracker.latest_message['text'] dispatcher.utter_message(text=gpt3(query)) return [UserUtteranceReverted()]
问题分析
- 模型选择错误:
code-cushman-001是代码专用生成模型,不适合处理自然语言对话场景,会导致回复不符合预期。 - 语法错误:类初始化方法
init和super()._init_()都缺少双下划线,正确写法应为__init__,这会导致类初始化失败。 - 同步/异步冲突:
gpt3是同步函数,但Rasa的run方法是异步的,同步调用会阻塞Rasa的事件循环,可能导致响应延迟或无响应。 - Prompt格式问题:prompt开头的多余空行和stop序列中的空行可能导致GPT-3提前截断回复或生成无效内容;
temperature=0和top_p=0会让回复过于生硬,缺乏自然性。 - 无异常处理:未捕获OpenAI API调用可能出现的异常(如密钥错误、网络问题),会直接导致Rasa动作崩溃。
修复方案
修正GPT-3调用函数
import openai import asyncio from concurrent.futures import ThreadPoolExecutor # 替换为你的OpenAI API密钥 openai.api_key = "your-api-key" # 创建线程池用于同步函数异步执行 executor = ThreadPoolExecutor() def gpt3_sync(text): try: response = openai.Completion.create( model="text-davinci-003", # 更换为自然语言对话模型 prompt=text, # 移除多余空行 temperature=0.7, # 调整温度提升回复自然度 max_tokens=150, top_p=1.0, frequency_penalty=0, presence_penalty=0 ) # 去除回复前后的空白字符 return response['choices'][0]['text'].strip() except Exception as e: return f"对话服务暂时不可用: {str(e)}" # 异步包装函数,适配Rasa的异步环境 async def gpt3(text): loop = asyncio.get_event_loop() return await loop.run_in_executor(executor, gpt3_sync, text)
修正action.py代码
from rasa_sdk import Action, Tracker from rasa_sdk.executor import CollectingDispatcher from rasa_sdk.events import UserUtteranceReverted from typing import Text, Dict, Any, List class ActionDefaultFallback(Action): def __init__(self): # 修正双下划线 super().__init__() # 修正双下划线 def name(self) -> Text: return "action_default_fallback" async def run( self, dispatcher: CollectingDispatcher, tracker: Tracker, domain: Dict[Text, Any] ) -> List[Dict[Text, Any]]: query = tracker.latest_message['text'] # 异步调用GPT-3 gpt_response = await gpt3(query) dispatcher.utter_message(text=gpt_response) return [UserUtteranceReverted()]
关键修复点说明
- 更换为适合自然语言对话的GPT-3模型(如
text-davinci-003) - 修正类初始化方法的语法错误
- 将同步GPT-3调用包装为异步,避免阻塞Rasa事件循环
- 调整prompt格式和生成参数,提升回复自然度
- 添加异常捕获,保证动作稳定性
内容的提问来源于stack exchange,提问作者subhajit saha
相关产品推荐
相关产品推荐

