splitter.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. from langchain_text_splitters import RecursiveCharacterTextSplitter
  2. from langchain_experimental.text_splitter import SemanticChunker
  3. from langchain_community.embeddings import DashScopeEmbeddings
  4. from agent.config import load_config
  5. def recursive_split(documents:list, chunk_size:int=500, chunk_overlap:int=100) -> list:
  6. """
  7. 使用递归字符分割器将文本分割为较小的块。
  8. 参数:
  9. documents (list): 要分割的文档列表。
  10. chunk_size (int): 每个块的最大字符数。
  11. chunk_overlap (int): 块之间的重叠字符数。
  12. """
  13. text_splitter = RecursiveCharacterTextSplitter(
  14. separators=["\n\n", "\n", "。", "!", "?", ".", " ",""],
  15. chunk_size=chunk_size,
  16. chunk_overlap=chunk_overlap,
  17. length_function=len,
  18. )
  19. chunks = text_splitter.split_documents(documents)
  20. return chunks
  21. def embedding_split(text:str) -> list:
  22. """
  23. 使用 Embedding 模型计算相邻句⼦的语义相似度,当相似度「断崖式下降」时,就在那⾥切⼀⼑
  24. """
  25. config=load_config()
  26. # 使⽤通义的 Embedding 模型做语义分块
  27. emmbedding_model=DashScopeEmbeddings(
  28. model="text-embedding-v4",
  29. dashscope_api_key=config.api_key,
  30. )
  31. # 创建语义分块器
  32. semantic_splitter=SemanticChunker(
  33. emmbedding_model=emmbedding_model,
  34. breakpoint_threshold_type="percentile",
  35. breakpoint_threshold_amount=85
  36. )
  37. #分块
  38. chunks=semantic_splitter.split_text(text)
  39. return chunks