news 2026/3/10 20:33:01

Day 76:【99天精通Python】AI 进阶 - LangChain 入门 - 给 AI 挂载“外脑“

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 76:【99天精通Python】AI 进阶 - LangChain 入门 - 给 AI 挂载“外脑“

Day 76:【99天精通Python】AI 进阶 - LangChain 入门 - 给 AI 挂载"外脑"

前言

欢迎来到第76天!

在昨天的课程中,我们直接调用了 OpenAI 的 API。虽然它很聪明,但它有两个致命缺点:

  1. 知识滞后:它只知道训练截止日期之前的事情(比如 GPT-3.5 截止到 2021 年)。
  2. 私有数据盲区:它不知道你公司的内部文档,也不知道你昨天写的日记。

为了解决这个问题,我们需要LangChain
LangChain 是目前最火的 LLM 开发框架。它可以把大模型(大脑)与外部数据源(书籍、PDF、数据库)连接起来,实现RAG (检索增强生成)。简单说,就是让 AI 先去翻书,翻到了再回答你。

本节内容:

  • LangChain 核心概念
  • 模型 (Model) 与 提示词模板 (PromptTemplate)
  • 链 (Chain) 的概念
  • 加载本地文档 (Loader)
  • 向量数据库与检索 (VectorStore & Retriever)
  • 实战练习:本地文档问答机器人

一、环境准备

LangChain 更新极快,建议安装最新版。

pipinstalllangchain langchain-openai chromadb pypdf

二、Model 与 Prompt

2.1 初始化模型

LangChain 封装了各种模型的接口,让我们切换模型像换衣服一样简单。

fromlangchain_openaiimportChatOpenAI# 初始化模型 (支持换成文心一言、通义千问等,只要有对应类)llm=ChatOpenAI(api_key="sk-...",base_url="...",temperature=0.7)# 直接调用# resp = llm.invoke("你是谁?")# print(resp.content)

2.2 提示词模板 (PromptTemplate)

我们不希望每次都手写 “请帮我翻译…”,我们可以定义一个模板,挖好坑填参数。

fromlangchain_core.promptsimportChatPromptTemplate# 定义模板prompt=ChatPromptTemplate.from_template("请将下面的文字翻译成{language}:{text}")# 填充参数messages=prompt.format_messages(language="法语",text="你好,世界")# print(messages)

三、链 (Chain):LangChain 的灵魂

Chain 把 Prompt、Model 和 OutputParser 串联起来。
LangChain 使用LCEL (LangChain Expression Language)语法,用|管道符连接。

fromlangchain_core.output_parsersimportStrOutputParser# 1. Promptprompt=ChatPromptTemplate.from_template("给我讲一个关于{topic}的笑话")# 2. Modelmodel=ChatOpenAI(api_key="...")# 3. Parser (把对象转为纯字符串)parser=StrOutputParser()# 4. 组装链条chain=prompt|model|parser# 5. 运行res=chain.invoke({"topic":"程序员"})print(res)

四、RAG 实战:让 AI 读懂你的 PDF

RAG 的流程是:

  1. 加载 (Load):读取 PDF/Txt 文件。
  2. 切分 (Split):把长文章切成小块(Chunk)。
  3. 嵌入 (Embed):把文字变成向量(一串数字),存入向量数据库。
  4. 检索 (Retrieve):用户提问 -> 找最相似的片段。
  5. 生成 (Generate):把片段 + 问题扔给 AI -> 生成答案。

4.1 加载与切分

fromlangchain_community.document_loadersimportPyPDFLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitter# 1. 加载 PDFloader=PyPDFLoader("my_paper.pdf")# 请准备一个 PDF 文件docs=loader.load()# 2. 切分 (每块 1000 字符,重叠 200)text_splitter=RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200)splits=text_splitter.split_documents(docs)print(f"切分成了{len(splits)}个片段")

4.2 向量化存储 (Chroma)

我们需要一个Embedding 模型来计算向量。OpenAI 提供了text-embedding-3-small

fromlangchain_openaiimportOpenAIEmbeddingsfromlangchain_community.vectorstoresimportChroma# 初始化 Embedding 模型embedding=OpenAIEmbeddings(api_key="...")# 创建向量数据库 (并在内存中存储)vectorstore=Chroma.from_documents(documents=splits,embedding=embedding)# 创建检索器 (Retriever)retriever=vectorstore.as_retriever()

4.3 构建 RAG 链

fromlangchain.chainsimportcreate_retrieval_chainfromlangchain.chains.combine_documentsimportcreate_stuff_documents_chain# 1. 定义 RAG 的 Prompt# {context} 是检索出来的文档片段,{input} 是用户问题rag_prompt=ChatPromptTemplate.from_template(""" 基于以下上下文回答问题: <context> {context} </context> 问题:{input} """)# 2. 文档处理链 (把检索到的文档塞进 Prompt)document_chain=create_stuff_documents_chain(llm,rag_prompt)# 3. 最终检索链 (检索 + 生成)retrieval_chain=create_retrieval_chain(retriever,document_chain)# 4. 提问response=retrieval_chain.invoke({"input":"这篇文章的主要结论是什么?"})print(response["answer"])

五、持久化向量数据库

上面的代码每次运行都要重新读取 PDF 和计算向量(费钱又费时)。我们可以把向量数据库保存到硬盘。

# 保存到 ./db 目录vectorstore=Chroma.from_documents(documents=splits,embedding=embedding,persist_directory="./chroma_db")# 下次直接加载vectorstore=Chroma(persist_directory="./chroma_db",embedding=embedding)

六、常见问题

Q1:Embedding 是什么?

Embedding 是把文字变成向量(数字列表)。意思相近的词,在向量空间距离更近(如"猫"和"狗"近,和"桌子"远)。这是 RAG 检索的核心原理。

Q2:中文支持怎么样?

OpenAI 的 Embedding 对中文支持不错。如果要用国产的,可以替换为 HuggingFace 或 智谱AI 的 Embedding 类。

Q3:Token 限制?

RAG 的好处就是不需要把整本书发给 AI,只发相关的几段,大大节省了 Token。


七、小结

RAG 流程

Document (文档)

Splitter (切分)

Embedding (向量化)

VectorStore (向量库)

User Question

Retriever (检索)

Prompt (问题+上下文)

LLM (生成)

Answer

关键要点

  1. LangChain是胶水,把 LLM 和各种工具粘在一起。
  2. LCEL(|) 语法让代码链条清晰可见。
  3. RAG是目前企业应用 LLM 最主流的模式。

八、课后作业

  1. 多文档问答:修改代码,支持读取一个文件夹下所有的.txt.pdf文件,构建一个更强大的知识库。
  2. 历史记忆:查阅create_history_aware_retriever,给 RAG 加上对话历史记忆功能,让它能理解"第二个结论是什么"这种指代性问题。
  3. 换模型:尝试接入国内大模型(如文心、通义),通常只需要更换ChatOpenAI为对应的类(需安装对应 SDK)。

下节预告

Day 77:计算机视觉 (OpenCV) 基础- 文字处理腻了?明天我们玩点视觉的。教你用 Python 控制摄像头,识别人脸!


系列导航

  • 上一篇:Day 75 - AI应用OpenAI
  • 下一篇:Day 77 - 计算机视觉OpenCV(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/9 8:26:56

DeepSeek-R1-Distill-Qwen-1.5B教育应用案例:自动批改作业系统

DeepSeek-R1-Distill-Qwen-1.5B教育应用案例&#xff1a;自动批改作业系统 1. 引言 随着人工智能技术在教育领域的深入渗透&#xff0c;自动化教学辅助系统正逐步成为提升教学效率的重要工具。其中&#xff0c;大语言模型&#xff08;LLM&#xff09; 在自然语言理解、逻辑推…

作者头像 李华
网站建设 2026/2/26 12:43:44

PCB布线在工控设备中的布局原则:全面讲解

工控设备PCB布线实战指南&#xff1a;从“连通就行”到“稳定十年”的跨越在工控领域&#xff0c;你有没有遇到过这样的场景&#xff1f;一台PLC在现场运行时&#xff0c;电机一启动&#xff0c;ADC采样值就跳变&#xff1b;某通信模块偶尔丢包&#xff0c;重启后又恢复正常&am…

作者头像 李华
网站建设 2026/3/4 0:45:39

FunASR语音识别性能测试:不同网络环境下的表现

FunASR语音识别性能测试&#xff1a;不同网络环境下的表现 1. 引言 随着语音识别技术在智能客服、会议记录、教育辅助等场景中的广泛应用&#xff0c;系统在真实网络环境下的稳定性与响应能力成为影响用户体验的关键因素。FunASR 是一个开源的语音识别工具包&#xff0c;支持…

作者头像 李华
网站建设 2026/3/4 17:24:48

OpenCore Legacy Patcher完整教程:让老款Mac重获新生的终极指南

OpenCore Legacy Patcher完整教程&#xff1a;让老款Mac重获新生的终极指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为你的老款Mac无法升级到最新macOS而苦恼吗…

作者头像 李华
网站建设 2026/2/27 7:32:33

Paperless-ngx开发环境极速配置指南

Paperless-ngx开发环境极速配置指南 【免费下载链接】paperless-ngx A community-supported supercharged version of paperless: scan, index and archive all your physical documents 项目地址: https://gitcode.com/GitHub_Trending/pa/paperless-ngx 还在为开源项目…

作者头像 李华