[{"data":1,"prerenderedAt":916},["ShallowReactive",2],{"note:\u002Frag\u002F03_核心抽象层":3},{"id":4,"title":5,"body":6,"date":896,"description":897,"draft":898,"extension":899,"featured":898,"kind":900,"lastmod":896,"meta":901,"navigation":151,"path":905,"planned":906,"section":907,"seo":908,"source":909,"stem":910,"tags":911,"toc":151,"weight":914,"__hash__":915},"notes\u002Frag\u002F03_核心抽象层.md","RAG 核心抽象层：Messages、Prompt、Parser",{"type":7,"value":8,"toc":875},"minimark",[9,16,38,49,54,59,63,67,127,131,189,193,199,285,289,293,296,299,319,323,365,369,457,464,468,472,475,479,485,518,522,528,566,570,576,646,650,653,765,772,787,791,868,871],[10,11,12],"ul",{},[13,14,15],"li",{},"当用户发起提问后，对话生成层按以下顺序工作：",[17,18,19,26,32],"ol",{},[13,20,21,25],{},[22,23,24],"strong",{},"Messages","：把用户问题、历史对话、工具返回结果组织成消息序列。",[13,27,28,31],{},[22,29,30],{},"Prompt","：把消息、检索到的文档和变量加工成完整提示词。",[13,33,34,37],{},[22,35,36],{},"Parser","：把 LLM 返回的文本解析成字符串、JSON 或 Pydantic 对象。",[39,40,46],"pre",{"className":41,"code":43,"language":44,"meta":45},[42],"language-text","用户问题 + 检索文档 + 历史对话\n        │ Messages\n        ▼\n     消息序列\n        │ Prompt\n        ▼\n     完整提示词\n        │ LLM\n        ▼\n     原始输出\n        │ Parser\n        ▼\n    结构化结果\n","text","",[47,48,43],"code",{"__ignoreMap":45},[50,51,53],"h2",{"id":52},"_1-messages消息","1. Messages（消息）",[55,56,58],"h3",{"id":57},"_11-定位","1.1 定位",[60,61,62],"p",{},"Messages 是与大模型交互的基本数据单元。模型本身只接收消息序列，不直接接收散落的字符串，因此所有对话内容都要先组织成消息。",[55,64,66],{"id":65},"_12-核心类型","1.2 核心类型",[68,69,70,83],"table",{},[71,72,73],"thead",{},[74,75,76,80],"tr",{},[77,78,79],"th",{},"消息类型",[77,81,82],{},"作用",[84,85,86,97,107,117],"tbody",{},[74,87,88,94],{},[89,90,91],"td",{},[47,92,93],{},"SystemMessage",[89,95,96],{},"设定系统角色和回答规则",[74,98,99,104],{},[89,100,101],{},[47,102,103],{},"HumanMessage",[89,105,106],{},"表示用户输入",[74,108,109,114],{},[89,110,111],{},[47,112,113],{},"AIMessage",[89,115,116],{},"表示模型输出",[74,118,119,124],{},[89,120,121],{},[47,122,123],{},"ToolMessage",[89,125,126],{},"表示工具调用后的返回结果",[55,128,130],{"id":129},"_13-代码示例","1.3 代码示例",[39,132,136],{"className":133,"code":134,"language":135,"meta":45,"style":45},"language-python shiki shiki-themes github-light github-dark","from langchain_core.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage\n\nmessages = [\n    SystemMessage(content=\"你是一位严谨的金融分析师\"),\n    HumanMessage(content=\"请分析这份财报\"),\n    AIMessage(content=\"我先查看财报中的关键指标\"),\n    ToolMessage(content=\"净利润为 1.2 亿元\", tool_call_id=\"call_001\"),\n]\n","python",[47,137,138,146,153,159,165,171,177,183],{"__ignoreMap":45},[139,140,143],"span",{"class":141,"line":142},"line",1,[139,144,145],{},"from langchain_core.messages import SystemMessage, HumanMessage, AIMessage, ToolMessage\n",[139,147,149],{"class":141,"line":148},2,[139,150,152],{"emptyLinePlaceholder":151},true,"\n",[139,154,156],{"class":141,"line":155},3,[139,157,158],{},"messages = [\n",[139,160,162],{"class":141,"line":161},4,[139,163,164],{},"    SystemMessage(content=\"你是一位严谨的金融分析师\"),\n",[139,166,168],{"class":141,"line":167},5,[139,169,170],{},"    HumanMessage(content=\"请分析这份财报\"),\n",[139,172,174],{"class":141,"line":173},6,[139,175,176],{},"    AIMessage(content=\"我先查看财报中的关键指标\"),\n",[139,178,180],{"class":141,"line":179},7,[139,181,182],{},"    ToolMessage(content=\"净利润为 1.2 亿元\", tool_call_id=\"call_001\"),\n",[139,184,186],{"class":141,"line":185},8,[139,187,188],{},"]\n",[55,190,192],{"id":191},"_14-v10-新特性content_blocks","1.4 v1.0 新特性：content_blocks",[60,194,195,198],{},[47,196,197],{},"content_blocks"," 用于统一封装推理、引用和多模态内容。例如同时向模型传入文字和图片：",[39,200,202],{"className":133,"code":201,"language":135,"meta":45,"style":45},"from langchain_core.messages import HumanMessage\n\nmessage = HumanMessage(\n    content_blocks=[\n        {\"type\": \"text\", \"text\": \"请根据图片判断天气\"},\n        {\n            \"type\": \"image\",\n            \"source\": {\n                \"type\": \"base64\",\n                \"media_type\": \"image\u002Fjpeg\",\n                \"data\": \"base64编码的图片数据\",\n            },\n        },\n    ]\n)\n",[47,203,204,209,213,218,223,228,233,238,243,249,255,261,267,273,279],{"__ignoreMap":45},[139,205,206],{"class":141,"line":142},[139,207,208],{},"from langchain_core.messages import HumanMessage\n",[139,210,211],{"class":141,"line":148},[139,212,152],{"emptyLinePlaceholder":151},[139,214,215],{"class":141,"line":155},[139,216,217],{},"message = HumanMessage(\n",[139,219,220],{"class":141,"line":161},[139,221,222],{},"    content_blocks=[\n",[139,224,225],{"class":141,"line":167},[139,226,227],{},"        {\"type\": \"text\", \"text\": \"请根据图片判断天气\"},\n",[139,229,230],{"class":141,"line":173},[139,231,232],{},"        {\n",[139,234,235],{"class":141,"line":179},[139,236,237],{},"            \"type\": \"image\",\n",[139,239,240],{"class":141,"line":185},[139,241,242],{},"            \"source\": {\n",[139,244,246],{"class":141,"line":245},9,[139,247,248],{},"                \"type\": \"base64\",\n",[139,250,252],{"class":141,"line":251},10,[139,253,254],{},"                \"media_type\": \"image\u002Fjpeg\",\n",[139,256,258],{"class":141,"line":257},11,[139,259,260],{},"                \"data\": \"base64编码的图片数据\",\n",[139,262,264],{"class":141,"line":263},12,[139,265,266],{},"            },\n",[139,268,270],{"class":141,"line":269},13,[139,271,272],{},"        },\n",[139,274,276],{"class":141,"line":275},14,[139,277,278],{},"    ]\n",[139,280,282],{"class":141,"line":281},15,[139,283,284],{},")\n",[50,286,288],{"id":287},"_2-prompt提示模板","2. Prompt（提示模板）",[55,290,292],{"id":291},"_21-定位","2.1 定位",[60,294,295],{},"Prompt 是动态生成完整提示词的模板引擎。它负责把用户输入、历史对话、检索文档加工成结构化的请求，避免每次手工拼接字符串。",[60,297,298],{},"核心类型：",[10,300,301,307,313],{},[13,302,303,306],{},[47,304,305],{},"PromptTemplate","：适合纯文本提示词模板。",[13,308,309,312],{},[47,310,311],{},"ChatPromptTemplate","：适合 Chat 模型的消息式提示词模板。",[13,314,315,318],{},[47,316,317],{},"MessagesPlaceholder","：在固定消息之间插入动态消息列表，常用于历史对话。",[55,320,322],{"id":321},"_22-prompttemplate-代码示例","2.2 PromptTemplate 代码示例",[39,324,326],{"className":133,"code":325,"language":135,"meta":45,"style":45},"from langchain_core.prompts import PromptTemplate\n\nprompt = PromptTemplate.from_template(\n    \"请用简洁的语言总结以下内容：\\n{content}\"\n)\n\nresult = prompt.invoke({\"content\": \"LangChain 是一套用于构建大模型应用的框架。\"})\nprint(result.to_string())\n",[47,327,328,333,337,342,347,351,355,360],{"__ignoreMap":45},[139,329,330],{"class":141,"line":142},[139,331,332],{},"from langchain_core.prompts import PromptTemplate\n",[139,334,335],{"class":141,"line":148},[139,336,152],{"emptyLinePlaceholder":151},[139,338,339],{"class":141,"line":155},[139,340,341],{},"prompt = PromptTemplate.from_template(\n",[139,343,344],{"class":141,"line":161},[139,345,346],{},"    \"请用简洁的语言总结以下内容：\\n{content}\"\n",[139,348,349],{"class":141,"line":167},[139,350,284],{},[139,352,353],{"class":141,"line":173},[139,354,152],{"emptyLinePlaceholder":151},[139,356,357],{"class":141,"line":179},[139,358,359],{},"result = prompt.invoke({\"content\": \"LangChain 是一套用于构建大模型应用的框架。\"})\n",[139,361,362],{"class":141,"line":185},[139,363,364],{},"print(result.to_string())\n",[55,366,368],{"id":367},"_23-chatprompttemplate-messagesplaceholder-代码示例","2.3 ChatPromptTemplate + MessagesPlaceholder 代码示例",[39,370,372],{"className":133,"code":371,"language":135,"meta":45,"style":45},"from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\nfrom langchain_core.messages import HumanMessage\n\nprompt = ChatPromptTemplate.from_messages([\n    (\"system\", \"你是一个{role}，请结合检索到的资料回答问题。\"),\n    MessagesPlaceholder(variable_name=\"history\"),\n    (\"human\", \"资料：{context}\\n\\n问题：{question}\"),\n])\n\nresult = prompt.invoke({\n    \"role\": \"智能客服\",\n    \"history\": [HumanMessage(content=\"你好，我想查询余额\")],\n    \"context\": \"公司产品包含账户查询、转账和理财推荐。\",\n    \"question\": \"我的余额怎么查询？\",\n})\n\nprint(result.to_messages())\n",[47,373,374,379,383,387,392,397,402,407,412,416,421,426,431,436,441,446,451],{"__ignoreMap":45},[139,375,376],{"class":141,"line":142},[139,377,378],{},"from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n",[139,380,381],{"class":141,"line":148},[139,382,208],{},[139,384,385],{"class":141,"line":155},[139,386,152],{"emptyLinePlaceholder":151},[139,388,389],{"class":141,"line":161},[139,390,391],{},"prompt = ChatPromptTemplate.from_messages([\n",[139,393,394],{"class":141,"line":167},[139,395,396],{},"    (\"system\", \"你是一个{role}，请结合检索到的资料回答问题。\"),\n",[139,398,399],{"class":141,"line":173},[139,400,401],{},"    MessagesPlaceholder(variable_name=\"history\"),\n",[139,403,404],{"class":141,"line":179},[139,405,406],{},"    (\"human\", \"资料：{context}\\n\\n问题：{question}\"),\n",[139,408,409],{"class":141,"line":185},[139,410,411],{},"])\n",[139,413,414],{"class":141,"line":245},[139,415,152],{"emptyLinePlaceholder":151},[139,417,418],{"class":141,"line":251},[139,419,420],{},"result = prompt.invoke({\n",[139,422,423],{"class":141,"line":257},[139,424,425],{},"    \"role\": \"智能客服\",\n",[139,427,428],{"class":141,"line":263},[139,429,430],{},"    \"history\": [HumanMessage(content=\"你好，我想查询余额\")],\n",[139,432,433],{"class":141,"line":269},[139,434,435],{},"    \"context\": \"公司产品包含账户查询、转账和理财推荐。\",\n",[139,437,438],{"class":141,"line":275},[139,439,440],{},"    \"question\": \"我的余额怎么查询？\",\n",[139,442,443],{"class":141,"line":281},[139,444,445],{},"})\n",[139,447,449],{"class":141,"line":448},16,[139,450,152],{"emptyLinePlaceholder":151},[139,452,454],{"class":141,"line":453},17,[139,455,456],{},"print(result.to_messages())\n",[60,458,459,460,463],{},"其中 ",[47,461,462],{},"history"," 也可以传空列表，表示没有历史对话。",[50,465,467],{"id":466},"_3-parser输出解析器","3. Parser（输出解析器）",[55,469,471],{"id":470},"_31-定位","3.1 定位",[60,473,474],{},"Parser 负责将 LLM 原始输出解析为结构化数据，让后续代码可以直接使用，而不需要再写复杂的字符串处理逻辑。",[55,476,478],{"id":477},"_32-stroutputparser","3.2 StrOutputParser",[60,480,481,484],{},[47,482,483],{},"StrOutputParser"," 把输出整理为普通字符串，适合回答类任务。",[39,486,488],{"className":133,"code":487,"language":135,"meta":45,"style":45},"from langchain_core.output_parsers import StrOutputParser\n\nparser = StrOutputParser()\nresult = parser.invoke(\"好的，这是最终答案。\")\n\nprint(result)  # 好的，这是最终答案。\n",[47,489,490,495,499,504,509,513],{"__ignoreMap":45},[139,491,492],{"class":141,"line":142},[139,493,494],{},"from langchain_core.output_parsers import StrOutputParser\n",[139,496,497],{"class":141,"line":148},[139,498,152],{"emptyLinePlaceholder":151},[139,500,501],{"class":141,"line":155},[139,502,503],{},"parser = StrOutputParser()\n",[139,505,506],{"class":141,"line":161},[139,507,508],{},"result = parser.invoke(\"好的，这是最终答案。\")\n",[139,510,511],{"class":141,"line":167},[139,512,152],{"emptyLinePlaceholder":151},[139,514,515],{"class":141,"line":173},[139,516,517],{},"print(result)  # 好的，这是最终答案。\n",[55,519,521],{"id":520},"_33-jsonoutputparser","3.3 JsonOutputParser",[60,523,524,527],{},[47,525,526],{},"JsonOutputParser"," 把 JSON 文本解析为 Python 字典。",[39,529,531],{"className":133,"code":530,"language":135,"meta":45,"style":45},"from langchain_core.output_parsers import JsonOutputParser\n\nparser = JsonOutputParser()\nresult = parser.invoke('{\"name\": \"张三\", \"age\": 18}')\n\nprint(result[\"name\"])  # 张三\nprint(result[\"age\"])   # 18\n",[47,532,533,538,542,547,552,556,561],{"__ignoreMap":45},[139,534,535],{"class":141,"line":142},[139,536,537],{},"from langchain_core.output_parsers import JsonOutputParser\n",[139,539,540],{"class":141,"line":148},[139,541,152],{"emptyLinePlaceholder":151},[139,543,544],{"class":141,"line":155},[139,545,546],{},"parser = JsonOutputParser()\n",[139,548,549],{"class":141,"line":161},[139,550,551],{},"result = parser.invoke('{\"name\": \"张三\", \"age\": 18}')\n",[139,553,554],{"class":141,"line":167},[139,555,152],{"emptyLinePlaceholder":151},[139,557,558],{"class":141,"line":173},[139,559,560],{},"print(result[\"name\"])  # 张三\n",[139,562,563],{"class":141,"line":179},[139,564,565],{},"print(result[\"age\"])   # 18\n",[55,567,569],{"id":568},"_34-pydanticoutputparser","3.4 PydanticOutputParser",[60,571,572,575],{},[47,573,574],{},"PydanticOutputParser"," 根据 Pydantic 模型校验并解析输出，结果字段更稳定。",[39,577,579],{"className":133,"code":578,"language":135,"meta":45,"style":45},"from pydantic import BaseModel, Field\nfrom langchain_core.output_parsers import PydanticOutputParser\n\n\nclass Person(BaseModel):\n    name: str = Field(description=\"人员姓名\")\n    age: int = Field(description=\"人员年龄\")\n\n\nparser = PydanticOutputParser(pydantic_object=Person)\nperson = parser.invoke('{\"name\": \"张三\", \"age\": 18}')\n\nprint(person.name)  # 张三\nprint(person.age)   # 18\n",[47,580,581,586,591,595,599,604,609,614,618,622,627,632,636,641],{"__ignoreMap":45},[139,582,583],{"class":141,"line":142},[139,584,585],{},"from pydantic import BaseModel, Field\n",[139,587,588],{"class":141,"line":148},[139,589,590],{},"from langchain_core.output_parsers import PydanticOutputParser\n",[139,592,593],{"class":141,"line":155},[139,594,152],{"emptyLinePlaceholder":151},[139,596,597],{"class":141,"line":161},[139,598,152],{"emptyLinePlaceholder":151},[139,600,601],{"class":141,"line":167},[139,602,603],{},"class Person(BaseModel):\n",[139,605,606],{"class":141,"line":173},[139,607,608],{},"    name: str = Field(description=\"人员姓名\")\n",[139,610,611],{"class":141,"line":179},[139,612,613],{},"    age: int = Field(description=\"人员年龄\")\n",[139,615,616],{"class":141,"line":185},[139,617,152],{"emptyLinePlaceholder":151},[139,619,620],{"class":141,"line":245},[139,621,152],{"emptyLinePlaceholder":151},[139,623,624],{"class":141,"line":251},[139,625,626],{},"parser = PydanticOutputParser(pydantic_object=Person)\n",[139,628,629],{"class":141,"line":257},[139,630,631],{},"person = parser.invoke('{\"name\": \"张三\", \"age\": 18}')\n",[139,633,634],{"class":141,"line":263},[139,635,152],{"emptyLinePlaceholder":151},[139,637,638],{"class":141,"line":269},[139,639,640],{},"print(person.name)  # 张三\n",[139,642,643],{"class":141,"line":275},[139,644,645],{},"print(person.age)   # 18\n",[50,647,649],{"id":648},"二-完整链路示例","二、 完整链路示例",[60,651,652],{},"将 Prompt、LLM、Parser 串成一条 LCEL 链，是 RAG 对话生成层最常见的用法：",[39,654,656],{"className":133,"code":655,"language":135,"meta":45,"style":45},"from langchain_core.messages import HumanMessage\nfrom langchain_core.output_parsers import StrOutputParser\nfrom langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\nfrom langchain_openai import ChatOpenAI\n\nprompt = ChatPromptTemplate.from_messages([\n    (\"system\", \"你是一位严谨的助手，请只根据资料回答。\"),\n    MessagesPlaceholder(variable_name=\"history\"),\n    (\"human\", \"资料：{context}\\n\\n问题：{question}\"),\n])\n\nllm = ChatOpenAI(model=\"gpt-4o-mini\")\nparser = StrOutputParser()\n\nchain = prompt | llm | parser\n\nanswer = chain.invoke({\n    \"history\": [HumanMessage(content=\"你好\")],\n    \"context\": \"公司的核心产品是智能客服系统。\",\n    \"question\": \"公司的核心产品是什么？\",\n})\n\nprint(answer)\n",[47,657,658,662,666,670,675,679,683,688,692,696,700,704,709,713,717,722,726,731,737,743,749,754,759],{"__ignoreMap":45},[139,659,660],{"class":141,"line":142},[139,661,208],{},[139,663,664],{"class":141,"line":148},[139,665,494],{},[139,667,668],{"class":141,"line":155},[139,669,378],{},[139,671,672],{"class":141,"line":161},[139,673,674],{},"from langchain_openai import ChatOpenAI\n",[139,676,677],{"class":141,"line":167},[139,678,152],{"emptyLinePlaceholder":151},[139,680,681],{"class":141,"line":173},[139,682,391],{},[139,684,685],{"class":141,"line":179},[139,686,687],{},"    (\"system\", \"你是一位严谨的助手，请只根据资料回答。\"),\n",[139,689,690],{"class":141,"line":185},[139,691,401],{},[139,693,694],{"class":141,"line":245},[139,695,406],{},[139,697,698],{"class":141,"line":251},[139,699,411],{},[139,701,702],{"class":141,"line":257},[139,703,152],{"emptyLinePlaceholder":151},[139,705,706],{"class":141,"line":263},[139,707,708],{},"llm = ChatOpenAI(model=\"gpt-4o-mini\")\n",[139,710,711],{"class":141,"line":269},[139,712,503],{},[139,714,715],{"class":141,"line":275},[139,716,152],{"emptyLinePlaceholder":151},[139,718,719],{"class":141,"line":281},[139,720,721],{},"chain = prompt | llm | parser\n",[139,723,724],{"class":141,"line":448},[139,725,152],{"emptyLinePlaceholder":151},[139,727,728],{"class":141,"line":453},[139,729,730],{},"answer = chain.invoke({\n",[139,732,734],{"class":141,"line":733},18,[139,735,736],{},"    \"history\": [HumanMessage(content=\"你好\")],\n",[139,738,740],{"class":141,"line":739},19,[139,741,742],{},"    \"context\": \"公司的核心产品是智能客服系统。\",\n",[139,744,746],{"class":141,"line":745},20,[139,747,748],{},"    \"question\": \"公司的核心产品是什么？\",\n",[139,750,752],{"class":141,"line":751},21,[139,753,445],{},[139,755,757],{"class":141,"line":756},22,[139,758,152],{"emptyLinePlaceholder":151},[139,760,762],{"class":141,"line":761},23,[139,763,764],{},"print(answer)\n",[60,766,767,768,771],{},"如果已经准备好 RAG 检索器，可以把检索结果拼进 ",[47,769,770],{},"context","：",[39,773,775],{"className":133,"code":774,"language":135,"meta":45,"style":45},"docs = retriever.invoke(question)\ncontext = \"\\n\".join(doc.page_content for doc in docs)\n",[47,776,777,782],{"__ignoreMap":45},[139,778,779],{"class":141,"line":142},[139,780,781],{},"docs = retriever.invoke(question)\n",[139,783,784],{"class":141,"line":148},[139,785,786],{},"context = \"\\n\".join(doc.page_content for doc in docs)\n",[50,788,790],{"id":789},"三-小结","三、 小结",[68,792,793,809],{},[71,794,795],{},[74,796,797,800,803,806],{},[77,798,799],{},"组件",[77,801,802],{},"核心任务",[77,804,805],{},"核心类型",[77,807,808],{},"输出",[84,810,811,832,850],{},[74,812,813,815,818,829],{},[89,814,24],{},[89,816,817],{},"组织与大模型交互的基本消息",[89,819,820,822,823,822,825,822,827],{},[47,821,93],{},"、",[47,824,103],{},[47,826,113],{},[47,828,123],{},[89,830,831],{},"消息序列",[74,833,834,836,839,847],{},[89,835,30],{},[89,837,838],{},"动态生成完整提示词",[89,840,841,822,843,822,845],{},[47,842,311],{},[47,844,305],{},[47,846,317],{},[89,848,849],{},"格式化后的提示词",[74,851,852,854,857,865],{},[89,853,36],{},[89,855,856],{},"解析 LLM 原始输出",[89,858,859,822,861,822,863],{},[47,860,483],{},[47,862,574],{},[47,864,526],{},[89,866,867],{},"字符串、JSON 或 Pydantic 对象",[60,869,870],{},"三个组件配合使用，就能把用户问题、历史对话和 RAG 检索文档统一转换成模型可理解的请求，并得到可直接使用的结构化答案。",[872,873,874],"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":45,"searchDepth":148,"depth":148,"links":876},[877,883,888,894,895],{"id":52,"depth":148,"text":53,"children":878},[879,880,881,882],{"id":57,"depth":155,"text":58},{"id":65,"depth":155,"text":66},{"id":129,"depth":155,"text":130},{"id":191,"depth":155,"text":192},{"id":287,"depth":148,"text":288,"children":884},[885,886,887],{"id":291,"depth":155,"text":292},{"id":321,"depth":155,"text":322},{"id":367,"depth":155,"text":368},{"id":466,"depth":148,"text":467,"children":889},[890,891,892,893],{"id":470,"depth":155,"text":471},{"id":477,"depth":155,"text":478},{"id":520,"depth":155,"text":521},{"id":568,"depth":155,"text":569},{"id":648,"depth":148,"text":649},{"id":789,"depth":148,"text":790},"2026-04-21","梳理 LangChain 中 Messages、Prompt 与 Parser 三类核心抽象，并通过完整链路理解它们如何协作。",false,"md","article",{"migration":902},{"generator":903,"sourceSha256":904},"nuxt-site\u002Fscripts\u002Fmigrate-content.mjs","840ed826edc9999f390d645a820302a9cf494f2e3487f66fbbede1af06692ecb","\u002Frag\u002F03_核心抽象层",null,"rag",{"title":5,"description":897},"content\u002Frag\u002F03_核心抽象层.md","rag\u002F03_核心抽象层",[912,913,30],"RAG","LangChain",24,"c3_Oh2_6VCVJgKWViMef5CsEIXtLNxHAmQ9Vg29PMDU",1791279145500]