[{"data":1,"prerenderedAt":1686},["ShallowReactive",2],{"navigation":3,"\u002Fllm\u002Flangchain4":144,"\u002Fllm\u002Flangchain4-surround":1681},[4,36,53,86,131],{"title":5,"path":6,"stem":7,"children":8,"icon":35},"Golang","\u002Fgolang","1.golang\u002F1.index",[9,11,15,19,23,27,31],{"title":10,"path":6,"stem":7},"golang-各种golang学习以及使用过程中记录",{"title":12,"path":13,"stem":14},"gopls-官方gopls内置mcp server的基本使用","\u002Fgolang\u002Fgopls_mcp_usages","1.golang\u002F2.gopls_mcp_usages",{"title":16,"path":17,"stem":18},"实践-(一)创建简单的http服务器","\u002Fgolang\u002Fgo_http_simple_server","1.golang\u002F3.go_http_simple_server",{"title":20,"path":21,"stem":22},"wails入门系列(一)环境安装与demo","\u002Fgolang\u002Fwails_start","1.golang\u002F4.wails_start",{"title":24,"path":25,"stem":26},"wails入门系列(二)无边框应用的菜单栏以及窗口拖拽","\u002Fgolang\u002Fwails_frameless","1.golang\u002F5.wails_frameless",{"title":28,"path":29,"stem":30},"go\u002Fredis-redis中大数字自动转换成指数形式的处理","\u002Fgolang\u002Fredis_big_num","1.golang\u002F6.redis_big_num",{"title":32,"path":33,"stem":34},"go\u002F方法记录-局部坐标与世界坐标间的相互转换(位置\u002F方向)","\u002Fgolang\u002Fworld_local_transform","1.golang\u002F7.world_local_transform",false,{"title":37,"icon":35,"path":38,"stem":39,"children":40,"page":35},"瞎折腾","\u002Ftinkering","2.tinkering",[41,45,49],{"title":42,"path":43,"stem":44},"mi50显卡ubuntu运行大模型开坑(一)显卡准备以及驱动安装","\u002Ftinkering\u002Fmi50_gpu_llm_1","2.tinkering\u002F1.mi50_gpu_llm_1",{"title":46,"path":47,"stem":48},"mi50显卡ubuntu运行大模型开坑(二)使用llama.cpp部署Qwen3系列","\u002Ftinkering\u002Fmi50_gpu_llm_2","2.tinkering\u002F2.mi50_gpu_llm_2",{"title":50,"path":51,"stem":52},"mi50显卡ubuntu运行大模型开坑(三)安装风扇并且控制转速","\u002Ftinkering\u002Fmi50_gpu_llm_3","2.tinkering\u002F3.mi50_gpu_llm_3",{"title":54,"icon":35,"path":55,"stem":56,"children":57,"page":35},"LLM","\u002Fllm","3.llm",[58,62,66,70,74,78,82],{"title":59,"path":60,"stem":61},"langchain入门-安装以及初次使用(deepseek api版本)","\u002Fllm\u002Flangchain1","3.llm\u002F01.langchain1",{"title":63,"path":64,"stem":65},"langchain入门-使用langchain调用本地部署的大模型(以llama.cpp以及ollama为例)","\u002Fllm\u002Flangchain2","3.llm\u002F02.langchain2",{"title":67,"path":68,"stem":69},"langchain入门-使用langchain编写一个简单的聊天机器人(DeepSeek API&命令行版本)","\u002Fllm\u002Flangchain3","3.llm\u002F03.langchain3",{"title":71,"path":72,"stem":73},"langchain入门-使用langchain构建一个拥有RAG能力的代码问答应用(DeepSeek API&本地bge-m3&命令行版本)","\u002Fllm\u002Flangchain4","3.llm\u002F04.langchain4",{"title":75,"path":76,"stem":77},"golang\u002Feino eino框架的基础使用 Message以及ChatModel入门","\u002Fllm\u002Feino1","3.llm\u002F05.eino1",{"title":79,"path":80,"stem":81},"golang\u002Feino eino框架的基础使用 在ChatModel中使用工具","\u002Fllm\u002Feino2","3.llm\u002F06.eino2",{"title":83,"path":84,"stem":85},"llm\u002Fagent agent-zero初步搭建与使用","\u002Fllm\u002Fagent_zero_start","3.llm\u002F07.agent_zero_start",{"title":87,"icon":35,"path":88,"stem":89,"children":90,"page":35},"Verilog","\u002Fverilog","4.verilog",[91,95,99,103,107,111,115,119,123,127],{"title":92,"path":93,"stem":94},"31条指令单周期cpu设计(Verilog)-(一)相关软件","\u002Fverilog\u002Fmips1","4.verilog\u002F01.mips1",{"title":96,"path":97,"stem":98},"31条指令单周期cpu设计(Verilog)-(二)总体设计","\u002Fverilog\u002Fmips2","4.verilog\u002F02.mips2",{"title":100,"path":101,"stem":102},"31条指令单周期cpu设计(Verilog)-(三)指令分析","\u002Fverilog\u002Fmips3","4.verilog\u002F03.mips3",{"title":104,"path":105,"stem":106},"31条指令单周期cpu设计(Verilog)-(四)数据输入输出关系表","\u002Fverilog\u002Fmips4","4.verilog\u002F04.mips4",{"title":108,"path":109,"stem":110},"31条指令单周期cpu设计(Verilog)-(五)整体数据通路图设计","\u002Fverilog\u002Fmips5","4.verilog\u002F05.mips5",{"title":112,"path":113,"stem":114},"31条指令单周期cpu设计(Verilog)-(六)指令操作时间表设计","\u002Fverilog\u002Fmips6","4.verilog\u002F06.mips6",{"title":116,"path":117,"stem":118},"31条指令单周期cpu设计(Verilog)-(七)整体代码结构","\u002Fverilog\u002Fmips7","4.verilog\u002F07.mips7",{"title":120,"path":121,"stem":122},"31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器","\u002Fverilog\u002Fmips8","4.verilog\u002F08.mips8",{"title":124,"path":125,"stem":126},"31条指令单周期cpu设计(Verilog)-(九)上代码→基础模块实现","\u002Fverilog\u002Fmips9","4.verilog\u002F09.mips9",{"title":128,"path":129,"stem":130},"31条指令单周期cpu设计(Verilog)-(十)上代码→顶层模块设计&总结","\u002Fverilog\u002Fmips10","4.verilog\u002F10.mips10",{"title":132,"icon":35,"path":133,"stem":134,"children":135,"page":35},"Rust","\u002Frust","5.rust",[136,140],{"title":137,"path":138,"stem":139},"egui(一)从编译运行template开始","\u002Frust\u002Fegui1","5.rust\u002F01.egui1",{"title":141,"path":142,"stem":143},"egui(二)看看template的main函数：日志输出以及eframe run_native","\u002Frust\u002Fegui2","5.rust\u002F02.egui2",{"id":145,"title":71,"body":146,"description":1673,"extension":1674,"links":1675,"meta":1676,"navigation":272,"path":72,"seo":1677,"stem":73,"__hash__":1680},"docs\u002F3.llm\u002F04.langchain4.md",{"type":147,"value":148,"toc":1664},"minimark",[149,153,172,175,280,283,433,436,522,525,1001,1004,1097,1100,1660],[150,151,152],"h2",{"id":152},"说在前面",[154,155,156],"blockquote",{},[157,158,159,163,166,169],"ul",{},[160,161,162],"li",{},"操作系统：windows",[160,164,165],{},"python版本：3.9",[160,167,168],{},"langchain版本：0.3.20",[160,170,171],{},"pycharm版本：2023.1.2 (Community Edition)",[150,173,174],{"id":174},"embedding模型",[157,176,177,194,197,214,249],{},[160,178,179,180],{},"什么是embedding模型？以下回答由AI提供\n",[154,181,182,186],{},[183,184,185],"p",{},"什么是Embedding？‌",[157,187,188,191],{},[160,189,190],{},"Embedding（嵌入）是将数据映射到低维向量空间的过程。例如，一个单词、句子或图片可以被表示为稠密向量（如300维），而非原始的稀疏高维形式（如one-hot编码）。向量空间中，语义相近的对象（如“猫”和“狗”）距离更近，而无关的对象（如“猫”和“飞机”）距离更远。",[160,192,193],{},"关键特点‌：\n‌低维稠密‌：相比one-hot编码，维度更低且每个维度包含语义信息。\n‌保留关系‌：捕捉数据中的语义、语法或特征关联（如“国王-男人+女人≈女王”）。\n‌可计算性‌：向量支持数学运算（如余弦相似度），便于下游任务处理。",[160,195,196],{},"我们将输入数据转换成向量之后，就可以更方便的查询这些数据之间的关系。",[160,198,199,200,204,210,213],{},"在魔塔以及huggingface上，选择",[201,202,203],"code",{},"句子相似度(Sentence Similarity)",[205,206],"img",{"alt":207,"src":208,"style":209},"在这里插入图片描述",".\u002Fllm\u002F8.webp","max-width:360px;width:100%;display:block;margin:0 auto",[205,211],{"alt":207,"src":212},".\u002Fllm\u002F9.webp","\n可以看到bge-m3目前的排名还挺高，这里我们就选择它",[160,215,216,217,220,221,224,225],{},"部署方式使用",[201,218,219],{},"ollama","（使用",[201,222,223],{},"llama.cpp","部署后似乎调不通），直接执行：\n",[226,227,232],"pre",{"className":228,"code":229,"language":230,"meta":231,"style":231},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","ollama pull bge-m3\n","shell","",[201,233,234],{"__ignoreMap":231},[235,236,239,242,246],"span",{"class":237,"line":238},"line",1,[235,240,219],{"class":241},"sBMFI",[235,243,245],{"class":244},"sfazB"," pull",[235,247,248],{"class":244}," bge-m3\n",[160,250,251,254,255],{},[201,252,253],{},"langchain","中调用\n",[226,256,260],{"className":257,"code":258,"language":259,"meta":231,"style":231},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from langchain_ollama import OllamaEmbeddings\n\nembeddings = OllamaEmbeddings(model=\"bge-m3:latest\")\n","python",[201,261,262,267,274],{"__ignoreMap":231},[235,263,264],{"class":237,"line":238},[235,265,266],{},"from langchain_ollama import OllamaEmbeddings\n",[235,268,270],{"class":237,"line":269},2,[235,271,273],{"emptyLinePlaceholder":272},true,"\n",[235,275,277],{"class":237,"line":276},3,[235,278,279],{},"embeddings = OllamaEmbeddings(model=\"bge-m3:latest\")\n",[150,281,282],{"id":282},"解析代码",[157,284,285,323,363,381,411],{},[160,286,287,288,304,305,308],{},"准备工作\n",[226,289,291],{"className":228,"code":290,"language":230,"meta":231,"style":231},"pip install unstructured\n",[201,292,293],{"__ignoreMap":231},[235,294,295,298,301],{"class":237,"line":238},[235,296,297],{"class":241},"pip",[235,299,300],{"class":244}," install",[235,302,303],{"class":244}," unstructured\n","\n下载",[201,306,307],{},"averaged_perceptron_tagger_eng",[226,309,311],{"className":257,"code":310,"language":259,"meta":231,"style":231},"import nltk\nnltk.download('averaged_perceptron_tagger_eng')\n",[201,312,313,318],{"__ignoreMap":231},[235,314,315],{"class":237,"line":238},[235,316,317],{},"import nltk\n",[235,319,320],{"class":237,"line":269},[235,321,322],{},"nltk.download('averaged_perceptron_tagger_eng')\n",[160,324,325,326],{},"加载文件\n",[226,327,329],{"className":257,"code":328,"language":259,"meta":231,"style":231},"from langchain_community.document_loaders import DirectoryLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter, Language\n\n# 加载所有go文件\nloader = DirectoryLoader(path=\"..\u002Fdetour-go-main\", glob=\"*.go\", recursive=True)\ndocs = loader.load()\n",[201,330,331,336,341,345,351,357],{"__ignoreMap":231},[235,332,333],{"class":237,"line":238},[235,334,335],{},"from langchain_community.document_loaders import DirectoryLoader\n",[235,337,338],{"class":237,"line":269},[235,339,340],{},"from langchain_text_splitters import RecursiveCharacterTextSplitter, Language\n",[235,342,343],{"class":237,"line":276},[235,344,273],{"emptyLinePlaceholder":272},[235,346,348],{"class":237,"line":347},4,[235,349,350],{},"# 加载所有go文件\n",[235,352,354],{"class":237,"line":353},5,[235,355,356],{},"loader = DirectoryLoader(path=\"..\u002Fdetour-go-main\", glob=\"*.go\", recursive=True)\n",[235,358,360],{"class":237,"line":359},6,[235,361,362],{},"docs = loader.load()\n",[160,364,365,366],{},"分割代码\n",[226,367,369],{"className":257,"code":368,"language":259,"meta":231,"style":231},"go_splitter = RecursiveCharacterTextSplitter.from_language(language=Language.GO, chunk_overlap=0)\nall_splits = go_splitter.split_documents(documents=docs)\n",[201,370,371,376],{"__ignoreMap":231},[235,372,373],{"class":237,"line":238},[235,374,375],{},"go_splitter = RecursiveCharacterTextSplitter.from_language(language=Language.GO, chunk_overlap=0)\n",[235,377,378],{"class":237,"line":269},[235,379,380],{},"all_splits = go_splitter.split_documents(documents=docs)\n",[160,382,383,384,387],{},"定义向量存储，在本文中，使用用于测试的",[201,385,386],{},"InMemoryVectorStore",[226,388,390],{"className":257,"code":389,"language":259,"meta":231,"style":231},"# 向量存储\nfrom langchain_core.vectorstores import InMemoryVectorStore\n\nvector_store = InMemoryVectorStore(embeddings)\n",[201,391,392,397,402,406],{"__ignoreMap":231},[235,393,394],{"class":237,"line":238},[235,395,396],{},"# 向量存储\n",[235,398,399],{"class":237,"line":269},[235,400,401],{},"from langchain_core.vectorstores import InMemoryVectorStore\n",[235,403,404],{"class":237,"line":276},[235,405,273],{"emptyLinePlaceholder":272},[235,407,408],{"class":237,"line":347},[235,409,410],{},"vector_store = InMemoryVectorStore(embeddings)\n",[160,412,413,414,417,418],{},"将数据通过",[201,415,416],{},"embedding","模型转换成向量，并存储\n",[226,419,421],{"className":257,"code":420,"language":259,"meta":231,"style":231},"# 将代码转换成向量\n_ = vector_store.add_documents(documents=all_splits)\n",[201,422,423,428],{"__ignoreMap":231},[235,424,425],{"class":237,"line":238},[235,426,427],{},"# 将代码转换成向量\n",[235,429,430],{"class":237,"line":269},[235,431,432],{},"_ = vector_store.add_documents(documents=all_splits)\n",[150,434,435],{"id":435},"创建检索工具",[157,437,438],{},[160,439,440,441],{},"为了让模型能够有能力访问我们的数据，我们需要定义一个工具(或者说方法)让模型去调用。\n",[226,442,444],{"className":257,"code":443,"language":259,"meta":231,"style":231},"from langchain_core.tools import tool\n\n@tool(response_format=\"content_and_artifact\", description=\"rag\")\ndef retrieve(query: str):\n    # 根据相似度查询数据\n    retrieve_docs = vector_store.similarity_search(query, k=2)\n    serialized = \"\\n\\n\".join(\n        (f\"Source: {doc.metadata}\\n\" f\"Content: {doc.page_content}\")\n        for doc in retrieve_docs\n    )\n    return serialized, retrieve_docs\n\n# 可以先测试下效果\nprint(retrieve.invoke(\"DtObstacleAvoidanceQuery.sampleVelocityAdaptive的作用是什么？\"))\n",[201,445,446,451,455,460,465,470,475,481,487,493,499,505,510,516],{"__ignoreMap":231},[235,447,448],{"class":237,"line":238},[235,449,450],{},"from langchain_core.tools import tool\n",[235,452,453],{"class":237,"line":269},[235,454,273],{"emptyLinePlaceholder":272},[235,456,457],{"class":237,"line":276},[235,458,459],{},"@tool(response_format=\"content_and_artifact\", description=\"rag\")\n",[235,461,462],{"class":237,"line":347},[235,463,464],{},"def retrieve(query: str):\n",[235,466,467],{"class":237,"line":353},[235,468,469],{},"    # 根据相似度查询数据\n",[235,471,472],{"class":237,"line":359},[235,473,474],{},"    retrieve_docs = vector_store.similarity_search(query, k=2)\n",[235,476,478],{"class":237,"line":477},7,[235,479,480],{},"    serialized = \"\\n\\n\".join(\n",[235,482,484],{"class":237,"line":483},8,[235,485,486],{},"        (f\"Source: {doc.metadata}\\n\" f\"Content: {doc.page_content}\")\n",[235,488,490],{"class":237,"line":489},9,[235,491,492],{},"        for doc in retrieve_docs\n",[235,494,496],{"class":237,"line":495},10,[235,497,498],{},"    )\n",[235,500,502],{"class":237,"line":501},11,[235,503,504],{},"    return serialized, retrieve_docs\n",[235,506,508],{"class":237,"line":507},12,[235,509,273],{"emptyLinePlaceholder":272},[235,511,513],{"class":237,"line":512},13,[235,514,515],{},"# 可以先测试下效果\n",[235,517,519],{"class":237,"line":518},14,[235,520,521],{},"print(retrieve.invoke(\"DtObstacleAvoidanceQuery.sampleVelocityAdaptive的作用是什么？\"))\n",[150,523,524],{"id":524},"构建graph",[157,526,527,549,717,738,890],{},[160,528,529,530],{},"和上一篇一样，创建一个StateGraph\n",[226,531,533],{"className":257,"code":532,"language":259,"meta":231,"style":231},"from langgraph.graph import MessagesState, StateGraph\n\ngraph_builder = StateGraph(state_schema=MessagesState)\n",[201,534,535,540,544],{"__ignoreMap":231},[235,536,537],{"class":237,"line":238},[235,538,539],{},"from langgraph.graph import MessagesState, StateGraph\n",[235,541,542],{"class":237,"line":269},[235,543,273],{"emptyLinePlaceholder":272},[235,545,546],{"class":237,"line":276},[235,547,548],{},"graph_builder = StateGraph(state_schema=MessagesState)\n",[160,550,551,552,555,556,590,591,708,709,712,713,716],{},"定义",[201,553,554],{},"query_or_response","节点\n这个节点的作用是，让AI根据历史消息决定是否需要调用工具\n",[226,557,559],{"className":257,"code":558,"language":259,"meta":231,"style":231},"from langchain_core.messages import SystemMessage\n\ndef query_or_response(state: MessagesState):\n    llm_with_tools = llm.bind_tools([retrieve])\n    response = llm_with_tools.invoke(state[\"messages\"])\n    return {\"messages\": [response]}\n",[201,560,561,566,570,575,580,585],{"__ignoreMap":231},[235,562,563],{"class":237,"line":238},[235,564,565],{},"from langchain_core.messages import SystemMessage\n",[235,567,568],{"class":237,"line":269},[235,569,273],{"emptyLinePlaceholder":272},[235,571,572],{"class":237,"line":276},[235,573,574],{},"def query_or_response(state: MessagesState):\n",[235,576,577],{"class":237,"line":347},[235,578,579],{},"    llm_with_tools = llm.bind_tools([retrieve])\n",[235,581,582],{"class":237,"line":353},[235,583,584],{},"    response = llm_with_tools.invoke(state[\"messages\"])\n",[235,586,587],{"class":237,"line":359},[235,588,589],{},"    return {\"messages\": [response]}\n","\n以下是一个模型调用返回：\n",[226,592,594],{"className":257,"code":593,"language":259,"meta":231,"style":231},"AIMessage(content='', \nadditional_kwargs={\n    'tool_calls': [\n        {\n            'id': 'xxx', \n            'function': {\n                'arguments': '{\"query\":\"sampleVelocityAdaptive的作用\"}', \n                'name': 'retrieve'\n            }, \n            'type': 'function', \n            'index': 0\n        }], \n    'refusal': None}, \nresponse_metadata={xxx}, \nid='xxx',\ntool_calls=[{\n    'name': 'retrieve', \n    'args': {'query': 'sampleVelocityAdaptive的作用'}, \n    'id': 'xxx', \n    'type': 'tool_call'}],\nusage_metadata={xxx})\n",[201,595,596,601,606,611,616,621,626,631,636,641,646,651,656,661,666,672,678,684,690,696,702],{"__ignoreMap":231},[235,597,598],{"class":237,"line":238},[235,599,600],{},"AIMessage(content='', \n",[235,602,603],{"class":237,"line":269},[235,604,605],{},"additional_kwargs={\n",[235,607,608],{"class":237,"line":276},[235,609,610],{},"    'tool_calls': [\n",[235,612,613],{"class":237,"line":347},[235,614,615],{},"        {\n",[235,617,618],{"class":237,"line":353},[235,619,620],{},"            'id': 'xxx', \n",[235,622,623],{"class":237,"line":359},[235,624,625],{},"            'function': {\n",[235,627,628],{"class":237,"line":477},[235,629,630],{},"                'arguments': '{\"query\":\"sampleVelocityAdaptive的作用\"}', \n",[235,632,633],{"class":237,"line":483},[235,634,635],{},"                'name': 'retrieve'\n",[235,637,638],{"class":237,"line":489},[235,639,640],{},"            }, \n",[235,642,643],{"class":237,"line":495},[235,644,645],{},"            'type': 'function', \n",[235,647,648],{"class":237,"line":501},[235,649,650],{},"            'index': 0\n",[235,652,653],{"class":237,"line":507},[235,654,655],{},"        }], \n",[235,657,658],{"class":237,"line":512},[235,659,660],{},"    'refusal': None}, \n",[235,662,663],{"class":237,"line":518},[235,664,665],{},"response_metadata={xxx}, \n",[235,667,669],{"class":237,"line":668},15,[235,670,671],{},"id='xxx',\n",[235,673,675],{"class":237,"line":674},16,[235,676,677],{},"tool_calls=[{\n",[235,679,681],{"class":237,"line":680},17,[235,682,683],{},"    'name': 'retrieve', \n",[235,685,687],{"class":237,"line":686},18,[235,688,689],{},"    'args': {'query': 'sampleVelocityAdaptive的作用'}, \n",[235,691,693],{"class":237,"line":692},19,[235,694,695],{},"    'id': 'xxx', \n",[235,697,699],{"class":237,"line":698},20,[235,700,701],{},"    'type': 'tool_call'}],\n",[235,703,705],{"class":237,"line":704},21,[235,706,707],{},"usage_metadata={xxx})\n","\n可以看到在返回数据中",[201,710,711],{},"additional_kwargs","带上了",[201,714,715],{},"tool_calls","的信息，通过这些信息，我们的程序就知道应该使用什么参数，调用哪个方法。",[160,718,551,719,722,723],{},[201,720,721],{},"tool","节点\n",[226,724,726],{"className":257,"code":725,"language":259,"meta":231,"style":231},"from langgraph.prebuilt import ToolNode\ntools = ToolNode([retrieve])\n",[201,727,728,733],{"__ignoreMap":231},[235,729,730],{"class":237,"line":238},[235,731,732],{},"from langgraph.prebuilt import ToolNode\n",[235,734,735],{"class":237,"line":269},[235,736,737],{},"tools = ToolNode([retrieve])\n",[160,739,551,740,743,744,747,748,751,752],{},[201,741,742],{},"generate","节点，这个节点就是正常的合并历史消息，调用模型；不过在处理",[201,745,746],{},"ToolMessage","时，将其分离出来并放在了",[201,749,750],{},"prompt","中\n",[226,753,755],{"className":257,"code":754,"language":259,"meta":231,"style":231},"def generate(state: MessagesState):\n    recent_tool_messages = []\n    for message in reversed(state[\"messages\"]):\n        if message.type == \"tool\":\n            recent_tool_messages.append(message)\n        else:\n            break\n    tools_messages = recent_tool_messages[::-1]\n    docs_content = \"\\n\\n\".join(doc.content for doc in tools_messages)\n    sys_msg_content = (\n        \"你是一个go语言的代码助手.\"\n        \"你可以使用下面的检索数据来回答用户的问题.\"\n        \"如果你不知道如何回答,请回答不知道.\"\n        \"\\n\\n\"\n        f\"{docs_content}\"\n    )\n    conversation_msgs = [\n        msg\n        for msg in state[\"messages\"]\n        if msg.type in (\"human\", \"system\")\n           or (msg.type == \"ai\" and not msg.tool_calls)\n    ]\n    prompt = [SystemMessage(sys_msg_content)] + conversation_msgs\n\n    resp = llm.invoke(prompt)\n    return {\"messages\": [resp]}\n",[201,756,757,762,767,772,777,782,787,792,797,802,807,812,817,822,827,832,836,841,846,851,856,861,867,873,878,884],{"__ignoreMap":231},[235,758,759],{"class":237,"line":238},[235,760,761],{},"def generate(state: MessagesState):\n",[235,763,764],{"class":237,"line":269},[235,765,766],{},"    recent_tool_messages = []\n",[235,768,769],{"class":237,"line":276},[235,770,771],{},"    for message in reversed(state[\"messages\"]):\n",[235,773,774],{"class":237,"line":347},[235,775,776],{},"        if message.type == \"tool\":\n",[235,778,779],{"class":237,"line":353},[235,780,781],{},"            recent_tool_messages.append(message)\n",[235,783,784],{"class":237,"line":359},[235,785,786],{},"        else:\n",[235,788,789],{"class":237,"line":477},[235,790,791],{},"            break\n",[235,793,794],{"class":237,"line":483},[235,795,796],{},"    tools_messages = recent_tool_messages[::-1]\n",[235,798,799],{"class":237,"line":489},[235,800,801],{},"    docs_content = \"\\n\\n\".join(doc.content for doc in tools_messages)\n",[235,803,804],{"class":237,"line":495},[235,805,806],{},"    sys_msg_content = (\n",[235,808,809],{"class":237,"line":501},[235,810,811],{},"        \"你是一个go语言的代码助手.\"\n",[235,813,814],{"class":237,"line":507},[235,815,816],{},"        \"你可以使用下面的检索数据来回答用户的问题.\"\n",[235,818,819],{"class":237,"line":512},[235,820,821],{},"        \"如果你不知道如何回答,请回答不知道.\"\n",[235,823,824],{"class":237,"line":518},[235,825,826],{},"        \"\\n\\n\"\n",[235,828,829],{"class":237,"line":668},[235,830,831],{},"        f\"{docs_content}\"\n",[235,833,834],{"class":237,"line":674},[235,835,498],{},[235,837,838],{"class":237,"line":680},[235,839,840],{},"    conversation_msgs = [\n",[235,842,843],{"class":237,"line":686},[235,844,845],{},"        msg\n",[235,847,848],{"class":237,"line":692},[235,849,850],{},"        for msg in state[\"messages\"]\n",[235,852,853],{"class":237,"line":698},[235,854,855],{},"        if msg.type in (\"human\", \"system\")\n",[235,857,858],{"class":237,"line":704},[235,859,860],{},"           or (msg.type == \"ai\" and not msg.tool_calls)\n",[235,862,864],{"class":237,"line":863},22,[235,865,866],{},"    ]\n",[235,868,870],{"class":237,"line":869},23,[235,871,872],{},"    prompt = [SystemMessage(sys_msg_content)] + conversation_msgs\n",[235,874,876],{"class":237,"line":875},24,[235,877,273],{"emptyLinePlaceholder":272},[235,879,881],{"class":237,"line":880},25,[235,882,883],{},"    resp = llm.invoke(prompt)\n",[235,885,887],{"class":237,"line":886},26,[235,888,889],{},"    return {\"messages\": [resp]}\n",[160,891,892,893,980,981,984,985,987,988,991,992,995,996],{},"连接节点\n",[226,894,896],{"className":257,"code":895,"language":259,"meta":231,"style":231},"from langgraph.graph import END\nfrom langgraph.prebuilt import tools_condition\n\ngraph_builder.add_node(query_or_response)\ngraph_builder.add_node(tools)\ngraph_builder.add_node(generate)\n\ngraph_builder.set_entry_point(\"query_or_response\")\ngraph_builder.add_conditional_edges(\n    \"query_or_response\",\n    tools_condition,\n    {END: END, \"tools\": \"tools\"}\n)\ngraph_builder.add_edge(\"tools\", \"generate\")\ngraph_builder.add_edge(\"generate\", END)\n\ncompiled_graph = graph_builder.compile()\n",[201,897,898,903,908,912,917,922,927,931,936,941,946,951,956,961,966,971,975],{"__ignoreMap":231},[235,899,900],{"class":237,"line":238},[235,901,902],{},"from langgraph.graph import END\n",[235,904,905],{"class":237,"line":269},[235,906,907],{},"from langgraph.prebuilt import tools_condition\n",[235,909,910],{"class":237,"line":276},[235,911,273],{"emptyLinePlaceholder":272},[235,913,914],{"class":237,"line":347},[235,915,916],{},"graph_builder.add_node(query_or_response)\n",[235,918,919],{"class":237,"line":353},[235,920,921],{},"graph_builder.add_node(tools)\n",[235,923,924],{"class":237,"line":359},[235,925,926],{},"graph_builder.add_node(generate)\n",[235,928,929],{"class":237,"line":477},[235,930,273],{"emptyLinePlaceholder":272},[235,932,933],{"class":237,"line":483},[235,934,935],{},"graph_builder.set_entry_point(\"query_or_response\")\n",[235,937,938],{"class":237,"line":489},[235,939,940],{},"graph_builder.add_conditional_edges(\n",[235,942,943],{"class":237,"line":495},[235,944,945],{},"    \"query_or_response\",\n",[235,947,948],{"class":237,"line":501},[235,949,950],{},"    tools_condition,\n",[235,952,953],{"class":237,"line":507},[235,954,955],{},"    {END: END, \"tools\": \"tools\"}\n",[235,957,958],{"class":237,"line":512},[235,959,960],{},")\n",[235,962,963],{"class":237,"line":518},[235,964,965],{},"graph_builder.add_edge(\"tools\", \"generate\")\n",[235,967,968],{"class":237,"line":668},[235,969,970],{},"graph_builder.add_edge(\"generate\", END)\n",[235,972,973],{"class":237,"line":674},[235,974,273],{"emptyLinePlaceholder":272},[235,976,977],{"class":237,"line":680},[235,978,979],{},"compiled_graph = graph_builder.compile()\n","\n在该",[201,982,983],{},"graph","中，调用",[201,986,554],{},"后，如果是非tool_call的返回，即正常的对话（比如用户说了句\"你好\"），那么就会跳转到",[201,989,990],{},"END","节点；否则的话，会调用",[201,993,994],{},"tools","，并再次调用模型\n",[997,998],"mermaid",{":config":999,"code":1000},"config","graph%20TB%0A%20%20%09A(%5BStart%5D)%20--%3E%20B%5Bquery_or_response%5D%0A%20%20%20%20B%20--%3E%20E%5BEND%5D%0A%20%20%09B%20--%3E%20C%5Btools%5D%0A%20%20%09C%20--%3E%20D%5Bgenerate%5D%0A%20%20%09D%20--%3E%20E%5BEND%5D",[150,1002,1003],{"id":1003},"测试",[157,1005,1006,1051,1091,1094],{},[160,1007,1008,1009],{},"依旧是命令行的方式\n",[226,1010,1012],{"className":257,"code":1011,"language":259,"meta":231,"style":231},"compiled_graph = graph_builder.compile()\n\nfrom langchain_core.messages import HumanMessage, AIMessage\n\nwhile True:\n    input_msg = input(\"> \")\n    ai_msg = compiled_graph.invoke({\"messages\": [HumanMessage(content=input_msg)]})\n    print(ai_msg)\n",[201,1013,1014,1018,1022,1027,1031,1036,1041,1046],{"__ignoreMap":231},[235,1015,1016],{"class":237,"line":238},[235,1017,979],{},[235,1019,1020],{"class":237,"line":269},[235,1021,273],{"emptyLinePlaceholder":272},[235,1023,1024],{"class":237,"line":276},[235,1025,1026],{},"from langchain_core.messages import HumanMessage, AIMessage\n",[235,1028,1029],{"class":237,"line":347},[235,1030,273],{"emptyLinePlaceholder":272},[235,1032,1033],{"class":237,"line":353},[235,1034,1035],{},"while True:\n",[235,1037,1038],{"class":237,"line":359},[235,1039,1040],{},"    input_msg = input(\"> \")\n",[235,1042,1043],{"class":237,"line":477},[235,1044,1045],{},"    ai_msg = compiled_graph.invoke({\"messages\": [HumanMessage(content=input_msg)]})\n",[235,1047,1048],{"class":237,"line":483},[235,1049,1050],{},"    print(ai_msg)\n",[160,1052,1053,1054],{},"但是测试结果不太行，因为根据相似度检索出来的数据是错误的🥲\n",[226,1055,1057],{"className":228,"code":1056,"language":230,"meta":231,"style":231},"> DtObstacleAvoidanceQuery.sampleVelocityAdaptive的作用是什么？\n根据提供的检索数据，没有找关于 `DtObstacleAvoidanceQuery.sampleVelocityAdaptive` 的具体信息。\n因此，我无法回答这个函数的作用。\\n\\n如果你有更多关于这个函数的上下文或其他相关代码片段，可以提供给我，我会尽力帮助你解答。\n",[201,1058,1059,1069,1086],{"__ignoreMap":231},[235,1060,1061,1065],{"class":237,"line":238},[235,1062,1064],{"class":1063},"sMK4o",">",[235,1066,1068],{"class":1067},"sTEyZ"," DtObstacleAvoidanceQuery.sampleVelocityAdaptive的作用是什么？\n",[235,1070,1071,1074,1077,1080,1083],{"class":237,"line":269},[235,1072,1073],{"class":241},"根据提供的检索数据，没有找关于",[235,1075,1076],{"class":1063}," `",[235,1078,1079],{"class":241},"DtObstacleAvoidanceQuery.sampleVelocityAdaptive",[235,1081,1082],{"class":1063},"`",[235,1084,1085],{"class":241}," 的具体信息。\n",[235,1087,1088],{"class":237,"line":276},[235,1089,1090],{"class":241},"因此，我无法回答这个函数的作用。\\n\\n如果你有更多关于这个函数的上下文或其他相关代码片段，可以提供给我，我会尽力帮助你解答。\n",[160,1092,1093],{},"整个流程是通的，如果使用一些文档作为数据源可能效果会好点",[160,1095,1096],{},"对于代码，后续还会研究更好的方式来处理",[150,1098,1099],{"id":1099},"完整代码",[226,1101,1103],{"className":257,"code":1102,"language":259,"meta":231,"style":231},"from langchain_ollama import OllamaEmbeddings\n\nembeddings = OllamaEmbeddings(model=\"bge-m3:latest\")\n\nfrom langchain_deepseek import ChatDeepSeek\n\nllm = ChatDeepSeek(model=\"deepseek-chat\", api_key=\"xxxx\")\n\nfrom langchain_community.document_loaders import DirectoryLoader\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter, Language\n\n# 加载所有go文件\nloader = DirectoryLoader(path=\"..\u002Fdetour-go-main\", glob=\"*.go\", recursive=True)\ndocs = loader.load()\n\n# 分割代码\ngo_splitter = RecursiveCharacterTextSplitter.from_language(language=Language.GO, chunk_overlap=0)\nall_splits = go_splitter.split_documents(documents=docs)\n\nprint(all_splits[:3])\n\n# 向量存储\nfrom langchain_core.vectorstores import InMemoryVectorStore\n\nvector_store = InMemoryVectorStore(embeddings)\n\n# 将代码转换成向量\n_ = vector_store.add_documents(documents=all_splits)\n\n# 创建一个查询工具\nfrom langchain_core.tools import tool\n\n\n@tool(response_format=\"content_and_artifact\", description=\"rag\")\ndef retrieve(query: str):\n    # 根据相似度查询数据\n    retrieve_docs = vector_store.similarity_search(query, k=2)\n    serialized = \"\\n\\n\".join(\n        (f\"Source: {doc.metadata}\\n\" f\"Content: {doc.page_content}\")\n        for doc in retrieve_docs\n    )\n    return serialized, retrieve_docs\n\nprint(retrieve.invoke(\"DtObstacleAvoidanceQuery.sampleVelocityAdaptive的作用是什么？\"))\n\n# 开始构建graph\nfrom langgraph.graph import MessagesState, StateGraph\n\ngraph_builder = StateGraph(state_schema=MessagesState)\n\nfrom langchain_core.messages import SystemMessage\n\ndef query_or_response(state: MessagesState):\n    llm_with_tools = llm.bind_tools([retrieve])\n    response = llm_with_tools.invoke(state[\"messages\"])\n    return {\"messages\": [response]}\n\n\nfrom langgraph.prebuilt import ToolNode\n\ntools = ToolNode([retrieve])\n\n\ndef generate(state: MessagesState):\n    recent_tool_messages = []\n    for message in reversed(state[\"messages\"]):\n        if message.type == \"tool\":\n            recent_tool_messages.append(message)\n        else:\n            break\n    tools_messages = recent_tool_messages[::-1]\n    docs_content = \"\\n\\n\".join(doc.content for doc in tools_messages)\n    sys_msg_content = (\n        \"你是一个go语言的代码助手.\"\n        \"你可以使用下面的检索数据来回答用户的问题.\"\n        \"如果你不知道如何回答,请回答不知道.\"\n        \"\\n\\n\"\n        f\"{docs_content}\"\n    )\n    conversation_msgs = [\n        msg\n        for msg in state[\"messages\"]\n        if msg.type in (\"human\", \"system\")\n           or (msg.type == \"ai\" and not msg.tool_calls)\n    ]\n    prompt = [SystemMessage(sys_msg_content)] + conversation_msgs\n\n    resp = llm.invoke(prompt)\n    return {\"messages\": [resp]}\n\n\nfrom langgraph.graph import END\nfrom langgraph.prebuilt import tools_condition\n\ngraph_builder.add_node(query_or_response)\ngraph_builder.add_node(tools)\ngraph_builder.add_node(generate)\n\ngraph_builder.set_entry_point(\"query_or_response\")\ngraph_builder.add_conditional_edges(\n    \"query_or_response\",\n    tools_condition,\n    {END: END, \"tools\": \"tools\"}\n)\ngraph_builder.add_edge(\"tools\", \"generate\")\ngraph_builder.add_edge(\"generate\", END)\n\ncompiled_graph = graph_builder.compile()\n\nfrom langchain_core.messages import HumanMessage, AIMessage\n\nwhile True:\n    input_msg = input(\"> \")\n    ai_msg = compiled_graph.invoke({\"messages\": [HumanMessage(content=input_msg)]})\n    print(ai_msg)\n",[201,1104,1105,1109,1113,1117,1121,1126,1130,1135,1139,1143,1147,1151,1155,1159,1163,1167,1172,1176,1180,1184,1189,1193,1197,1201,1205,1209,1213,1218,1223,1228,1234,1239,1244,1249,1254,1259,1264,1269,1274,1279,1284,1289,1294,1299,1304,1309,1315,1320,1325,1330,1335,1340,1345,1350,1355,1360,1365,1370,1375,1380,1385,1390,1395,1400,1405,1410,1415,1420,1425,1430,1435,1440,1445,1450,1455,1460,1465,1470,1475,1480,1485,1490,1495,1500,1505,1510,1515,1520,1525,1530,1535,1540,1545,1550,1555,1560,1565,1570,1575,1580,1585,1590,1595,1600,1605,1610,1615,1620,1625,1630,1635,1640,1645,1650,1655],{"__ignoreMap":231},[235,1106,1107],{"class":237,"line":238},[235,1108,266],{},[235,1110,1111],{"class":237,"line":269},[235,1112,273],{"emptyLinePlaceholder":272},[235,1114,1115],{"class":237,"line":276},[235,1116,279],{},[235,1118,1119],{"class":237,"line":347},[235,1120,273],{"emptyLinePlaceholder":272},[235,1122,1123],{"class":237,"line":353},[235,1124,1125],{},"from langchain_deepseek import ChatDeepSeek\n",[235,1127,1128],{"class":237,"line":359},[235,1129,273],{"emptyLinePlaceholder":272},[235,1131,1132],{"class":237,"line":477},[235,1133,1134],{},"llm = ChatDeepSeek(model=\"deepseek-chat\", api_key=\"xxxx\")\n",[235,1136,1137],{"class":237,"line":483},[235,1138,273],{"emptyLinePlaceholder":272},[235,1140,1141],{"class":237,"line":489},[235,1142,335],{},[235,1144,1145],{"class":237,"line":495},[235,1146,340],{},[235,1148,1149],{"class":237,"line":501},[235,1150,273],{"emptyLinePlaceholder":272},[235,1152,1153],{"class":237,"line":507},[235,1154,350],{},[235,1156,1157],{"class":237,"line":512},[235,1158,356],{},[235,1160,1161],{"class":237,"line":518},[235,1162,362],{},[235,1164,1165],{"class":237,"line":668},[235,1166,273],{"emptyLinePlaceholder":272},[235,1168,1169],{"class":237,"line":674},[235,1170,1171],{},"# 分割代码\n",[235,1173,1174],{"class":237,"line":680},[235,1175,375],{},[235,1177,1178],{"class":237,"line":686},[235,1179,380],{},[235,1181,1182],{"class":237,"line":692},[235,1183,273],{"emptyLinePlaceholder":272},[235,1185,1186],{"class":237,"line":698},[235,1187,1188],{},"print(all_splits[:3])\n",[235,1190,1191],{"class":237,"line":704},[235,1192,273],{"emptyLinePlaceholder":272},[235,1194,1195],{"class":237,"line":863},[235,1196,396],{},[235,1198,1199],{"class":237,"line":869},[235,1200,401],{},[235,1202,1203],{"class":237,"line":875},[235,1204,273],{"emptyLinePlaceholder":272},[235,1206,1207],{"class":237,"line":880},[235,1208,410],{},[235,1210,1211],{"class":237,"line":886},[235,1212,273],{"emptyLinePlaceholder":272},[235,1214,1216],{"class":237,"line":1215},27,[235,1217,427],{},[235,1219,1221],{"class":237,"line":1220},28,[235,1222,432],{},[235,1224,1226],{"class":237,"line":1225},29,[235,1227,273],{"emptyLinePlaceholder":272},[235,1229,1231],{"class":237,"line":1230},30,[235,1232,1233],{},"# 创建一个查询工具\n",[235,1235,1237],{"class":237,"line":1236},31,[235,1238,450],{},[235,1240,1242],{"class":237,"line":1241},32,[235,1243,273],{"emptyLinePlaceholder":272},[235,1245,1247],{"class":237,"line":1246},33,[235,1248,273],{"emptyLinePlaceholder":272},[235,1250,1252],{"class":237,"line":1251},34,[235,1253,459],{},[235,1255,1257],{"class":237,"line":1256},35,[235,1258,464],{},[235,1260,1262],{"class":237,"line":1261},36,[235,1263,469],{},[235,1265,1267],{"class":237,"line":1266},37,[235,1268,474],{},[235,1270,1272],{"class":237,"line":1271},38,[235,1273,480],{},[235,1275,1277],{"class":237,"line":1276},39,[235,1278,486],{},[235,1280,1282],{"class":237,"line":1281},40,[235,1283,492],{},[235,1285,1287],{"class":237,"line":1286},41,[235,1288,498],{},[235,1290,1292],{"class":237,"line":1291},42,[235,1293,504],{},[235,1295,1297],{"class":237,"line":1296},43,[235,1298,273],{"emptyLinePlaceholder":272},[235,1300,1302],{"class":237,"line":1301},44,[235,1303,521],{},[235,1305,1307],{"class":237,"line":1306},45,[235,1308,273],{"emptyLinePlaceholder":272},[235,1310,1312],{"class":237,"line":1311},46,[235,1313,1314],{},"# 开始构建graph\n",[235,1316,1318],{"class":237,"line":1317},47,[235,1319,539],{},[235,1321,1323],{"class":237,"line":1322},48,[235,1324,273],{"emptyLinePlaceholder":272},[235,1326,1328],{"class":237,"line":1327},49,[235,1329,548],{},[235,1331,1333],{"class":237,"line":1332},50,[235,1334,273],{"emptyLinePlaceholder":272},[235,1336,1338],{"class":237,"line":1337},51,[235,1339,565],{},[235,1341,1343],{"class":237,"line":1342},52,[235,1344,273],{"emptyLinePlaceholder":272},[235,1346,1348],{"class":237,"line":1347},53,[235,1349,574],{},[235,1351,1353],{"class":237,"line":1352},54,[235,1354,579],{},[235,1356,1358],{"class":237,"line":1357},55,[235,1359,584],{},[235,1361,1363],{"class":237,"line":1362},56,[235,1364,589],{},[235,1366,1368],{"class":237,"line":1367},57,[235,1369,273],{"emptyLinePlaceholder":272},[235,1371,1373],{"class":237,"line":1372},58,[235,1374,273],{"emptyLinePlaceholder":272},[235,1376,1378],{"class":237,"line":1377},59,[235,1379,732],{},[235,1381,1383],{"class":237,"line":1382},60,[235,1384,273],{"emptyLinePlaceholder":272},[235,1386,1388],{"class":237,"line":1387},61,[235,1389,737],{},[235,1391,1393],{"class":237,"line":1392},62,[235,1394,273],{"emptyLinePlaceholder":272},[235,1396,1398],{"class":237,"line":1397},63,[235,1399,273],{"emptyLinePlaceholder":272},[235,1401,1403],{"class":237,"line":1402},64,[235,1404,761],{},[235,1406,1408],{"class":237,"line":1407},65,[235,1409,766],{},[235,1411,1413],{"class":237,"line":1412},66,[235,1414,771],{},[235,1416,1418],{"class":237,"line":1417},67,[235,1419,776],{},[235,1421,1423],{"class":237,"line":1422},68,[235,1424,781],{},[235,1426,1428],{"class":237,"line":1427},69,[235,1429,786],{},[235,1431,1433],{"class":237,"line":1432},70,[235,1434,791],{},[235,1436,1438],{"class":237,"line":1437},71,[235,1439,796],{},[235,1441,1443],{"class":237,"line":1442},72,[235,1444,801],{},[235,1446,1448],{"class":237,"line":1447},73,[235,1449,806],{},[235,1451,1453],{"class":237,"line":1452},74,[235,1454,811],{},[235,1456,1458],{"class":237,"line":1457},75,[235,1459,816],{},[235,1461,1463],{"class":237,"line":1462},76,[235,1464,821],{},[235,1466,1468],{"class":237,"line":1467},77,[235,1469,826],{},[235,1471,1473],{"class":237,"line":1472},78,[235,1474,831],{},[235,1476,1478],{"class":237,"line":1477},79,[235,1479,498],{},[235,1481,1483],{"class":237,"line":1482},80,[235,1484,840],{},[235,1486,1488],{"class":237,"line":1487},81,[235,1489,845],{},[235,1491,1493],{"class":237,"line":1492},82,[235,1494,850],{},[235,1496,1498],{"class":237,"line":1497},83,[235,1499,855],{},[235,1501,1503],{"class":237,"line":1502},84,[235,1504,860],{},[235,1506,1508],{"class":237,"line":1507},85,[235,1509,866],{},[235,1511,1513],{"class":237,"line":1512},86,[235,1514,872],{},[235,1516,1518],{"class":237,"line":1517},87,[235,1519,273],{"emptyLinePlaceholder":272},[235,1521,1523],{"class":237,"line":1522},88,[235,1524,883],{},[235,1526,1528],{"class":237,"line":1527},89,[235,1529,889],{},[235,1531,1533],{"class":237,"line":1532},90,[235,1534,273],{"emptyLinePlaceholder":272},[235,1536,1538],{"class":237,"line":1537},91,[235,1539,273],{"emptyLinePlaceholder":272},[235,1541,1543],{"class":237,"line":1542},92,[235,1544,902],{},[235,1546,1548],{"class":237,"line":1547},93,[235,1549,907],{},[235,1551,1553],{"class":237,"line":1552},94,[235,1554,273],{"emptyLinePlaceholder":272},[235,1556,1558],{"class":237,"line":1557},95,[235,1559,916],{},[235,1561,1563],{"class":237,"line":1562},96,[235,1564,921],{},[235,1566,1568],{"class":237,"line":1567},97,[235,1569,926],{},[235,1571,1573],{"class":237,"line":1572},98,[235,1574,273],{"emptyLinePlaceholder":272},[235,1576,1578],{"class":237,"line":1577},99,[235,1579,935],{},[235,1581,1583],{"class":237,"line":1582},100,[235,1584,940],{},[235,1586,1588],{"class":237,"line":1587},101,[235,1589,945],{},[235,1591,1593],{"class":237,"line":1592},102,[235,1594,950],{},[235,1596,1598],{"class":237,"line":1597},103,[235,1599,955],{},[235,1601,1603],{"class":237,"line":1602},104,[235,1604,960],{},[235,1606,1608],{"class":237,"line":1607},105,[235,1609,965],{},[235,1611,1613],{"class":237,"line":1612},106,[235,1614,970],{},[235,1616,1618],{"class":237,"line":1617},107,[235,1619,273],{"emptyLinePlaceholder":272},[235,1621,1623],{"class":237,"line":1622},108,[235,1624,979],{},[235,1626,1628],{"class":237,"line":1627},109,[235,1629,273],{"emptyLinePlaceholder":272},[235,1631,1633],{"class":237,"line":1632},110,[235,1634,1026],{},[235,1636,1638],{"class":237,"line":1637},111,[235,1639,273],{"emptyLinePlaceholder":272},[235,1641,1643],{"class":237,"line":1642},112,[235,1644,1035],{},[235,1646,1648],{"class":237,"line":1647},113,[235,1649,1040],{},[235,1651,1653],{"class":237,"line":1652},114,[235,1654,1045],{},[235,1656,1658],{"class":237,"line":1657},115,[235,1659,1050],{},[1661,1662,1663],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":231,"searchDepth":238,"depth":269,"links":1665},[1666,1667,1668,1669,1670,1671,1672],{"id":152,"depth":269,"text":152},{"id":174,"depth":269,"text":174},{"id":282,"depth":269,"text":282},{"id":435,"depth":269,"text":435},{"id":524,"depth":269,"text":524},{"id":1003,"depth":269,"text":1003},{"id":1099,"depth":269,"text":1099},"详细介绍如何使用 Langchain 构建拥有 RAG 能力的代码问答应用，包括 DeepSeek API 集成、本地 bge-m3 嵌入模型配置、以及命令行版本实现。","md",null,{},{"title":1678,"description":1679},"【llm\u002Flangchain】langchain入门-使用langchain构建一个拥有RAG能力的代码问答应用(DeepSeek API&本地bge-m3&命令行版本)","详细介绍如何使用 Langchain 构建拥有 RAG 能力的代码问答应用，包含 DeepSeek API 集成、本地 bge-m3 嵌入模型配置、向量数据库使用、以及命令行版本完整实现，适合 Langchain RAG 学习。","u5Ez0O-bL5VtZpiIUY_A8R23nE3Dk0EkrNsaTaNxjCs",[1682,1684],{"title":67,"path":68,"stem":69,"description":1683,"children":-1},"使用 Langchain 构建命令行聊天机器人，介绍消息历史管理、LangGraph 持久化层（MemorySaver）、StateGraph 状态管理以及历史对话裁剪（trim_messages）优化方法。",{"title":75,"path":76,"stem":77,"description":1685,"children":-1},"字节跳动 Eino Go 语言 AI 应用开发框架入门教程，介绍 Message 消息结构、RoleType 角色类型、ChatModel 对话模型接口以及 Generate\u002FStream 流式调用方法。",1776616490416]