[{"data":1,"prerenderedAt":1012},["ShallowReactive",2],{"note:\u002Frag\u002F04_langchain-文档处理与对话历史":3},{"id":4,"title":5,"body":6,"date":992,"description":993,"draft":994,"extension":995,"featured":994,"kind":996,"lastmod":992,"meta":997,"navigation":183,"path":1001,"planned":1002,"section":1003,"seo":1004,"source":1005,"stem":1006,"tags":1007,"toc":183,"weight":1010,"__hash__":1011},"notes\u002Frag\u002F04_LangChain-文档处理与对话历史.md","文档处理与对话历史",{"type":7,"value":8,"toc":966},"minimark",[9,16,21,123,133,137,142,159,163,214,218,255,259,291,295,299,302,305,319,322,336,340,402,406,451,460,464,468,471,474,496,500,552,556,626,639,643,647,650,652,664,668,720,724,780,783,787,794,866,870,959,962],[10,11,12],"blockquote",{},[13,14,15],"p",{},"一句话总结：Loader、Splitter、VectorStore 负责把外部文档变成可检索的向量记忆，History 负责保存和读取多轮对话，让模型回答具备“知识”和“上下文”。",[17,18,20],"h2",{"id":19},"一组件总览","一、组件总览",[22,23,24,40],"table",{},[25,26,27],"thead",{},[28,29,30,34,37],"tr",{},[31,32,33],"th",{},"组件",[31,35,36],{},"定位",[31,38,39],{},"常见实现",[41,42,43,69,85,107],"tbody",{},[28,44,45,49,57],{},[46,47,48],"td",{},"Loader",[46,50,51,52,56],{},"从各种数据源读取数据，转换为 ",[53,54,55],"code",{},"Document"," 对象",[46,58,59,62,63,62,66],{},[53,60,61],{},"PyPDFLoader","、",[53,64,65],{},"TextLoader",[53,67,68],{},"WebBaseLoader",[28,70,71,74,77],{},[46,72,73],{},"Splitter",[46,75,76],{},"将长文档切分成语义连贯的文本块",[46,78,79,62,82],{},[53,80,81],{},"RecursiveCharacterTextSplitter",[53,83,84],{},"TokenTextSplitter",[28,86,87,90,93],{},[46,88,89],{},"VectorStore",[46,91,92],{},"专门存储和检索向量的数据库",[46,94,95,62,98,62,101,62,104],{},[53,96,97],{},"Chroma",[53,99,100],{},"Pinecone",[53,102,103],{},"Milvus",[53,105,106],{},"FAISS",[28,108,109,112,115],{},[46,110,111],{},"History",[46,113,114],{},"存储和读取多轮对话消息列表",[46,116,117,62,120],{},[53,118,119],{},"InMemoryChatMessageHistory",[53,121,122],{},"RedisChatMessageHistory",[124,125,131],"pre",{"className":126,"code":128,"language":129,"meta":130},[127],"language-text","PDF \u002F TXT \u002F 网页\n    │ Loader\n    ▼\nDocument 对象\n    │ Splitter\n    ▼\n文本块 Chunk\n    │ Embedding\n    ▼\nVectorStore\n    │ 检索\n    ▼\n相似文本块 + History 历史消息 → 交给 Prompt\n","text","",[53,132,128],{"__ignoreMap":130},[17,134,136],{"id":135},"_1-loader文档加载器","1 Loader（文档加载器）",[138,139,141],"h3",{"id":140},"_11-定位","1.1 定位",[13,143,144,145,147,148,150,151,154,155,158],{},"Loader 从各种数据源读取数据，并统一转换为 ",[53,146,55],{}," 对象。每个 ",[53,149,55],{}," 包含 ",[53,152,153],{},"page_content"," 和 ",[53,156,157],{},"metadata"," 两部分。",[138,160,162],{"id":161},"_12-textloader-加载-txt","1.2 TextLoader 加载 TXT",[124,164,168],{"className":165,"code":166,"language":167,"meta":130,"style":130},"language-python shiki shiki-themes github-light github-dark","from langchain_community.document_loaders import TextLoader\n\nloader = TextLoader(\"data\u002F笔记.txt\", encoding=\"utf-8\")\ndocs = loader.load()\n\nprint(docs[0].page_content)  # 文本内容\nprint(docs[0].metadata)      # 来源、路径等元数据\n","python",[53,169,170,178,185,191,197,202,208],{"__ignoreMap":130},[171,172,175],"span",{"class":173,"line":174},"line",1,[171,176,177],{},"from langchain_community.document_loaders import TextLoader\n",[171,179,181],{"class":173,"line":180},2,[171,182,184],{"emptyLinePlaceholder":183},true,"\n",[171,186,188],{"class":173,"line":187},3,[171,189,190],{},"loader = TextLoader(\"data\u002F笔记.txt\", encoding=\"utf-8\")\n",[171,192,194],{"class":173,"line":193},4,[171,195,196],{},"docs = loader.load()\n",[171,198,200],{"class":173,"line":199},5,[171,201,184],{"emptyLinePlaceholder":183},[171,203,205],{"class":173,"line":204},6,[171,206,207],{},"print(docs[0].page_content)  # 文本内容\n",[171,209,211],{"class":173,"line":210},7,[171,212,213],{},"print(docs[0].metadata)      # 来源、路径等元数据\n",[138,215,217],{"id":216},"_13-pypdfloader-加载-pdf","1.3 PyPDFLoader 加载 PDF",[124,219,221],{"className":165,"code":220,"language":167,"meta":130,"style":130},"from langchain_community.document_loaders import PyPDFLoader\n\nloader = PyPDFLoader(\"data\u002F公司资料.pdf\")\ndocs = loader.load()\n\nprint(len(docs))              # PDF 页数\nprint(docs[0].page_content)   # 第一页内容\n",[53,222,223,228,232,237,241,245,250],{"__ignoreMap":130},[171,224,225],{"class":173,"line":174},[171,226,227],{},"from langchain_community.document_loaders import PyPDFLoader\n",[171,229,230],{"class":173,"line":180},[171,231,184],{"emptyLinePlaceholder":183},[171,233,234],{"class":173,"line":187},[171,235,236],{},"loader = PyPDFLoader(\"data\u002F公司资料.pdf\")\n",[171,238,239],{"class":173,"line":193},[171,240,196],{},[171,242,243],{"class":173,"line":199},[171,244,184],{"emptyLinePlaceholder":183},[171,246,247],{"class":173,"line":204},[171,248,249],{},"print(len(docs))              # PDF 页数\n",[171,251,252],{"class":173,"line":210},[171,253,254],{},"print(docs[0].page_content)   # 第一页内容\n",[138,256,258],{"id":257},"_14-webbaseloader-加载网页","1.4 WebBaseLoader 加载网页",[124,260,262],{"className":165,"code":261,"language":167,"meta":130,"style":130},"from langchain_community.document_loaders import WebBaseLoader\n\nloader = WebBaseLoader(\"https:\u002F\u002Fexample.com\u002Farticle\")\ndocs = loader.load()\n\nprint(docs[0].page_content)\n",[53,263,264,269,273,278,282,286],{"__ignoreMap":130},[171,265,266],{"class":173,"line":174},[171,267,268],{},"from langchain_community.document_loaders import WebBaseLoader\n",[171,270,271],{"class":173,"line":180},[171,272,184],{"emptyLinePlaceholder":183},[171,274,275],{"class":173,"line":187},[171,276,277],{},"loader = WebBaseLoader(\"https:\u002F\u002Fexample.com\u002Farticle\")\n",[171,279,280],{"class":173,"line":193},[171,281,196],{},[171,283,284],{"class":173,"line":199},[171,285,184],{"emptyLinePlaceholder":183},[171,287,288],{"class":173,"line":204},[171,289,290],{},"print(docs[0].page_content)\n",[17,292,294],{"id":293},"_2-splitter文本分割器","2. Splitter（文本分割器）",[138,296,298],{"id":297},"_21-定位","2.1 定位",[13,300,301],{},"Splitter 将长文档切分成语义连贯的文本块，解决大模型上下文长度限制，同时尽量保持每个 Chunk 语义完整。",[13,303,304],{},"核心类型：",[306,307,308,314],"ul",{},[309,310,311,313],"li",{},[53,312,81],{},"：最推荐，按自然边界递归分割。",[309,315,316,318],{},[53,317,84],{},"：按 Token 数量分割，更接近模型的实际计费粒度。",[13,320,321],{},"关键参数：",[306,323,324,330],{},[309,325,326,329],{},[53,327,328],{},"chunk_size","：每个文本块的大小。",[309,331,332,335],{},[53,333,334],{},"chunk_overlap","：相邻文本块之间的重叠部分，避免上下文断裂。",[138,337,339],{"id":338},"_22-recursivecharactertextsplitter","2.2 RecursiveCharacterTextSplitter",[124,341,343],{"className":165,"code":342,"language":167,"meta":130,"style":130},"from langchain_text_splitters import RecursiveCharacterTextSplitter\n\nsplitter = RecursiveCharacterTextSplitter(\n    chunk_size=500,\n    chunk_overlap=50,\n    separators=[\"\\n\\n\", \"\\n\", \"。\", \"！\", \"？\", \" \", \"\"],\n)\n\nchunks = splitter.split_documents(docs)\nprint(len(chunks))\nprint(chunks[0].page_content)\n",[53,344,345,350,354,359,364,369,374,379,384,390,396],{"__ignoreMap":130},[171,346,347],{"class":173,"line":174},[171,348,349],{},"from langchain_text_splitters import RecursiveCharacterTextSplitter\n",[171,351,352],{"class":173,"line":180},[171,353,184],{"emptyLinePlaceholder":183},[171,355,356],{"class":173,"line":187},[171,357,358],{},"splitter = RecursiveCharacterTextSplitter(\n",[171,360,361],{"class":173,"line":193},[171,362,363],{},"    chunk_size=500,\n",[171,365,366],{"class":173,"line":199},[171,367,368],{},"    chunk_overlap=50,\n",[171,370,371],{"class":173,"line":204},[171,372,373],{},"    separators=[\"\\n\\n\", \"\\n\", \"。\", \"！\", \"？\", \" \", \"\"],\n",[171,375,376],{"class":173,"line":210},[171,377,378],{},")\n",[171,380,382],{"class":173,"line":381},8,[171,383,184],{"emptyLinePlaceholder":183},[171,385,387],{"class":173,"line":386},9,[171,388,389],{},"chunks = splitter.split_documents(docs)\n",[171,391,393],{"class":173,"line":392},10,[171,394,395],{},"print(len(chunks))\n",[171,397,399],{"class":173,"line":398},11,[171,400,401],{},"print(chunks[0].page_content)\n",[138,403,405],{"id":404},"_23-tokentextsplitter","2.3 TokenTextSplitter",[124,407,409],{"className":165,"code":408,"language":167,"meta":130,"style":130},"from langchain_text_splitters import TokenTextSplitter\n\ntoken_splitter = TokenTextSplitter(\n    chunk_size=500,\n    chunk_overlap=50,\n)\n\ntoken_chunks = token_splitter.split_documents(docs)\nprint(len(token_chunks))\n",[53,410,411,416,420,425,429,433,437,441,446],{"__ignoreMap":130},[171,412,413],{"class":173,"line":174},[171,414,415],{},"from langchain_text_splitters import TokenTextSplitter\n",[171,417,418],{"class":173,"line":180},[171,419,184],{"emptyLinePlaceholder":183},[171,421,422],{"class":173,"line":187},[171,423,424],{},"token_splitter = TokenTextSplitter(\n",[171,426,427],{"class":173,"line":193},[171,428,363],{},[171,430,431],{"class":173,"line":199},[171,432,368],{},[171,434,435],{"class":173,"line":204},[171,436,378],{},[171,438,439],{"class":173,"line":210},[171,440,184],{"emptyLinePlaceholder":183},[171,442,443],{"class":173,"line":381},[171,444,445],{},"token_chunks = token_splitter.split_documents(docs)\n",[171,447,448],{"class":173,"line":386},[171,449,450],{},"print(len(token_chunks))\n",[13,452,453,454,456,457,459],{},"区别：",[53,455,81],{}," 按字符和自然边界切分，",[53,458,84],{}," 按 Token 数量切分，更适合精确控制模型上下文占用。",[17,461,463],{"id":462},"_3-vectorstore向量存储","3. VectorStore（向量存储）",[138,465,467],{"id":466},"_31-定位","3.1 定位",[13,469,470],{},"VectorStore 是专门存储和检索向量的数据库。文本块先通过 Embedding 模型转换成高维向量，再写入 VectorStore；查询时通过语义相似度找到最相关的文本块。",[13,472,473],{},"常见实现：",[306,475,476,481,486,491],{},[309,477,478,480],{},[53,479,97],{},"：本地轻量级向量库。",[309,482,483,485],{},[53,484,106],{},"：本地高性能向量检索库。",[309,487,488,490],{},[53,489,100],{},"：云端托管向量库。",[309,492,493,495],{},[53,494,103],{},"：适合大规模生产环境的向量库。",[138,497,499],{"id":498},"_32-创建向量库","3.2 创建向量库",[124,501,503],{"className":165,"code":502,"language":167,"meta":130,"style":130},"from langchain_openai import OpenAIEmbeddings\nfrom langchain_community.vectorstores import Chroma\n\nembeddings = OpenAIEmbeddings()\n\nvectorstore = Chroma.from_documents(\n    documents=chunks,\n    embedding=embeddings,\n    persist_directory=\".\u002Fchroma_db\",\n)\n",[53,504,505,510,515,519,524,528,533,538,543,548],{"__ignoreMap":130},[171,506,507],{"class":173,"line":174},[171,508,509],{},"from langchain_openai import OpenAIEmbeddings\n",[171,511,512],{"class":173,"line":180},[171,513,514],{},"from langchain_community.vectorstores import Chroma\n",[171,516,517],{"class":173,"line":187},[171,518,184],{"emptyLinePlaceholder":183},[171,520,521],{"class":173,"line":193},[171,522,523],{},"embeddings = OpenAIEmbeddings()\n",[171,525,526],{"class":173,"line":199},[171,527,184],{"emptyLinePlaceholder":183},[171,529,530],{"class":173,"line":204},[171,531,532],{},"vectorstore = Chroma.from_documents(\n",[171,534,535],{"class":173,"line":210},[171,536,537],{},"    documents=chunks,\n",[171,539,540],{"class":173,"line":381},[171,541,542],{},"    embedding=embeddings,\n",[171,544,545],{"class":173,"line":386},[171,546,547],{},"    persist_directory=\".\u002Fchroma_db\",\n",[171,549,550],{"class":173,"line":392},[171,551,378],{},[138,553,555],{"id":554},"_33-核心操作","3.3 核心操作",[124,557,559],{"className":165,"code":558,"language":167,"meta":130,"style":130},"# 1. 新增文档\nvectorstore.add_documents([\n    {\"page_content\": \"公司成立于 2015 年，主营智能客服。\", \"metadata\": {\"source\": \"intro.txt\"}},\n])\n\n# 2. 语义相似度检索\nresults = vectorstore.similarity_search(\"公司主营什么业务？\", k=3)\nfor doc in results:\n    print(doc.page_content)\n\n# 3. 转换为 Retriever，供 RAG 链路使用\nretriever = vectorstore.as_retriever(search_kwargs={\"k\": 3})\nrelated_docs = retriever.invoke(\"公司主营什么业务？\")\n",[53,560,561,566,571,576,581,585,590,595,600,605,609,614,620],{"__ignoreMap":130},[171,562,563],{"class":173,"line":174},[171,564,565],{},"# 1. 新增文档\n",[171,567,568],{"class":173,"line":180},[171,569,570],{},"vectorstore.add_documents([\n",[171,572,573],{"class":173,"line":187},[171,574,575],{},"    {\"page_content\": \"公司成立于 2015 年，主营智能客服。\", \"metadata\": {\"source\": \"intro.txt\"}},\n",[171,577,578],{"class":173,"line":193},[171,579,580],{},"])\n",[171,582,583],{"class":173,"line":199},[171,584,184],{"emptyLinePlaceholder":183},[171,586,587],{"class":173,"line":204},[171,588,589],{},"# 2. 语义相似度检索\n",[171,591,592],{"class":173,"line":210},[171,593,594],{},"results = vectorstore.similarity_search(\"公司主营什么业务？\", k=3)\n",[171,596,597],{"class":173,"line":381},[171,598,599],{},"for doc in results:\n",[171,601,602],{"class":173,"line":386},[171,603,604],{},"    print(doc.page_content)\n",[171,606,607],{"class":173,"line":392},[171,608,184],{"emptyLinePlaceholder":183},[171,610,611],{"class":173,"line":398},[171,612,613],{},"# 3. 转换为 Retriever，供 RAG 链路使用\n",[171,615,617],{"class":173,"line":616},12,[171,618,619],{},"retriever = vectorstore.as_retriever(search_kwargs={\"k\": 3})\n",[171,621,623],{"class":173,"line":622},13,[171,624,625],{},"related_docs = retriever.invoke(\"公司主营什么业务？\")\n",[13,627,628,629,632,633,635,636,638],{},"注意：",[53,630,631],{},"add_documents()"," 接收的是 ",[53,634,55],{}," 对象列表；上面使用字典是为了展示数据结构，实际项目中应传入 ",[53,637,55],{},"。",[17,640,642],{"id":641},"_4-history消息历史","4. History（消息历史）",[138,644,646],{"id":645},"_41-定位","4.1 定位",[13,648,649],{},"History 负责存储和读取多轮对话的消息列表，让模型记住用户之前说过什么，实现连续对话。",[13,651,473],{},[306,653,654,659],{},[309,655,656,658],{},[53,657,119],{},"：内存存储，适合学习和测试。",[309,660,661,663],{},[53,662,122],{},"：Redis 存储，适合多实例共享和生产环境。",[138,665,667],{"id":666},"_42-inmemorychatmessagehistory","4.2 InMemoryChatMessageHistory",[124,669,671],{"className":165,"code":670,"language":167,"meta":130,"style":130},"from langchain_core.chat_history import InMemoryChatMessageHistory\n\nhistory = InMemoryChatMessageHistory()\n\nhistory.add_user_message(\"你好，我想查询余额\")\nhistory.add_ai_message(\"好的，请提供你的账号。\")\nhistory.add_user_message(\"我的账号是 10086\")\n\nfor message in history.messages:\n    print(message.type, message.content)\n",[53,672,673,678,682,687,691,696,701,706,710,715],{"__ignoreMap":130},[171,674,675],{"class":173,"line":174},[171,676,677],{},"from langchain_core.chat_history import InMemoryChatMessageHistory\n",[171,679,680],{"class":173,"line":180},[171,681,184],{"emptyLinePlaceholder":183},[171,683,684],{"class":173,"line":187},[171,685,686],{},"history = InMemoryChatMessageHistory()\n",[171,688,689],{"class":173,"line":193},[171,690,184],{"emptyLinePlaceholder":183},[171,692,693],{"class":173,"line":199},[171,694,695],{},"history.add_user_message(\"你好，我想查询余额\")\n",[171,697,698],{"class":173,"line":204},[171,699,700],{},"history.add_ai_message(\"好的，请提供你的账号。\")\n",[171,702,703],{"class":173,"line":210},[171,704,705],{},"history.add_user_message(\"我的账号是 10086\")\n",[171,707,708],{"class":173,"line":381},[171,709,184],{"emptyLinePlaceholder":183},[171,711,712],{"class":173,"line":386},[171,713,714],{},"for message in history.messages:\n",[171,716,717],{"class":173,"line":392},[171,718,719],{},"    print(message.type, message.content)\n",[138,721,723],{"id":722},"_43-redischatmessagehistory","4.3 RedisChatMessageHistory",[124,725,727],{"className":165,"code":726,"language":167,"meta":130,"style":130},"from langchain_community.chat_message_histories import RedisChatMessageHistory\n\nhistory = RedisChatMessageHistory(\n    session_id=\"user_001\",\n    url=\"redis:\u002F\u002Flocalhost:6379\u002F0\",\n)\n\nhistory.add_user_message(\"你好\")\nhistory.add_ai_message(\"你好，有什么可以帮你？\")\n\nprint(history.messages)\n",[53,728,729,734,738,743,748,753,757,761,766,771,775],{"__ignoreMap":130},[171,730,731],{"class":173,"line":174},[171,732,733],{},"from langchain_community.chat_message_histories import RedisChatMessageHistory\n",[171,735,736],{"class":173,"line":180},[171,737,184],{"emptyLinePlaceholder":183},[171,739,740],{"class":173,"line":187},[171,741,742],{},"history = RedisChatMessageHistory(\n",[171,744,745],{"class":173,"line":193},[171,746,747],{},"    session_id=\"user_001\",\n",[171,749,750],{"class":173,"line":199},[171,751,752],{},"    url=\"redis:\u002F\u002Flocalhost:6379\u002F0\",\n",[171,754,755],{"class":173,"line":204},[171,756,378],{},[171,758,759],{"class":173,"line":210},[171,760,184],{"emptyLinePlaceholder":183},[171,762,763],{"class":173,"line":381},[171,764,765],{},"history.add_user_message(\"你好\")\n",[171,767,768],{"class":173,"line":386},[171,769,770],{},"history.add_ai_message(\"你好，有什么可以帮你？\")\n",[171,772,773],{"class":173,"line":392},[171,774,184],{"emptyLinePlaceholder":183},[171,776,777],{"class":173,"line":398},[171,778,779],{},"print(history.messages)\n",[13,781,782],{},"使用 Redis 方案前，需要确保本机或服务器上的 Redis 服务已启动。",[138,784,786],{"id":785},"_44-与-prompt-组合","4.4 与 Prompt 组合",[13,788,789,790,793],{},"History 中的消息可以通过 ",[53,791,792],{},"MessagesPlaceholder"," 动态插入提示词模板：",[124,795,797],{"className":165,"code":796,"language":167,"meta":130,"style":130},"from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n\nprompt = ChatPromptTemplate.from_messages([\n    (\"system\", \"你是一位智能客服\"),\n    MessagesPlaceholder(variable_name=\"history\"),\n    (\"human\", \"{question}\"),\n])\n\nresult = prompt.invoke({\n    \"history\": history.messages,\n    \"question\": \"我的账号还能正常使用吗？\",\n})\n\nprint(result.to_messages())\n",[53,798,799,804,808,813,818,823,828,832,836,841,846,851,856,860],{"__ignoreMap":130},[171,800,801],{"class":173,"line":174},[171,802,803],{},"from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n",[171,805,806],{"class":173,"line":180},[171,807,184],{"emptyLinePlaceholder":183},[171,809,810],{"class":173,"line":187},[171,811,812],{},"prompt = ChatPromptTemplate.from_messages([\n",[171,814,815],{"class":173,"line":193},[171,816,817],{},"    (\"system\", \"你是一位智能客服\"),\n",[171,819,820],{"class":173,"line":199},[171,821,822],{},"    MessagesPlaceholder(variable_name=\"history\"),\n",[171,824,825],{"class":173,"line":204},[171,826,827],{},"    (\"human\", \"{question}\"),\n",[171,829,830],{"class":173,"line":210},[171,831,580],{},[171,833,834],{"class":173,"line":381},[171,835,184],{"emptyLinePlaceholder":183},[171,837,838],{"class":173,"line":386},[171,839,840],{},"result = prompt.invoke({\n",[171,842,843],{"class":173,"line":392},[171,844,845],{},"    \"history\": history.messages,\n",[171,847,848],{"class":173,"line":398},[171,849,850],{},"    \"question\": \"我的账号还能正常使用吗？\",\n",[171,852,853],{"class":173,"line":616},[171,854,855],{},"})\n",[171,857,858],{"class":173,"line":622},[171,859,184],{"emptyLinePlaceholder":183},[171,861,863],{"class":173,"line":862},14,[171,864,865],{},"print(result.to_messages())\n",[17,867,869],{"id":868},"二-小结","二、 小结",[22,871,872,887],{},[25,873,874],{},[28,875,876,878,881,884],{},[31,877,33],{},[31,879,880],{},"核心任务",[31,882,883],{},"核心类型 \u002F 操作",[31,885,886],{},"应用场景",[41,888,889,907,923,943],{},[28,890,891,893,896,904],{},[46,892,48],{},[46,894,895],{},"读取数据并转换为 Document",[46,897,898,62,900,62,902],{},[53,899,61],{},[53,901,65],{},[53,903,68],{},[46,905,906],{},"知识库文档导入",[28,908,909,911,914,920],{},[46,910,73],{},[46,912,913],{},"长文档切成语义连贯文本块",[46,915,916,62,918],{},[53,917,81],{},[53,919,84],{},[46,921,922],{},"RAG 向量化前处理",[28,924,925,927,930,940],{},[46,926,89],{},[46,928,929],{},"存储和检索向量",[46,931,932,62,934,62,937],{},[53,933,631],{},[53,935,936],{},"similarity_search()",[53,938,939],{},"as_retriever()",[46,941,942],{},"语义检索、RAG 记忆库",[28,944,945,947,950,956],{},[46,946,111],{},[46,948,949],{},"存储和读取多轮对话",[46,951,952,62,954],{},[53,953,119],{},[53,955,122],{},[46,957,958],{},"多轮对话、会话持久化",[13,960,961],{},"这四个组件共同构成 RAG 应用的“知识”与“上下文”基础：文档先经过 Loader、Splitter、VectorStore 变成可检索的知识，History 则负责保留每次对话的上下文。",[963,964,965],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":130,"searchDepth":180,"depth":180,"links":967},[968,969,975,980,985,991],{"id":19,"depth":180,"text":20},{"id":135,"depth":180,"text":136,"children":970},[971,972,973,974],{"id":140,"depth":187,"text":141},{"id":161,"depth":187,"text":162},{"id":216,"depth":187,"text":217},{"id":257,"depth":187,"text":258},{"id":293,"depth":180,"text":294,"children":976},[977,978,979],{"id":297,"depth":187,"text":298},{"id":338,"depth":187,"text":339},{"id":404,"depth":187,"text":405},{"id":462,"depth":180,"text":463,"children":981},[982,983,984],{"id":466,"depth":187,"text":467},{"id":498,"depth":187,"text":499},{"id":554,"depth":187,"text":555},{"id":641,"depth":180,"text":642,"children":986},[987,988,989,990],{"id":645,"depth":187,"text":646},{"id":666,"depth":187,"text":667},{"id":722,"depth":187,"text":723},{"id":785,"depth":187,"text":786},{"id":868,"depth":180,"text":869},"2026-04-28","从文档加载、文本切分、向量存储到对话历史，串起 RAG 数据处理与多轮上下文的基础组件。",false,"md","article",{"migration":998},{"generator":999,"sourceSha256":1000},"nuxt-site\u002Fscripts\u002Fmigrate-content.mjs","d371acd08117583e06ea331a6742b62109fd93222f295fea046285f92278739c","\u002Frag\u002F04_langchain-文档处理与对话历史",null,"rag",{"title":5,"description":993},"content\u002Frag\u002F04_LangChain-文档处理与对话历史.md","rag\u002F04_LangChain-文档处理与对话历史",[1008,1009,103],"RAG","LangChain",24,"H7aCCs6S4PMUpqV915jiLqVjIikK6iBTclFUytZob_g",1791279145504]