splitter.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738
  1. """文本分块策略。"""
  2. from langchain_community.embeddings import DashScopeEmbeddings
  3. from langchain_core.documents import Document
  4. from langchain_experimental.text_splitter import SemanticChunker
  5. from langchain_text_splitters import RecursiveCharacterTextSplitter
  6. from agent.config import load_config
  7. def recursive_split(
  8. documents: list[Document],
  9. chunk_size: int = 500,
  10. chunk_overlap: int = 100,
  11. ) -> list[Document]:
  12. """使用适合中文文本的递归字符分块。"""
  13. splitter = RecursiveCharacterTextSplitter(
  14. separators=["\n\n", "\n", "。", "!", "?", ".", " ", ""],
  15. chunk_size=chunk_size,
  16. chunk_overlap=chunk_overlap,
  17. length_function=len,
  18. )
  19. return splitter.split_documents(documents)
  20. def semantic_split(text: str) -> list[str]:
  21. """使用 Embedding 的语义断点进行分块。"""
  22. config = load_config()
  23. embedding_model = DashScopeEmbeddings(
  24. model="text-embedding-v4",
  25. dashscope_api_key=config.api_key,
  26. )
  27. splitter = SemanticChunker(
  28. embeddings=embedding_model,
  29. breakpoint_threshold_type="percentile",
  30. breakpoint_threshold_amount=85,
  31. )
  32. return splitter.split_text(text)