当前位置:   article > 正文

langchain txt 文档加载,分割_model = tongyi(temperature=1)

model = tongyi(temperature=1)

stuff 策略

加载 arXiv 论文,让模型总结前 2000 字

这里采用的是 stuff 策略,也就是将一大段文本。按字数分割成 N 个文本块,又合并成一个大的文本块。

对超大规模不友好,没有区分文档重要性,适合文档量较少场景

  1. import os
  2. from dotenv import load_dotenv
  3. from langchain_community.llms import Tongyi
  4. load_dotenv('key.env') # 指定加载 env 文件
  5. key = os.getenv('DASHSCOPE_API_KEY') # 获得指定环境变量
  6. DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"] # 获得指定环境变量
  7. model = Tongyi(temperature=1)
  8. from langchain_core.prompts import PromptTemplate, format_document
  9. from langchain_core.output_parsers import StrOutputParser
  10. from langchain_community.document_loaders import ArxivLoader
  11. from langchain.text_splitter import RecursiveCharacterTextSplitter
  12. # 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
  13. loader = ArxivLoader(
  14. query="2210.03629",
  15. load_max_docs=1 # 加载第一个匹配的文档
  16. )
  17. docs = loader.load()
  18. print(docs[0].metadata)
  19. # 把文本分割成 500 字一组的切片
  20. text_splitter = RecursiveCharacterTextSplitter(
  21. chunk_size=500,
  22. chunk_overlap=0 # 要求文本没有重叠
  23. )
  24. chunks = text_splitter.split_documents(docs)
  25. # 构建 Stuff 形态(即文本直接拼合)的总结链
  26. doc_prompt = PromptTemplate.from_template("{page_content}")
  27. chain = (
  28. {
  29. "content": lambda docs: "\n\n".join(
  30. format_document(doc, doc_prompt) for doc in docs
  31. )
  32. }
  33. | PromptTemplate.from_template("用中文总结以下内容,不需要人物介绍,字数控制在 50 字以内:\n\n{content}")
  34. | model
  35. | StrOutputParser()
  36. )
  37. # 由于论文很长,我们只选取前 2000 字作为输入并调用总结链
  38. res = chain.invoke(chunks[:4])
  39. print(res)

MapReduce 策略

对每个文本块最一个回答,最后汇总到一起

但适合超大成千上万的文档量,因为是并行,map,reduce 需要不同提示词模版,多次调用问答模型,效率低

  1. import os
  2. from dotenv import load_dotenv
  3. from langchain_community.llms import Tongyi
  4. load_dotenv('key.env') # 指定加载 env 文件
  5. key = os.getenv('DASHSCOPE_API_KEY') # 获得指定环境变量
  6. DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"] # 获得指定环境变量
  7. model = Tongyi(temperature=1)
  8. from functools import partial
  9. from langchain_core.prompts import PromptTemplate, format_document
  10. from langchain_core.output_parsers import StrOutputParser
  11. from langchain_community.document_loaders import ArxivLoader
  12. from langchain.text_splitter import RecursiveCharacterTextSplitter
  13. # 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
  14. loader = ArxivLoader(query="2210.03629", load_max_docs=1)
  15. docs = loader.load()
  16. # 把文本分割成 500 字一组的切片
  17. text_splitter = RecursiveCharacterTextSplitter(
  18. chunk_size = 500,
  19. chunk_overlap = 50 # 允许文档重叠字数
  20. )
  21. chunks = text_splitter.split_documents(docs)
  22. # 构建工具函数:将 Document 转换成字符串
  23. document_prompt = PromptTemplate.from_template("{page_content}")
  24. partial_format_document = partial(format_document, prompt=document_prompt)
  25. # 构建 Map 链:对每个文档都先进行一轮总结
  26. map_chain = (
  27. {"context": partial_format_document}
  28. | PromptTemplate.from_template("Summarize this content:\n\n{context}")
  29. | model
  30. | StrOutputParser()
  31. )
  32. # 构建 Reduce 链:合并之前的所有总结内容
  33. reduce_chain = (
  34. {"context": lambda strs: "\n\n".join(strs)}
  35. | PromptTemplate.from_template("Combine these summaries:\n\n{context}")
  36. | model
  37. | StrOutputParser()
  38. )
  39. # 把两个链合并成 MapReduce 链
  40. map_reduce = map_chain.map() | reduce_chain
  41. res = map_reduce.invoke(chunks[:4], config={"max_concurrency": 5})
  42. print(res)

Refine 策略

也是多轮,但每一轮输入都只包含一个文档,以及之前轮次的中间回答

优势:

每次只需要针对一个文档生成回答,避免过长 context;回答是逐步推理和完善的,而不是一次性塞入所有信息;可以自定义每轮的提示词模版,实现更精细的控制

劣势:

文档顺序对结果又很大影响,需要智能排序;计算时间高

  1. import os
  2. from dotenv import load_dotenv
  3. from langchain_community.llms import Tongyi
  4. load_dotenv('key.env') # 指定加载 env 文件
  5. key = os.getenv('DASHSCOPE_API_KEY') # 获得指定环境变量
  6. DASHSCOPE_API_KEY = os.environ["DASHSCOPE_API_KEY"] # 获得指定环境变量
  7. llm = Tongyi(temperature=1)
  8. from functools import partial
  9. from operator import itemgetter
  10. from langchain_core.prompts import PromptTemplate, format_document
  11. from langchain_core.output_parsers import StrOutputParser
  12. from langchain_community.document_loaders import ArxivLoader
  13. from langchain.text_splitter import RecursiveCharacterTextSplitter
  14. # 加载 arXiv 上的论文《ReAct: Synergizing Reasoning and Acting in Language Models》
  15. loader = ArxivLoader(query="2210.03629", load_max_docs=1)
  16. docs = loader.load()
  17. # 把文本分割成 500 字一组的切片
  18. text_splitter = RecursiveCharacterTextSplitter(
  19. chunk_size=500,
  20. chunk_overlap=50
  21. )
  22. chunks = text_splitter.split_documents(docs)
  23. # 构建工具函数:将 Document 转换成字符串
  24. document_prompt = PromptTemplate.from_template("{page_content}")
  25. partial_format_document = partial(format_document, prompt=document_prompt)
  26. # 构建 Context 链:总结第一个文档并作为后续总结的上下文
  27. first_prompt = PromptTemplate.from_template("Summarize this content:\n\n{context}")
  28. context_chain = {"context": partial_format_document} | first_prompt | llm | StrOutputParser()
  29. # 构建 Refine 链:基于上下文(上一次的总结)和当前内容进一步总结
  30. refine_prompt = PromptTemplate.from_template(
  31. "Here's your first summary: {prev_response}. "
  32. "Now add to it based on the following context: {context}"
  33. )
  34. refine_chain = (
  35. {
  36. "prev_response": itemgetter("prev_response"),
  37. "context": lambda x: partial_format_document(x["doc"]),
  38. }
  39. | refine_prompt
  40. | llm
  41. | StrOutputParser()
  42. )
  43. # 构建一个负责执行 Refine 循环的函数
  44. def refine_loop(docs):
  45. summary = context_chain.invoke(docs[0])
  46. for i, doc in enumerate(docs[1:]):
  47. summary = refine_chain.invoke({"prev_response": summary, "doc": doc})
  48. return summary
  49. res = refine_loop(chunks[:4])
  50. print(res)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/853602
推荐阅读
相关标签
  

闽ICP备14008679号