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()
问题原因分析
核心原因是表单提交的文本存在换行符格式差异或隐藏编码问题:
- AJAX的
serialize()方法会将文本区域的换行符转换为\r\n(Windows格式),而LangChain拆分器基于Tokenizer处理时,对该格式的逻辑与纯\n(Unix格式)不兼容 - 文件读写过程会自动转换换行符为系统默认格式,同时完成文本编码标准化,间接解决了隐藏的编码问题
解决方案
方案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
相关产品推荐
相关产品推荐

