将上下文分片后,可以基于每一片进行上下文回答,然后将各段回答总结汇总;或先将第一片段作为上下文,然后进行回答,并将回答与下一部分结合。
1.导包
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_openai import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
2.加载文档
loader = TextLoader("./demo.txt",encoding='utf8')
docs = loader.load()
3.文本分割器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=40,
separators=["\n", "。", "!", "?", ",", "、", ""]
)
4.文本分割
texts = text_splitter.split_documents(docs)
5.文本编码器
embeddings_model = OpenAIEmbeddings(base_url="https://api.chatanywhere.tech/v1")
6.引入检索库
db = FAISS.from_documents(texts, embeddings_model)
7.检索器
retriever = db.as_retriever()
8.加载模型
model = ChatOpenAI(model="gpt-3.5-turbo",base_url="https://api.chatanywhere.tech/v1")
9.添加记忆并执行
memory = ConversationBufferMemory(return_messages=True,
memory_key='chat_history',
output_key='answer')
qa = ConversationalRetrievalChain.from_llm(
llm=model,
retriever=retriever,
memory=memory,
chain_type="map_reduce"
)
qa.invoke({"chat_history": memory, "question": "卢浮宫这个名字怎么来的?"})
输出:
{‘chat_history’: [HumanMessage(content=‘卢浮宫这个名字怎么来的?’),
AIMessage(content=‘卢浮宫这个名字来源于建筑最初是由法国国王菲利普二世在12世纪建造的一座城堡,称为卢浮堡(Louvre)。’)],
‘question’: ‘卢浮宫这个名字怎么来的?’,
‘answer’: ‘卢浮宫这个名字来源于建筑最初是由法国国王菲利普二世在12世纪建造的一座城堡,称为卢浮堡(Louvre)。’}
10.添加记忆并执行
memory = ConversationBufferMemory(return_messages=True,
memory_key='chat_history',
output_key='answer')
qa = ConversationalRetrievalChain.from_llm(
llm=model,
retriever=retriever,
memory=memory,
chain_type="refine"
)
qa.invoke({"chat_history": memory, "question": "卢浮宫这个名字怎么来的?"})
输出:
{‘chat_history’: [HumanMessage(content=‘卢浮宫这个名字怎么来的?’),
AIMessage(content=‘卢浮宫这个名字源自于法语中"loup"(意为狼)这个词,据说在建造卢浮宫的地方曾经有一群狼居住。因此,这座宫殿被称为卢浮宫。自1980年代末和1990年代的大改建之后,卢浮宫的入口数量减少,如今游客可以通过拿破仑广场金字塔底下的地下通道进入博物馆参观。罗浮宫在历史上曾有不同的开放时间安排,如专门对艺术家和外国游客开放的时期,以及只在特定日期向公众开放的时期。而目前,卢浮宫除了周二公休和特殊假日外,通常对公众全面开放,内部允许使用照相机和录像机,但禁止使用闪光灯。’)],
‘question’: ‘卢浮宫这个名字怎么来的?’,
‘answer’: ‘卢浮宫这个名字源自于法语中"loup"(意为狼)这个词,据说在建造卢浮宫的地方曾经有一群狼居住。因此,这座宫殿被称为卢浮宫。自1980年代末和1990年代的大改建之后,卢浮宫的入口数量减少,如今游客可以通过拿破仑广场金字塔底下的地下通道进入博物馆参观。罗浮宫在历史上曾有不同的开放时间安排,如专门对艺术家和外国游客开放的时期,以及只在特定日期向公众开放的时期。而目前,卢浮宫除了周二公休和特殊假日外,通常对公众全面开放,内部允许使用照相机和录像机,但禁止使用闪光灯。’}
11.添加记忆并执行
memory = ConversationBufferMemory(return_messages=True,
memory_key='chat_history',
output_key='answer')
qa = ConversationalRetrievalChain.from_llm(
llm=model,
retriever=retriever,
memory=memory,
chain_type="map_rerank"
)
qa.invoke({"chat_history": memory, "question": "卢浮宫这个名字怎么来的?"})
输出:
{‘chat_history’: [HumanMessage(content=‘卢浮宫这个名字怎么来的?’),
AIMessage(content=‘卢浮宫这个名字来源于法语Musée du Louvre,是由法国巴黎市中心的塞纳河边的这座建筑物得名。它原本是建于12世纪末至13世纪初的王宫,后来转变为一所综合博物馆,是世界上最大的艺术博物馆之一,也是参观人数最多的博物馆之一,成为巴黎中心最知名的地标。’)],
‘question’: ‘卢浮宫这个名字怎么来的?’,
‘answer’: ‘卢浮宫这个名字来源于法语Musée du Louvre,是由法国巴黎市中心的塞纳河边的这座建筑物得名。它原本是建于12世纪末至13世纪初的王宫,后来转变为一所综合博物馆,是世界上最大的艺术博物馆之一,也是参观人数最多的博物馆之一,成为巴黎中心最知名的地标。’}