You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中LangChain文本拆分器无法拆分POST请求文本问题

Django中LangChain CharacterTextSplitter无法拆分表单提交文本的问题

问题现象

在Django项目中,使用LangChain的CharacterTextSplitter拆分表单提交的文本时,拆分结果长度始终为1,无法正常分割文本。已确认:

  • 接收到的input_text是str类型
  • 相同代码在Jupyter Notebook中可正常拆分文本
  • Django中直接使用input_text.split()能正常工作
  • 将文本写入文件再读取后,CharacterTextSplitter的拆分功能恢复正常

相关代码

后端Python代码

from transformers import AutoTokenizer
from langchain.text_splitter import CharacterTextSplitter

tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english")
text_splitter = CharacterTextSplitter.from_huggingface_tokenizer(
    tokenizer, chunk_size=256, chunk_overlap=0
)

def home(request):
    if request.method == 'POST':
        input_text = request.POST['input']  # 获取POST请求中的文本
        print("input_text", type(input_text))
        splitted_text = text_splitter.split_text(str(input_text))
        print("splitted_text_length_outside", len(splitted_text))

测试用简化函数:

def home(input_text):
    splitted_text = text_splitter.split_text(input_text)
    print("splitted_text_length_outside", len(splitted_text))

HTML表单代码

<form action="{% url 'home' %}" method="post" id="myForm">
{% csrf_token %}
<textarea name="input" id="input" rows="4" cols="50"></textarea>
<br>
<button type="submit">Submit</button>
</form>

AJAX提交代码

$("#myForm").submit(function(event) {
  event.preventDefault();

  let formData = $(this).serialize();

  $.ajax({
    "url": "/",            
    "type": "POST",       
    "data": formData,     
    "success": function(response) {
      console.log("success");
    },
    "error": function(error) {
      console.log("error", error);
    }
  });
});

临时有效方案(写入文件再读取)

with open('input_text.txt', 'w') as f:
   f.write(input_text)
with open('input_text.txt', 'r') as f:
   input_text = f.read()

问题原因分析

核心原因是表单提交的文本存在换行符格式差异或隐藏编码问题:

  1. AJAX的serialize()方法会将文本区域的换行符转换为\r\n(Windows格式),而LangChain拆分器基于Tokenizer处理时,对该格式的逻辑与纯\n(Unix格式)不兼容
  2. 文件读写过程会自动转换换行符为系统默认格式,同时完成文本编码标准化,间接解决了隐藏的编码问题

解决方案

方案1:统一换行符格式

获取文本后手动将\r\n转换为\n,清理多余空白:

def home(request):
    if request.method == 'POST':
        input_text = request.POST['input']
        # 统一换行符为Unix格式
        input_text = input_text.replace('\r\n', '\n').replace('\r', '\n').strip()
        splitted_text = text_splitter.split_text(input_text)
        print("splitted_text_length", len(splitted_text))

方案2:标准化文本编码

用unicodedata解决潜在Unicode格式问题:

import unicodedata

def home(request):
    if request.method == 'POST':
        input_text = request.POST['input']
        # 标准化Unicode文本
        input_text = unicodedata.normalize('NFC', input_text)
        splitted_text = text_splitter.split_text(input_text)
        print("splitted_text_length", len(splitted_text))

方案3:自定义拆分器分隔符

显式指定分隔符匹配表单提交的换行格式:

text_splitter = CharacterTextSplitter.from_huggingface_tokenizer(
    tokenizer, 
    chunk_size=256, 
    chunk_overlap=0,
    separator="\r\n"  # 匹配表单提交的换行符
)

内容的提问来源于stack exchange,提问作者Talha Anwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:53:13