2026/4/17 0:42:43
网站建设
项目流程
四川门户网站建设,可信赖的购物网站建设,全能网站服务器,ie浏览器网址入口Day 76#xff1a;【99天精通Python】AI 进阶 - LangChain 入门 - 给 AI 挂载外脑
前言
欢迎来到第76天#xff01;
在昨天的课程中#xff0c;我们直接调用了 OpenAI 的 API。虽然它很聪明#xff0c;但它有两个致命缺点#xff1a;
知识滞后#xff1a;它只…Day 76【99天精通Python】AI 进阶 - LangChain 入门 - 给 AI 挂载外脑前言欢迎来到第76天在昨天的课程中我们直接调用了 OpenAI 的 API。虽然它很聪明但它有两个致命缺点知识滞后它只知道训练截止日期之前的事情比如 GPT-3.5 截止到 2021 年。私有数据盲区它不知道你公司的内部文档也不知道你昨天写的日记。为了解决这个问题我们需要LangChain。LangChain 是目前最火的 LLM 开发框架。它可以把大模型大脑与外部数据源书籍、PDF、数据库连接起来实现RAG (检索增强生成)。简单说就是让 AI 先去翻书翻到了再回答你。本节内容LangChain 核心概念模型 (Model) 与 提示词模板 (PromptTemplate)链 (Chain) 的概念加载本地文档 (Loader)向量数据库与检索 (VectorStore Retriever)实战练习本地文档问答机器人一、环境准备LangChain 更新极快建议安装最新版。pipinstalllangchain langchain-openai chromadb pypdf二、Model 与 Prompt2.1 初始化模型LangChain 封装了各种模型的接口让我们切换模型像换衣服一样简单。fromlangchain_openaiimportChatOpenAI# 初始化模型 (支持换成文心一言、通义千问等只要有对应类)llmChatOpenAI(api_keysk-...,base_url...,temperature0.7)# 直接调用# resp llm.invoke(你是谁)# print(resp.content)2.2 提示词模板 (PromptTemplate)我们不希望每次都手写 “请帮我翻译…”我们可以定义一个模板挖好坑填参数。fromlangchain_core.promptsimportChatPromptTemplate# 定义模板promptChatPromptTemplate.from_template(请将下面的文字翻译成{language}{text})# 填充参数messagesprompt.format_messages(language法语,text你好世界)# print(messages)三、链 (Chain)LangChain 的灵魂Chain 把 Prompt、Model 和 OutputParser 串联起来。LangChain 使用LCEL (LangChain Expression Language)语法用|管道符连接。fromlangchain_core.output_parsersimportStrOutputParser# 1. PromptpromptChatPromptTemplate.from_template(给我讲一个关于{topic}的笑话)# 2. ModelmodelChatOpenAI(api_key...)# 3. Parser (把对象转为纯字符串)parserStrOutputParser()# 4. 组装链条chainprompt|model|parser# 5. 运行reschain.invoke({topic:程序员})print(res)四、RAG 实战让 AI 读懂你的 PDFRAG 的流程是加载 (Load)读取 PDF/Txt 文件。切分 (Split)把长文章切成小块Chunk。嵌入 (Embed)把文字变成向量一串数字存入向量数据库。检索 (Retrieve)用户提问 - 找最相似的片段。生成 (Generate)把片段 问题扔给 AI - 生成答案。4.1 加载与切分fromlangchain_community.document_loadersimportPyPDFLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitter# 1. 加载 PDFloaderPyPDFLoader(my_paper.pdf)# 请准备一个 PDF 文件docsloader.load()# 2. 切分 (每块 1000 字符重叠 200)text_splitterRecursiveCharacterTextSplitter(chunk_size1000,chunk_overlap200)splitstext_splitter.split_documents(docs)print(f切分成了{len(splits)}个片段)4.2 向量化存储 (Chroma)我们需要一个Embedding 模型来计算向量。OpenAI 提供了text-embedding-3-small。fromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChroma# 初始化 Embedding 模型embeddingOpenAIEmbeddings(api_key...)# 创建向量数据库 (并在内存中存储)vectorstoreChroma.from_documents(documentssplits,embeddingembedding)# 创建检索器 (Retriever)retrievervectorstore.as_retriever()4.3 构建 RAG 链fromlangchain.chainsimportcreate_retrieval_chainfromlangchain.chains.combine_documentsimportcreate_stuff_documents_chain# 1. 定义 RAG 的 Prompt# {context} 是检索出来的文档片段{input} 是用户问题rag_promptChatPromptTemplate.from_template( 基于以下上下文回答问题 context {context} /context 问题{input} )# 2. 文档处理链 (把检索到的文档塞进 Prompt)document_chaincreate_stuff_documents_chain(llm,rag_prompt)# 3. 最终检索链 (检索 生成)retrieval_chaincreate_retrieval_chain(retriever,document_chain)# 4. 提问responseretrieval_chain.invoke({input:这篇文章的主要结论是什么})print(response[answer])五、持久化向量数据库上面的代码每次运行都要重新读取 PDF 和计算向量费钱又费时。我们可以把向量数据库保存到硬盘。# 保存到 ./db 目录vectorstoreChroma.from_documents(documentssplits,embeddingembedding,persist_directory./chroma_db)# 下次直接加载vectorstoreChroma(persist_directory./chroma_db,embeddingembedding)六、常见问题Q1Embedding 是什么Embedding 是把文字变成向量数字列表。意思相近的词在向量空间距离更近如猫和狗近和桌子远。这是 RAG 检索的核心原理。Q2中文支持怎么样OpenAI 的 Embedding 对中文支持不错。如果要用国产的可以替换为 HuggingFace 或 智谱AI 的 Embedding 类。Q3Token 限制RAG 的好处就是不需要把整本书发给 AI只发相关的几段大大节省了 Token。七、小结RAG 流程Document (文档)Splitter (切分)Embedding (向量化)VectorStore (向量库)User QuestionRetriever (检索)Prompt (问题上下文)LLM (生成)Answer关键要点LangChain是胶水把 LLM 和各种工具粘在一起。LCEL(|) 语法让代码链条清晰可见。RAG是目前企业应用 LLM 最主流的模式。八、课后作业多文档问答修改代码支持读取一个文件夹下所有的.txt和.pdf文件构建一个更强大的知识库。历史记忆查阅create_history_aware_retriever给 RAG 加上对话历史记忆功能让它能理解第二个结论是什么这种指代性问题。换模型尝试接入国内大模型如文心、通义通常只需要更换ChatOpenAI为对应的类需安装对应 SDK。下节预告Day 77计算机视觉 (OpenCV) 基础- 文字处理腻了明天我们玩点视觉的。教你用 Python 控制摄像头识别人脸系列导航上一篇Day 75 - AI应用OpenAI下一篇Day 77 - 计算机视觉OpenCV待更新