使用LangChain+Streamlit开发专辑推荐应用时响应截断问题
解决Langchain调用OpenAI长响应截断问题
针对你开发专辑推荐应用时遇到的长文本输出不完整问题,可从以下几个方向处理:
调整OpenAI模型的max_tokens参数
默认的max_tokens值可能偏小,导致模型输出被强制截断。初始化LLM时显式设置足够大的max_tokens,注意预留输入内容的token空间(需符合所选模型的总上下文限制,比如gpt-3.5-turbo总token上限为4096)。
代码示例:from langchain.llms import OpenAI llm = OpenAI( temperature=0.7, max_tokens=2000 # 根据需求调整,确保输出有足够空间 )启用流式输出
流式输出可逐段获取模型响应,既避免截断,也能提升用户等待体验。使用支持流式的ChatOpenAI,并在Streamlit中用st.write_stream处理输出。
代码示例:from langchain.chat_models import ChatOpenAI from langchain.schema import HumanMessage chat_llm = ChatOpenAI( temperature=0.7, max_tokens=2000, streaming=True ) def stream_recommendation(prompt): messages = [HumanMessage(content=prompt)] response_stream = chat_llm.stream(messages) st.write_stream(response_stream) # 调用示例 stream_recommendation("为以下艺人推荐入门专辑:XXX, XXX, Jay-Z")拆分多艺人请求
当输入艺人数量过多时,Prompt占用的token会挤压输出空间,导致最后一个艺人的推荐被截断。可将请求拆分为单个艺人的独立任务,再合并结果。
代码示例:artists = ["艺人A", "艺人B", "Jay-Z"] all_recommendations = [] for artist in artists: prompt = f"为不熟悉{artist}的听众推荐入门专辑,并详细说明推荐理由" rec = llm(prompt) all_recommendations.append(f"### {artist}\n{rec}") # 在Streamlit展示合并结果 st.markdown("\n\n".join(all_recommendations))检查并控制总token用量
用Langchain的回调工具计算输入和输出的token数,确保总token数不超过模型的上下文窗口限制。如果总用量接近上限,需进一步拆分请求或精简Prompt内容。
代码示例:from langchain.llms import OpenAI from langchain.callbacks import get_openai_callback llm = OpenAI(temperature=0.7) test_prompt = "你的多艺人推荐Prompt内容" with get_openai_callback() as cb: llm(test_prompt) print(f"输入token数: {cb.prompt_tokens}") print(f"输出token数: {cb.completion_tokens}") print(f"总token数: {cb.total_tokens}")优化Chain配置
若使用LLMChain,检查Prompt模板是否有不必要的冗余内容,避免占用额外token。也可改用SequentialChain将多艺人推荐拆分为多个步骤,分步生成每个艺人的内容,降低单请求的token压力。
内容的提问来源于stack exchange,提问作者r1ckhdk
相关产品推荐
相关产品推荐

