LLM Notebooks:从零构建RAG问答系统的实践指南

news2026/5/17 10:24:22
1. 项目概述一个面向大语言模型实践的“笔记本”仓库最近在GitHub上闲逛发现了一个挺有意思的仓库叫qianniuspace/llm_notebooks。光看名字llm_notebooks大语言模型笔记本这指向性就非常明确了。这大概率不是一个完整的、端到端的应用项目而更像是一个个人或小团队用于记录、实验和分享大语言模型相关代码片段的集合地也就是我们常说的“代码笔记本”或“实验记录本”。这类仓库的价值往往不在于它构建了一个多么宏伟的系统而在于它聚焦于解决具体、微小但高频的问题。对于刚接触大语言模型LLM的开发者或者想快速验证某个想法、复现某个流程的老手来说一个组织良好、可直接运行的代码片段其价值可能远超一篇冗长的论文或一份抽象的API文档。llm_notebooks这个名字本身就暗示了它的定位实用、片段化、可交互、侧重于“动手做”。它可能包含了从环境搭建、基础API调用到提示工程、RAG检索增强生成实现再到模型微调、评估评测等一系列主题的Jupyter Notebook文件。对于我这样常年在一线折腾各种AI项目的从业者来说看到这类仓库会感到格外亲切。它不像那些大厂开源的、结构复杂、依赖繁重的框架需要你先花半天时间理解架构。它更像是同行工作台上一本摊开的笔记上面记录着解决某个具体bug的咒语prompt或者连接两个不同工具的小脚本。接下来我就带大家深入拆解一下像llanotebooks这样的项目其核心价值在哪里我们应该如何高效地利用它以及如何从中汲取养分构建自己的知识体系。2. 核心价值与内容结构猜想虽然我们无法直接看到qianniuspace/llm_notebooks仓库内的具体文件但基于命名惯例和社区常见模式我们可以对其内容结构和核心价值进行合理的推演。一个优秀的LLM Notebooks仓库其价值绝不仅仅是代码的堆砌。2.1 核心价值从“知道”到“做到”的桥梁大语言模型领域知识更新极快论文、博客、新闻层出不穷。但很多知识停留在理论描述层面比如“你可以使用思维链Chain-of-Thought提示来提升复杂推理任务的性能”。这句话没错但一个新手看到后问题马上就来了具体怎么写这个提示词代码长什么样在不同的模型GPT-4, Claude, 开源模型上表现差异大吗一个高质量的llm_notebooks正是为了填补这个鸿沟。它的首要价值是“可复现性”和“可操作性”。它提供的不是描述而是可以直接在Jupyter Notebook中点击“运行”的代码块。你不仅能看到结果还能修改参数、调整提示词、更换模型立即观察到变化。这种即时反馈的学习方式效率远高于单纯阅读。其次它的价值在于“场景化”和“碎片化”。它可能不会教你如何从头训练一个千亿参数模型那是另一个维度的项目但它会教你如何用几行代码调用OpenAI API完成一个客服问答如何用LangChain搭建一个基于本地知识库的智能助手如何对一段文本进行情感分析和实体识别。每一个Notebook都瞄准一个具体的、微小的场景解决一个具体的问题。这非常适合时间碎片化的开发者进行针对性学习。最后这类仓库常常包含了作者在“踩坑”过程中积累的宝贵经验。比如某个模型对提示词的格式特别敏感某个API的速率限制需要特殊处理某个向量数据库的客户端有版本兼容性问题。这些在官方文档中可能一笔带过但在实际开发中却能卡住你几个小时的问题其解决方案往往就藏在Notebook的注释或某个不起眼的配置行里。2.2 内容结构猜想一个模块化的学习路径一个组织良好的llm_notebooks仓库其目录结构本身就能反映一条清晰的学习或参考路径。以下是一种非常可能且合理的结构llm_notebooks/ ├── 01_environment_setup/ │ ├── 01_python_environment.ipynb # 使用conda/venv创建隔离环境 │ └── 02_install_dependencies.ipynb # 安装PyTorch, Transformers, LangChain等核心库 ├── 02_basic_api_usage/ │ ├── 01_openai_api_chat_completion.ipynb # 调用OpenAI ChatCompletion API │ ├── 02_anthropic_claude_api.ipynb # 调用Claude API │ └── 03_local_llm_with_ollama.ipynb # 使用Ollama在本地运行开源模型 ├── 03_prompt_engineering/ │ ├── 01_zero_few_shot_prompting.ipynb # 零样本、少样本提示 │ ├── 02_chain_of_thought.ipynb # 思维链提示实战 │ └── 03_react_framework.ipynb # ReAct推理行动框架示例 ├── 04_rag_implementation/ │ ├── 01_document_loader_splitter.ipynb # 文档加载与文本分割 │ ├── 02_embeddings_vectorstore.ipynb # 文本向量化与向量数据库存储Chroma, FAISS │ └── 03_retrieval_qa_chain.ipynb # 构建检索问答链LangChain ├── 05_fine_tuning/ │ ├── 01_lora_finetune_llama2.ipynb # 使用LoRA微调Llama 2 │ └── 02_qlora_finetune_with_axolotl.ipynb # 使用QLoRA和Axolotl工具微调 ├── 06_evaluation/ │ └── 01_ragas_evaluation.ipynb # 使用RAGAS评估RAG系统质量 └── 07_applications/ ├── 01_simple_chatbot.ipynb # 简易命令行聊天机器人 └── 02_web_search_agent.ipynb # 集成网络搜索的智能体注意以上结构仅为基于最佳实践的猜想。实际仓库可能更偏向作者的特定兴趣领域例如全部聚焦于RAG或全部是关于特定开源模型如Qwen, DeepSeek的实践。但模块化的思想是共通的从基础到进阶从通用到专项。2.3 目标用户与适用场景那么谁最适合使用这样的仓库呢LLM入门开发者对于刚刚了解LLM概念想快速上手写代码的人这是一个绝佳的起点。按照目录顺序学习可以避免“从哪开始”的迷茫。有经验的开发者需要快速验证当你需要实现一个RAG功能但不想从头查阅LangChain文档时直接找到04_rag_implementation下的Notebook复制核心代码片段并修改能极大提升开发效率。研究者或学生用于快速复现论文中的方法或者作为课程实验的参考代码。Notebook的交互特性非常适合进行教学和演示。技术布道师或内容创作者仓库中的代码可以作为技术分享、博客文章或视频教程的现成素材确保演示的准确性和流畅性。它的适用场景包括个人学习与实验、团队内部知识沉淀、技术方案快速原型验证、以及作为复杂项目前期的技术可行性调研工具。3. 深度解析一个高质量LLM Notebook应包含的要素一个随手记录的代码片段和一个高质量的、可供他人学习的Notebook有着天壤之别。结合我多年编写和阅读这类材料的经验我认为一个优秀的LLM Notebook至少应该包含以下几个层次的内容3.1 清晰的目标与问题定义Notebook的开头必须用一两句话清晰说明“这个Notebook要解决什么问题”。例如“本Notebook演示如何使用LangChain和ChromaDB为本地PDF文档构建一个简单的问答系统。” 这能让读者在5秒内判断这个Notebook是否与自己的需求相关。紧接着应该列出“学习本Notebook后你将能够”这样的目标清单。例如学会使用PyPDFLoader加载PDF文档。掌握使用RecursiveCharacterTextSplitter进行文本分割。了解如何用OpenAIEmbeddings生成向量并存入ChromaDB。构建一个基于RetrievalQA链的问答系统。3.2 完备的环境依赖与配置说明这是实践环节的基石却最容易被忽视。一个负责任的Notebook会在开头部分明确列出所有依赖。# 环境依赖说明 # Python 3.9 # 安装命令 # pip install langchain langchain-community chromadb pypdf openai tiktoken更重要的是它应该指出关键的版本信息。LLM生态库更新频繁API变动可能很大。例如注意本Notebook基于LangChain 0.1.0版本编写。LangChain的API在0.0.x到0.1.x之间有重大变化如果你使用的是旧版本部分导入语句如from langchain.llms import OpenAI可能需要修改为from langchain_community.llms import OpenAI。对于需要API密钥的服务如OpenAI, Anthropic应明确说明如何安全地配置并指向官方文档而不是在代码中硬编码。# 正确做法从环境变量读取 import os from langchain_openai import ChatOpenAI os.environ[OPENAI_API_KEY] your-api-key-here # 实际使用时建议通过.env文件或命令行注入 llm ChatOpenAI(modelgpt-3.5-turbo)3.3 循序渐进的代码讲解与输出展示代码不应是“黑盒”。好的Notebook会像导游一样带领读者一步步前行。分步执行即时反馈每个逻辑独立的步骤都应该放在一个独立的代码单元格中。执行一个单元格立刻在下方展示输出如打印的日志、返回的数据结构。这让读者能清晰地看到每一步操作产生了什么结果。丰富的注释与解释注释不应只是重复代码如# 加载文档而应解释“为什么这么做”和“需要注意什么”。# 使用递归字符分割器它能较好地保持语义段落完整性。 # chunk_size500 表示目标块大小但实际会根据标点、换行进行微调。 # chunk_overlap50 设置块间重叠防止答案被割裂在两个块中。 text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap50, length_functionlen, separators[\n\n, \n, 。, , , , , , ] )可视化与中间结果检查对于数据处理流程展示中间结果至关重要。例如在文本分割后打印出前两个块的内容和长度在生成向量后展示向量的维度。这有助于调试和理解。docs text_splitter.split_documents(pages) print(f总共分割成了 {len(docs)} 个文档块。) print(第一个块的内容预览, docs[0].page_content[:200]) print(第一个块的元数据, docs[0].metadata)3.4 “踩坑”经验与进阶提示这是区分“普通代码”和“经验之谈”的关键部分通常以Markdown单元格的形式出现在关键步骤之后或Notebook末尾。常见错误与排查实操心得调用OpenAI API时如果遇到RateLimitError除了等待可以检查是否在免费额度用尽后未升级付费账户。另外对于批量处理务必使用指数退避策略进行重试tenacity库是个好帮手。性能与成本优化注意事项使用text-embedding-ada-002生成向量时注意输入令牌限制约8191个。对于长文档必须在分割阶段控制块大小。同时向量化是API调用成本的主要部分在原型阶段可以对少量数据进行测试上线前再全量处理。扩展与变体你可以尝试本例使用了ChromaDB作为向量存储。你可以很容易地替换为FAISSfrom langchain_community.vectorstores import FAISS或Pinecone等云服务。只需修改向量数据库的创建和检索代码即可。4. 核心主题实战模拟以构建一个RAG问答系统为例让我们以一个最经典的场景——使用LangChain和开源向量数据库构建一个针对本地文档的问答系统RAG——来模拟llm_notebooks中可能包含的一个高质量Notebook。我将按照上述优秀Notebook的要素来展开。4.1 项目目标与环境准备目标创建一个能够读取本地PDF报告并根据报告内容回答用户问题的智能助手。环境准备 我们创建一个新的Python环境并安装核心库。这里我强烈推荐使用uv或pdm这类现代快速的包管理器但为了通用性仍以pip示例。# 建议在项目目录下操作 python -m venv .venv source .venv/bin/activate # Windows: .venv\Scripts\activate pip install -U pip# requirements.txt 或直接在单元格中安装 # langchain-core, langchain-community 是LangChain的新模块化结构 # langchain-openai 是OpenAI的官方集成包 # chromadb 是轻量级向量数据库 # pypdf 用于解析PDF # tiktoken 用于OpenAI模型的令牌计数 # python-dotenv 用于管理环境变量 !pip install langchain-core langchain-community langchain-openai chromadb pypdf tiktoken python-dotenv重要提示LangChain处于快速发展期其包结构经常调整。截至当前langchain包是一个“全量包”但官方推荐按需安装langchain-*系列包以获得更小的依赖和更清晰的维护。如果遇到导入错误请首先检查pip list确认已安装的包名和版本。4.2 文档加载与预处理第一步是将非结构化的PDF文本变成结构化的、可处理的文档对象。import os from langchain_community.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from dotenv import load_dotenv load_dotenv() # 从 .env 文件加载环境变量 # 1. 加载文档 pdf_path ./your_document.pdf # 替换为你的PDF路径 loader PyPDFLoader(pdf_path) pages loader.load() # 此时一个Document对象列表每个对象包含一页内容和元数据 print(f成功加载PDF共 {len(pages)} 页。) print(f第一页的前100个字符{pages[0].page_content[:100]}) # 2. 文本分割 # 这是RAG系统的关键步骤分割质量直接影响检索效果。 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, # 每个块的目标字符数 chunk_overlap200, # 块与块之间的重叠字符数防止上下文断裂 length_functionlen, separators[\n\n, \n, 。, , , , , , ] # 中文友好的分隔符 ) docs text_splitter.split_documents(pages) print(f文本分割完成共得到 {len(docs)} 个文档块。) print(f示例块内容前300字符{docs[5].page_content[:300]}) print(f该块的元数据来自原PDF{docs[5].metadata})关键解析与心得chunk_size的选择没有银弹。太小则单个块信息不足可能无法包含完整答案太大则检索精度下降且可能超过LLM上下文窗口。对于通用文档500-1500是一个常见范围。你需要根据你的文档类型技术手册、小说、财报和问题类型细节查找、总结归纳进行微调。chunk_overlap的重要性重叠是为了避免一个完整的答案或概念恰好被分割在两个块的边界。例如一个问题答案的结尾在块A开头在块B没有重叠就会丢失信息。通常设置为chunk_size的10%-20%。元数据保留split_documents会自动将原文档的元数据如来源、页码继承到每个块。这在后续回答中用于引用来源至关重要。4.3 向量化与向量数据库存储将文本块转换为机器可以理解的向量嵌入并存储到专门的数据库中以供快速检索。from langchain_openai import OpenAIEmbeddings from langchain_community.vectorstores import Chroma # 初始化嵌入模型 # 确保环境变量 OPENAI_API_KEY 已设置 embeddings OpenAIEmbeddings(modeltext-embedding-3-small) # 推荐使用最新的small模型性价比高 # 将文档块向量化并存入ChromaDB # persist_directory 指定数据库持久化到磁盘的路径这样下次无需重新生成 persist_directory ./chroma_db vectordb Chroma.from_documents( documentsdocs, embeddingembeddings, persist_directorypersist_directory ) vectordb.persist() # 显式持久化 print(f向量数据库已创建并保存至 {persist_directory}。共存储了 {vectordb._collection.count()} 个向量。) # 测试检索功能给定一个查询返回最相似的块 query 这份报告的主要结论是什么 retrieved_docs vectordb.similarity_search(query, k3) # k3 表示返回最相似的3个块 print(f针对查询 {query}检索到 {len(retrieved_docs)} 个相关文档块) for i, doc in enumerate(retrieved_docs): print(f\n--- 结果 {i1} (相关性分数可计算此处略) ---) print(f内容片段{doc.page_content[:200]}...) print(f来源{doc.metadata})关键解析与心得嵌入模型的选择text-embedding-3-small是OpenAI推出的新一代嵌入模型在性能和成本上取得了很好的平衡。对于中文场景也可以考虑百度ERNIE、通义千问或开源模型如BAAI/bge-small-zh但需要集成对应的LangChain Embeddings类。向量数据库的持久化第一次运行from_documents会进行向量化计算这可能耗时且产生API调用成本。持久化后下次可以直接加载无需重复计算。# 后续加载已有数据库 vectordb Chroma(persist_directorypersist_directory, embedding_functionembeddings)检索数量kk值影响最终答案的质量和生成速度。返回太多无关块会干扰LLM返回太少可能遗漏关键信息。通常从3-5开始测试。4.4 构建问答链并测试将检索器与大语言模型组合起来形成一个完整的“提问-检索-回答”管道。from langchain_openai import ChatOpenAI from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate # 1. 定义提示模板 # 这个模板告诉LLM如何利用检索到的上下文来回答问题 prompt_template 请根据以下上下文信息来回答问题。如果你不知道答案就诚实地回答不知道不要编造信息。 上下文 {context} 问题{question} 请用中文给出答案 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 2. 初始化LLM llm ChatOpenAI(modelgpt-3.5-turbo, temperature0) # temperature0使输出更确定、更少随机性 # 3. 创建检索问答链 # chain_type 可以是 stuff将所有上下文塞进提示 map_reduce, refine等处理长上下文。 # stuff最简单直接适合上下文总长度不超过模型限制的情况。 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrievervectordb.as_retriever(search_kwargs{k: 4}), # 指定检索器并覆盖默认k值 chain_type_kwargs{prompt: PROMPT}, # 使用我们自定义的提示词 return_source_documentsTrue # 非常重要返回检索到的源文档用于验证和引用 ) # 4. 进行问答测试 questions [ 这份报告的作者是谁, 报告中提到的最关键的风险因素有哪些, 根据报告未来的建议是什么 ] for question in questions: print(f\n问题{question}) result qa_chain.invoke({query: question}) print(f答案{result[result]}) print(参考来源) for source in result[source_documents][:2]: # 展示前两个来源 print(f - 页码 {source.metadata.get(page, N/A)}: {source.page_content[:100]}...) print(- * 50)关键解析与心得提示工程Prompt Engineering自定义提示模板是提升回答质量最有效的手段之一。清晰的指令“根据上下文”、“用中文”、“不知道就说不知道”能极大减少模型的幻觉Hallucination。你可以尝试不同的模板观察回答效果的变化。chain_type的选择stuff最简单将所有检索到的上下文和问题一起送入LLM。前提是上下文总长度不能超过模型的上下文窗口。对于gpt-3.5-turbo16K或128K版本和中等数量的检索块这通常是可行的。map_reduce先对每个检索到的文档块单独生成答案map再将这些答案汇总成最终答案reduce。适合处理非常多的文档块但调用API次数多成本高。refine迭代式地完善答案适合需要深度推理的任务但速度最慢。对于大多数简单QA场景“stuff”是首选。务必计算你的k * chunk_size是否超过模型令牌限制。return_source_documentsTrue务必开启这个选项它让你能追溯答案的来源这是构建可信AI应用的基础。你可以向用户展示“这个结论是根据报告第X页的某某内容得出的”。5. 进阶话题与性能优化一个基础的RAG系统搭建完成后我们会立刻面临真实世界的挑战效果不好、速度慢、成本高。这部分内容往往是llm_notebooks这类仓库的精华所在记录了作者趟过的坑。5.1 检索效果优化超越简单相似度搜索基础的similarity_search基于余弦相似度这并不总是最优的。最大边际相关性MMR检索在保证相关性的同时增加结果多样性避免返回内容高度重复的块。from langchain.retrievers import ContextualCompressionRetriever from langchain.retrievers.document_compressors import LLMChainExtractor # 这是一个高级功能MMR可以直接在as_retriever中设置 retriever vectordb.as_retriever( search_typemmr, # 使用MMR搜索 search_kwargs{k: 6, fetch_k: 20, lambda_mult: 0.7} # fetch_k: 初始检索的文档数lambda_mult: 多样性权重1偏向相关0偏向多样 )混合搜索Hybrid Search结合稠密向量检索语义相似和稀疏检索关键词匹配如BM25。这对于包含特定名称、日期、代码等精确信息的查询特别有效。ChromaDB等数据库已支持。查询重写Query Rewriting用户的原始查询可能很模糊。可以用一个轻量级LLM先对查询进行扩展或改写再用改写后的查询去检索。from langchain.chains import LLMChain from langchain.prompts import ChatPromptTemplate rewrite_template ChatPromptTemplate.from_messages([ (system, 你是一个专业的搜索查询优化助手。请将用户的问题重写为一个更全面、更适合用于检索相关文档的查询。保持原意。), (human, {original_query}) ]) rewrite_chain LLMChain(llmChatOpenAI(temperature0.1), promptrewrite_template) better_query rewrite_chain.run(original_query昨天卖得怎么样) # better_query 可能变成 “2023年10月27日的销售业绩数据与报告”5.2 回答质量提升后处理与验证即使检索到了相关文档LLM给出的答案也可能不准确或不完整。引用验证Citation Verification检查答案中的关键陈述是否能在提供的源文档中找到明确支持。可以编写一个简单的函数将答案中的事实性名词短语与源文档进行匹配。答案重排序Re-ranking使用一个更小、更快的“重排序模型”对检索到的多个文档块进行相关性精排将最相关的放在最前面再送给LLM生成答案。这能显著提升答案质量。设置“拒答”阈值当检索到的最相关文档块与问题的相似度分数低于某个阈值时让系统直接回答“根据现有资料我无法回答这个问题”而不是强行生成一个可能错误的答案。这需要从检索器中获取相似度分数。5.3 成本与性能考量对于生产环境成本和延迟是关键。嵌入模型成本如果使用OpenAI的嵌入API向量化是主要成本之一。对策缓存对已处理的文档块其嵌入向量应永久存储避免重复计算。使用开源嵌入模型如BAAI/bge系列、intfloat/e5系列可以在本地或自有服务器上运行消除API成本。LangChain支持集成HuggingFace的模型。from langchain_community.embeddings import HuggingFaceEmbeddings embeddings HuggingFaceEmbeddings(model_nameBAAI/bge-small-zh-v1.5)LLM调用成本与延迟选择合适的模型gpt-3.5-turbo比gpt-4快且便宜得多在许多简单QA任务上已足够。优化提示词更简洁、指令更明确的提示词能减少不必要的令牌消耗。流式响应Streaming对于Web应用使用流式响应可以极大改善用户体验让用户感觉更快。异步调用如果你的应用需要并行处理多个查询使用异步客户端如openai.AsyncOpenAI可以大幅提升吞吐量。6. 工程化与部署思考Notebook里的代码是原型要变成服务还需要工程化。6.1 从Notebook到脚本首先将Notebook中的核心逻辑抽取到Python脚本中例如rag_pipeline.py。使用函数和类来组织代码增加配置管理如使用pydantic-settings管理API密钥和模型参数。# rag_pipeline.py 结构示例 import os from typing import List from langchain.schema import Document from langchain_community.vectorstores import Chroma # ... 其他导入 class RAGSystem: def __init__(self, persist_dir: str, embedding_model: str openai): self.persist_dir persist_dir self.embedding_model self._init_embeddings(embedding_model) self.vectordb None self.qa_chain None def _init_embeddings(self, model_type): # 根据配置初始化不同的嵌入模型 pass def ingest_documents(self, file_paths: List[str]): # 文档加载、分割、向量化、存储 pass def load_existing_db(self): # 加载已存在的向量数据库 pass def create_qa_chain(self, llm_model: str gpt-3.5-turbo): # 创建问答链 pass def query(self, question: str) - dict: # 执行查询并返回答案和来源 pass # 主程序入口 if __name__ __main__: system RAGSystem(persist_dir./chroma_db) if not os.path.exists(./chroma_db): system.ingest_documents([./docs/report.pdf]) else: system.load_existing_db() system.create_qa_chain() answer system.query(报告的主要发现) print(answer)6.2 构建简单的Web API使用FastAPI可以快速将你的RAG系统包装成HTTP服务。# main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel from rag_pipeline import RAGSystem # 导入上面封装的类 app FastAPI(title智能文档问答API) rag_system RAGSystem(persist_dir./chroma_db) rag_system.load_existing_db() rag_system.create_qa_chain() class QueryRequest(BaseModel): question: str class QueryResponse(BaseModel): answer: str sources: List[str] # 可以简化为来源页码列表 app.post(/query, response_modelQueryResponse) async def query_document(req: QueryRequest): try: result rag_system.query(req.question) return QueryResponse( answerresult[answer], sources[fPage {doc.metadata.get(page)} for doc in result[source_documents]] ) except Exception as e: raise HTTPException(status_code500, detailstr(e)) # 运行: uvicorn main:app --reload6.3 监控与日志在生产环境中你需要知道系统运行状况。日志记录使用logging模块记录关键事件如查询开始、检索耗时、LLM调用耗时、错误信息。性能监控跟踪平均响应时间、令牌使用量、API调用错误率。效果评估定期用一批标准问题测试系统记录答案的准确率可以用GPT-4作为裁判进行自动评估。7. 总结与个人实践建议像qianniuspace/llm_notebooks这样的仓库其生命力在于持续的更新和维护。作为使用者我们不应该仅仅满足于运行其中的代码更应该理解其背后的设计思路并将其转化为自己工作流的一部分。我的建议是首先把它当作一个“菜谱”而非“成品”。动手运行每一个你感兴趣的Notebook但务必尝试修改其中的参数换一个模型、改一下提示词、用自己的文档试试。只有亲手改动并观察结果知识才真正属于你。其次建立你自己的“笔记本”体系。在学习和项目开发过程中养成用Notebook记录的习惯。记录下成功的配置、报错的解决过程、不同模型的性能对比。久而久之这将成为你个人最宝贵的知识资产。你可以像llm_notebooks一样用GitHub仓库来管理它这既是备份也是分享。最后关注核心抽象而非特定工具。今天我们用LangChain和ChromaDB明天可能有新的框架和数据库更流行。但RAG的核心抽象——文档加载、分割、向量化、检索、生成——是相对稳定的。理解每一层的目的和可选方案比死记硬背某个库的API更重要。当新的工具出现时你就能快速判断它解决了哪个环节的什么问题并决定是否要将其纳入你的技术栈。大语言模型的应用开发目前仍是一个实践先行的领域。没有放之四海而皆准的最佳实践只有针对具体场景的不断试错和优化。llm_notebooks这类项目提供的正是前人试错后的宝贵路标。沿着这些路标出发然后勇敢地走出自己的路才是对待它们最好的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2621241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…