尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

第一阶段:跑通 Python + Prompt + LangChain + Chroma 本地文档问答机器人

第一阶段:跑通 Python + Prompt + LangChain + Chroma 本地文档问答机器人 1. 阶段目标先跑通再优化很多人在学大模型应用开发时容易陷入“把每个组件都学透再动手”的误区结果迟迟写不出一个能用的 Demo。本阶段的思路相反先跑通一个最小闭环。你只需要掌握必要的 Python 基础、理解 Prompt 工程的核心思想然后用 LangChain 快速搭建配合 Chroma 向量数据库实现一个“本地文档问答机器人”。完成这个阶段后你会拥有一个可以运行的项目把一个 txt 文档丢进去就能针对文档内容提问并从文档中找到答案。2. 需要的 Python 基础目标不是系统学 Python而是具备“能看懂、会运行”的基础能力。建议提前掌握以下内容变量与基础数据类型str、int、list、dict函数定义与调用模块导入与if __name__ __main__使用pip安装第三方包创建和使用虚拟环境一个最简示例defgreet(name:str)-str:returnf你好{name}if__name____main__:print(greet(大模型学习者))如果你已经能看懂上面这段代码就可以继续往下走。2.1 创建项目虚拟环境在项目目录下执行python-mvenv venv# macOS / Linuxsourcevenv/bin/activate# Windowsvenv\Scripts\activate激活后安装后续需要的包pipinstalllangchain langchain-openai langchain-chroma tiktoken3. Prompt 工程让模型听懂你的话Prompt 工程不是玄学它是在不改变模型参数的情况下通过设计输入文本来控制模型输出的方法。对“本地文档问答机器人”来说Prompt 决定了模型是否只依据你的文档回答、是否避免编造、回答格式是否稳定。3.1 先看一个反面例子如果直接问文档讲了什么模型当然可以回答但它可能会自由发挥甚至忽略你提供的上下文。3.2 改进后的 Prompt你是一个知识库问答助手。请仅根据以下上下文回答问题不要使用外部知识 上下文 {context} 问题{question} 回答这个 Prompt 包含三个关键点角色设定明确助手只是一个知识库问答角色上下文约束把检索到的文档片段放入{context}输出边界要求“仅根据以下上下文”降低幻觉概率在 LangChain 中我们会把这个模板与检索器、LLM 组合成链实现自动填充{context}和{question}。4. LangChain 快速搭建核心概念与最小 DemoLangChain 提供了一套标准化的组件让“加载文档、切分、向量化、检索、生成”可以像搭积木一样串联起来。4.1 核心组件LLM真正生成答案的大模型例如 OpenAI 的gpt-3.5-turboDocument表示一段文本的通用容器TextSplitter把长文档切成小块便于检索Embeddings把文本转换成向量VectorStore存储向量并支持相似度检索Chroma 就是其中一种Retriever根据问题从向量库中找回最相关的文档片段Chain / LCEL把上述组件串联成可执行链路4.2 最小调用示例先单独验证 LLM 是否可用fromlangchain_openaiimportChatOpenAIfromlangchain_core.promptsimportChatPromptTemplate llmChatOpenAI(modelgpt-3.5-turbo,temperature0)promptChatPromptTemplate.from_messages([(system,你是一个严谨的技术助手),(human,{question})])chainprompt|llm responsechain.invoke({question:什么是 Chroma})print(response.content)运行前需要设置环境变量OPENAI_API_KEY。如果返回了正常回答说明 LangChain 与 OpenAI 已经打通。5. 用 Chroma 做最简单的本地文档问答机器人现在把所有内容串起来。整体流程如下本地 txt 文档读取并创建 DocumentRecursiveCharacterTextSplitter 切分OpenAIEmbeddings 向量化存入 Chroma 向量库Retriever 检索相似片段PromptTemplate 组装上下文ChatOpenAI 生成答案5.1 项目结构my-qa-bot/ ├── knowledge.txt ├── qa.py └── chroma_db/ # 运行后自动生成存放向量索引准备一个knowledge.txt随便放几段中文资料例如产品说明、教程笔记等。5.2 完整代码把下面的代码保存为qa.pyimportosfromlangchain_core.documentsimportDocumentfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_openaiimportOpenAIEmbeddings,ChatOpenAIfromlangchain_chromaimportChromafromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnablePassthroughfromlangchain_core.output_parsersimportStrOutputParser# 替换成你的 OpenAI API Key或提前在环境变量中设置os.environ[OPENAI_API_KEY]你的 OpenAI API Key# 1. 读取本地 txt 文档包装成 Document 对象withopen(knowledge.txt,encodingutf-8)asf:contentf.read()docs[Document(page_contentcontent)]# 2. 切分文本每块 500 字符相邻块重叠 50 字符splitterRecursiveCharacterTextSplitter(chunk_size500,chunk_overlap50,separators[\n\n,\n,。,,,, ,])chunkssplitter.split_documents(docs)# 3. 向量化并持久化到本地 ChromavectorstoreChroma.from_documents(documentschunks,embeddingOpenAIEmbeddings(),persist_directory./chroma_db)# 4. 创建检索器每次问题取最相关的 3 个片段retrievervectorstore.as_retriever(search_kwargs{k:3})# 5. 设计 Prompt要求只依据上下文回答promptChatPromptTemplate.from_template(你是一个知识库问答助手。请仅根据以下上下文回答问题不要使用外部知识\n\n上下文\n{context}\n\n问题{question}\n回答)llmChatOpenAI(modelgpt-3.5-turbo,temperature0)defformat_docs(docs):把检索到的多个片段拼接成完整上下文return\n\n.join(doc.page_contentfordocindocs)# 6. 使用 LCEL 构建完整问答链qa_chain({context:retriever|format_docs,question:RunnablePassthrough()}|prompt|llm|StrOutputParser())# 测试一个问题question这份文档主要讲了什么answerqa_chain.invoke(question)print(answer)5.3 运行测试在终端执行python qa.py第一次运行会调用 OpenAI Embedding API 生成向量并写入本地chroma_db目录。第二次运行可以复用向量库不会重复计算。如果一切正常终端会输出针对knowledge.txt内容的答案。你可以继续在代码里修改question或写一个简单的while True循环实现交互式提问whileTrue:qinput(\n请输入问题输入 exit 退出)ifq.lower()exit:breakprint(qa_chain.invoke(q))5.4 常见问题没有 OpenAI API Key可以把OpenAIEmbeddings替换为HuggingFaceEmbeddings把ChatOpenAI替换为本地模型如通过 Ollama 接入。先跑通流程后再切换本地方案性价比更高。切分效果不好尝试调整chunk_size和chunk_overlap一般在 300–800 之间比较合适。回答出现编造在 Prompt 中加强约束比如加入“如果上下文没有相关信息请直接回答‘我不知道’”。6. 总结与下一步完成本阶段你已经跑通了“本地文档问答机器人”的最小闭环从 Python 环境到 Prompt 设计再到 LangChain Chroma 的完整链路。下一步可以往这些方向优化支持 PDF、Word 等更多文档格式加入对话历史实现多轮问答替换为本地 Embedding 和本地 LLM完全离线运行用 FastAPI 把它封装成 Web 服务供前端调用先跑通再迭代这是学习应用开发最快的方式。
返回列表