如何避免在CMD中分段发送问题导致大模型多段回复的问题?
环境:
Ubuntu20.04
ollama 0.6.4
问题描述:
如何避免在CMD中分段发送问题导致大模型多段回复的问题?
下面这段怎么作为一个整体问题发你大模型,在cmd里面会变成一小段小段问题发送,导致大模型回复好多段。
请基于以下考生信息和意向信息,直接生成一份JSON格式的志愿推荐表。[{"志愿序号": "志愿1",},{"志愿序号": "志愿2","概率": "33%",},]
在 Windows cmd 里直接粘贴这段较长且带有换行和特殊符号的文本时,命令行会把它拆成多段,导致发送给大模型时分成多条请求,进而回复也变成多段。这个问题其实是命令行环境和程序读取输入方式导致的。
造成原因
- Windows cmd 默认逐行读取输入,回车就提交一条输入,导致长文本分成多次发送。
- 有些程序按行读取
stdin
,遇到回车即结束本次读取。 - 直接粘贴多行文本,实际是多次回车输入,程序每次处理一行,导致多条分割问题。
解决方案:
1. 使用文件输入,避免交互式粘贴
- 把您的长文本内容保存为一个
.txt
文件,比如input.txt
。 - 在 Java 或 Python 程序中,读取整个文件内容,一次性发送给模型,保证是一个整体字符串。
- 这样就避免了命令行粘贴时自动拆分。
示例(Python):
with open("input.txt", "r", encoding="utf-8") as f:user_input = f.read()
reply = send_message(user_input)
print(reply)
示例(Java):
import java.nio.file.Files;
import java.nio.file.Paths;
String userInput = new String(Files.readAllBytes(Paths.get("input.txt")), StandardCharsets.UTF_8);
String reply = sendMessage(userInput);
System.out.println(reply);
2. 使用多行输入标识符(Python示例,Java需额外处理)
在 Python 交互环境或脚本中,可以使用三引号 """
包裹多行字符串:
user_input = """请基于以下考生信息和意向信息,直接生成一份JSON格式的高考志愿推荐表,包含4条志愿。
(这里是您的长文本内容,保持格式和换行)"""
reply = send_message(user_input)
print(reply)
Java 17+ 支持文本块(Text Blocks)来定义多行字符串:
String userInput = """
请基于以下考生信息和意向信息,直接生成一份JSON格式的高考志愿推荐表,包含4条志愿。
(这里是您的长文本内容,保持格式和换行)
""";
String reply = sendMessage(userInput);
System.out.println(reply);
3. 修改程序接口,支持一次性输入多行文本
如果您是自己写的命令行交互程序,可以设计一个“结束符”,让用户多行输入,直到输入特定字符串(如 END
)结束,再统一拼接发送。例如:
print("请输入问题,输入单独一行END结束:")
lines = []
while True:line = input()if line.strip() == "END":breaklines.append(line)
user_input = "\n".join(lines)
reply = send_message(user_input)
print(reply)
总结
- 不要直接在 Windows cmd 粘贴带换行的长文本当单条输入,因为它会按行拆分。
- 推荐把长文本放文件,一次性读入程序变量,再调用接口。
- 如果必须交互输入,设计多行输入结束符方案。
- 利用现代语言多行字符串支持(Python三引号,Java文本块)方便代码内写长文本。
本案例具体实现:
python脚本
import requests
import jsonOLLAMA_URL = "http://192.168.28.13:11434/v1/chat/completions"def send_message(user_input):messages = [{"role": "system","content": ("【角色设定】\n""你的身份是一名资深的方案生成专家,精准提供专业方案生成\n\n")},{"role": "user","content": user_input}]payload = {"model": "qwen2.5-7b:latest","messages": messages,"max_tokens": 8192,"temperature": 0.5,"stream": False # 关闭流式}try:print(f"发送请求: {json.dumps(payload, ensure_ascii=False)}")response = requests.post(OLLAMA_URL, json=payload, timeout=30) # 去掉stream=Trueprint(f"状态码: {response.status_code}")if response.status_code != 200:print(f"错误响应: {response.text}")return "服务端返回错误,请检查日志。"result = response.json()choices = result.get("choices", [])if not choices:return "无回复内容"content = choices[0].get("message", {}).get("content", "")return contentexcept requests.exceptions.Timeout:print("请求超时,请重试。")return "请求超时,请重试。"except requests.exceptions.RequestException as e:print(f"请求失败: {str(e)}")return "请求失败,请检查网络连接或服务状态。"except Exception as e:print(f"内部错误: {str(e)}")return "内部错误,请联系管理员。"def collect_multiline_input():print("请输入您的问题(支持多行输入,输入单独一行END结束):")lines = []while True:line = input()if line.strip() == "END":breaklines.append(line)return "\n".join(lines)if __name__ == "__main__":print("欢迎使用简单聊天应用!")print("您可以输入问题,我会尽力回答。输入“退出”或“exit”结束对话。")while True:user_input = collect_multiline_input()if user_input.lower() in ["退出", "exit", "quit"]:print("聊天结束。感谢使用!")breakreply = send_message(user_input)print("AI: ", reply)
修改点说明
payload 中 "stream": False 保持不变,表示请求非流式返回。
requests.post 调用时去掉 stream=True,默认就是非流式。
支持多行输入:新增 collect_multiline_input() 函数,支持用户在命令行中逐行输入内容,直到输入 END 结束。
将所有输入行拼接成一个字符串,作为完整问题发送。
简化响应处理:使用 response.json() 直接获取完整响应数据。
解析 JSON,提取 choices[0].message.content,返回完整回复。
使用方法
运行程序后,粘贴您的问题内容(多行)。
在最后一行输入 END,表示输入结束。
程序会将所有内容作为一个整体发送给大模型,返回完整回复。