从零搭建大模型应用:Python、NLP 与 LangChain 项目实战
摘要
随着大语言模型(LLM)技术的快速发展,如何基于大模型快速构建实用、可落地的应用,已经成为开发者必备的核心能力。本文将以一个完整的项目案例为线索,从 Python 环境配置、NLP 基础概念、LangChain 框架核心模块,到最终实现一个可交互的智能问答系统,一步步带你从零搭建大模型应用。无论你是刚接触大模型开发的应届生,还是想快速入门 LangChain 的开发者,都能通过本文掌握从理论到实践的完整流程,为后续的项目开发和求职面试打下坚实基础。
一、项目背景与技术栈概述
1.1 项目目标
本项目将构建一个基于 LangChain 的私有知识库问答系统,用户可以上传自定义文档,系统能够基于文档内容进行智能问答,避免大模型的 “幻觉” 问题,实现精准的知识检索与回答。通过这个项目,你将掌握以下核心能力:
熟练使用 Python 进行大模型应用开发
理解 NLP 基础技术在大模型应用中的作用
掌握 LangChain 的核心组件与工作流程
实现大模型 API 调用、向量数据库存储、RAG 检索增强生成的完整链路
1.2 核心技术栈介绍
我们的项目将用到以下技术,它们也是当前大模型开发岗位的核心要求:
表格
技术 / 工具 作用 岗位匹配度
Python 项目开发语言,大模型应用开发的首选语言 ★★★★★
LangChain 大模型应用开发框架,用于构建 RAG、智能体等应用 ★★★★★
LlamaIndex 可选补充框架,优化文档索引与检索效率 ★★★★☆
OpenAI API / 开源大模型 API 提供大模型能力支持 ★★★★☆
ChromaDB / FAISS 轻量级向量数据库,存储文档向量 ★★★★☆
NLTK / spaCy NLP 基础工具,用于文本预处理 ★★★☆☆
二、环境搭建与 Python 基础准备
2.1 开发环境配置
首先,我们需要配置好 Python 开发环境,推荐使用 Python 3.9 及以上版本,确保兼容性。
创建虚拟环境
bash
运行
创建虚拟环境
python -m venv langchain-env
激活虚拟环境(Windows)
langchain-env\Scripts\activate
激活虚拟环境(Mac/Linux)
source langchain-env/bin/activate
安装核心依赖库
bash
运行
pip install langchain langchain-openai langchain-community chromadb python-dotenv pypdf nltk
langchain: LangChain 核心库
langchain-openai: 对接 OpenAI 大模型的 LangChain 组件
chromadb: 轻量级向量数据库,用于存储文档向量
pypdf: 读取 PDF 文档
nltk: NLP 基础工具包
2.2 Python 基础回顾:大模型开发必备语法
大模型开发中,Python 的以下语法是高频使用的,快速回顾一下:
环境变量管理
使用python-dotenv管理 API 密钥,避免硬编码泄露:
python
运行
from dotenv import load_dotenv
import os
load_dotenv() # 加载.env文件中的变量
openai_api_key = os.getenv(“OPENAI_API_KEY”)
异步编程基础
LangChain 中很多组件支持异步调用,简单了解 async/await:
python
运行
import asyncio
async def async_llm_call(prompt):
# 异步调用大模型的示例逻辑
return “模型返回结果”
asyncio.run(async_llm_call(“你好”))
三、NLP 基础:大模型应用背后的核心逻辑
很多开发者在学习大模型应用时,容易忽略 NLP 基础,但理解这些概念能帮你更好地排查问题、优化应用效果。
3.1 文本预处理:NLP 的第一步
在将文档输入大模型之前,我们需要对文本进行清洗和处理,常见操作包括:
文本清洗:去除特殊字符、多余空格、换行符等
python
运行
import re
def clean_text(text):
# 去除特殊字符
text = re.sub(r’[^\w\s]‘, ‘’, text)
# 去除多余空格
text = re.sub(r’\s+', ’ ', text).strip()
return text
分词与分句:将长文本拆分成适合处理的单元
python
运行
import nltk
nltk.download(‘punkt’)
from nltk.tokenize import sent_tokenize, word_tokenize
text = “大模型应用开发需要Python和LangChain。这是一个重要的技术方向。”
sentences = sent_tokenize(text) # 分句
words = word_tokenize(text) # 分词
print(“分句结果:”, sentences)
print(“分词结果:”, words)
文本分块(Chunking):为了适配大模型的上下文窗口限制,将长文档拆分成小块,这是 RAG 应用的关键步骤。LangChain 中提供了多种分块器,我们后续会用到。
3.2 词向量与嵌入模型:让机器理解文本
大模型无法直接理解文本,需要将文本转化为向量形式,这个过程就是文本嵌入(Embedding)。
什么是文本嵌入?
文本嵌入是将文本映射到高维向量空间的过程,语义相似的文本会被映射到相近的向量位置。例如,“LangChain 是大模型开发框架” 和 “LangChain 用于构建大模型应用” 这两句话,会被嵌入为相似度很高的向量。
LangChain 中的嵌入模型使用
我们可以使用 OpenAI 的嵌入模型,也可以使用开源的本地嵌入模型:
python
运行
from langchain_openai import OpenAIEmbeddings
初始化OpenAI嵌入模型
embeddings = OpenAIEmbeddings(model=“text-embedding-ada-002”, api_key=openai_api_key)
将文本转换为向量
text = “LangChain是大模型应用开发框架”
vector = embeddings.embed_query(text)
print(f"向量维度:{len(vector)}")
四、LangChain 框架核心模块详解
LangChain 的核心是通过模块化的组件,将大模型、提示词、数据存储、工具调用等能力组合起来,构建复杂的应用。我们按核心模块逐一讲解:
4.1 大模型封装(LLM Wrappers)
LangChain 提供了统一的接口,支持对接不同的大模型,包括 OpenAI GPT、Anthropic Claude、国内开源模型等。
OpenAI 模型调用示例
python
运行
from langchain_openai import ChatOpenAI
初始化ChatOpenAI模型
llm = ChatOpenAI(
model=“gpt-3.5-turbo”,
temperature=0.7, # 控制生成文本的随机性,0-1之间,值越大越随机
api_key=openai_api_key
)
调用模型生成回答
response = llm.invoke(“什么是LangChain?”)
print(“模型回答:”, response.content)
温度(Temperature)参数说明
temperature=0:模型会生成最确定、最保守的回答,适合问答、知识类场景
temperature=1:模型会生成更具创造性、多样性的回答,适合文案创作、头脑风暴场景
4.2 提示词模板(Prompt Templates)
提示词是大模型应用的核心,好的提示词能让模型输出更符合预期的结果。LangChain 的PromptTemplate可以帮助我们标准化、复用提示词。
基础提示词模板
python
运行
from langchain_core.prompts import PromptTemplate
定义提示词模板
prompt = PromptTemplate(
input_variables=[“question”],
template=“你是一个技术专家,请用通俗易懂的语言回答用户的问题:{question}”
)
生成提示词
formatted_prompt = prompt.format(question=“什么是RAG技术?”)
print(“生成的提示词:”, formatted_prompt)
结合模型调用
response = llm.invoke(formatted_prompt)
print(“模型回答:”, response.content)
Few-Shot 提示词模板
对于需要示例引导的场景,可以使用 Few-Shot 模板:
python
运行
from langchain_core.prompts import FewShotPromptTemplate
定义示例
examples = [
{“question”: “LangChain是什么?”, “answer”: “LangChain是一个用于构建大模型应用的开发框架。”},
{“question”: “RAG是什么?”, “answer”: “RAG是检索增强生成技术,用于让大模型基于外部知识回答问题。”}
]
example_prompt = PromptTemplate(
input_variables=[“question”, “answer”],
template=“用户问题:{question}\n模型回答:{answer}”
)
few_shot_prompt = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
suffix=“用户问题:{question}\n模型回答:”,
input_variables=[“question”]
)
formatted_prompt = few_shot_prompt.format(question=“什么是文本嵌入?”)
print(“Few-Shot提示词:”, formatted_prompt)
4.3 文档加载器(Document Loaders)
LangChain 支持加载多种格式的文档,包括 PDF、Word、TXT、网页、数据库等,我们的项目需要加载 PDF 文档,使用PyPDFLoader:
python
运行
from langchain_community.document_loaders import PyPDFLoader
加载PDF文档
loader = PyPDFLoader(“knowledge_base.pdf”) # 替换为你的PDF文件路径
documents = loader.load()
print(f"加载的文档页数:{len(documents)}“)
print(f"第一页文档内容:{documents[0].page_content[:100]}…”) # 打印前100个字符
4.4 文本分块器(Text Splitters)
加载完文档后,我们需要将长文档拆分成小块,方便后续嵌入和检索。LangChain 提供了多种分块器,最常用的是RecursiveCharacterTextSplitter:
python
运行
from langchain_text_splitters import RecursiveCharacterTextSplitter
初始化文本分块器
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # 每个块的最大字符数
chunk_overlap=200, # 块之间的重叠字符数,避免上下文断裂
length_function=len,
add_start_index=True,
)
对文档进行分块
splits = text_splitter.split_documents(documents)
print(f"分块后的文档数量:{len(splits)}“)
print(f"第一个分块内容:{splits[0].page_content[:100]}…”)
4.5 向量数据库与检索器(Vector Stores & Retrievers)
分块后的文档需要转化为向量存储起来,后续用户提问时,我们会将问题也转化为向量,从数据库中检索出最相关的文档块,再交给大模型生成回答。
使用 ChromaDB 构建向量数据库
python
运行
from langchain_chroma import Chroma
初始化向量数据库
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory=“./chroma_db” # 数据库持久化路径
)
持久化数据库
vectorstore.persist()
print(“向量数据库构建完成”)
创建检索器
python
运行
从向量数据库创建检索器,设置检索返回前3个最相关的文档块
retriever = vectorstore.as_retriever(search_kwargs={“k”: 3})
测试检索功能
query = “什么是LangChain的核心组件?”
retrieved_docs = retriever.invoke(query)
print(f"检索到的相关文档数量:{len(retrieved_docs)}“)
print(f"第一个相关文档内容:{retrieved_docs[0].page_content[:150]}…”)
4.6 链(Chains):将组件串联起来
LangChain 的核心思想是 “链”,通过链将提示词、模型、检索器等组件组合起来,形成完整的工作流。我们将使用RetrievalQA链,构建基于检索的问答系统。
python
运行
from langchain.chains import RetrievalQA
定义RAG问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type=“stuff”, # 链类型,stuff表示将所有检索到的文档直接拼接到提示词中
retriever=retriever,
return_source_documents=True # 是否返回源文档,方便后续溯源
)
测试问答链
query = “什么是RAG技术?它有什么作用?”
result = qa_chain.invoke(query)
print(“用户问题:”, query)
print(“模型回答:”, result[“result”])
print(“源文档:”, result[“source_documents”][0].page_content[:200] + “…”)
五、项目实战:构建私有知识库问答系统
现在,我们将前面的所有模块整合起来,完成一个完整的私有知识库问答系统。
5.1 项目完整代码
python
运行
from dotenv import load_dotenv
import os
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_chroma import Chroma
from langchain.chains import RetrievalQA
from langchain_core.prompts import PromptTemplate
1. 加载环境变量
load_dotenv()
openai_api_key = os.getenv(“OPENAI_API_KEY”)
2. 初始化核心组件
大模型
llm = ChatOpenAI(
model=“gpt-3.5-turbo”,
temperature=0.3,
api_key=openai_api_key
)
嵌入模型
embeddings = OpenAIEmbeddings(model=“text-embedding-ada-002”, api_key=openai_api_key)
3. 加载并处理文档
def load_and_process_document(pdf_path):
# 加载PDF文档
loader = PyPDFLoader(pdf_path)
documents = loader.load()
# 分块处理
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
length_function=len
)
splits = text_splitter.split_documents(documents)
return splits
4. 构建向量数据库
def build_vector_db(splits, persist_dir=“./chroma_db”):
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory=persist_dir
)
vectorstore.persist()
return vectorstore
5. 自定义提示词模板
prompt_template = “”"
你是一个专业的知识库问答助手,只能基于用户提供的文档内容回答问题。
如果文档中没有相关信息,请直接回答“我无法从知识库中找到相关信息”,不要编造答案。
请用简洁明了的语言回答用户的问题。
上下文信息:{context}
用户问题:{question}
回答:
“”"
QA_PROMPT = PromptTemplate(
template=prompt_template,
input_variables=[“context”, “question”]
)
6. 构建问答链
def build_qa_chain(vectorstore):
retriever = vectorstore.as_retriever(search_kwargs={“k”: 3})
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type=“stuff”,
retriever=retriever,
chain_type_kwargs={“prompt”: QA_PROMPT},
return_source_documents=True
)
return qa_chain
7. 主函数
if name == “main”:
# 替换为你的PDF文档路径
pdf_path = “knowledge_base.pdf”
# 处理文档
splits = load_and_process_document(pdf_path)
# 构建向量数据库
vectorstore = build_vector_db(splits)
# 构建问答链
qa_chain = build_qa_chain(vectorstore)
print("私有知识库问答系统已启动,输入'退出'结束对话")
while True:
user_query = input("你:")
if user_query == "退出":
break
result = qa_chain.invoke(user_query)
print(f"助手:{result['result']}")
# 可选:打印源文档
# print(f"参考文档:{result['source_documents'][0].page_content[:150]}...")
5.2 项目运行与效果测试
准备工作:创建.env文件,写入你的 OpenAI API 密钥:
env
OPENAI_API_KEY=你的API密钥
准备测试文档:将需要构建知识库的 PDF 文档放在项目目录下,命名为knowledge_base.pdf
运行代码:执行上述 Python 脚本,即可启动问答系统。
测试效果:输入与文档内容相关的问题,模型会基于文档内容回答;输入文档中没有的问题,模型会提示无法找到相关信息,有效避免了大模型的幻觉问题。
六、项目优化与扩展:提升应用效果
完成基础项目后,我们可以从以下几个方面优化和扩展应用,让它更符合实际需求:
6.1 优化文本分块策略
针对不同类型的文档调整chunk_size和chunk_overlap:技术文档可以设置更大的chunk_size,对话类文档可以设置更小的chunk_size
使用更高级的分块器,如MarkdownTextSplitter(针对 Markdown 文档)、RecursiveJsonSplitter(针对 JSON 数据)
6.2 优化检索效果
调整检索数量k,平衡检索速度和信息完整性
使用混合检索(如关键词检索 + 向量检索),提升检索准确率
对检索到的文档块进行重排序(如使用 LangChain 的ContextualCompressionRetriever)
6.3 模型与框架扩展
对接国内开源大模型(如通义千问、文心一言、Llama 2 等),降低使用成本
引入 LlamaIndex 优化文档索引,提升大规模知识库的检索效率
加入工具调用能力,让模型可以调用计算器、搜索引擎等外部工具
6.4 部署为 Web 应用
使用 Streamlit 或 Gradio 快速搭建 Web 界面,让应用可以通过浏览器访问,更方便使用:
python
运行
简单的Streamlit界面示例
import streamlit as st
st.title(“私有知识库问答系统”)
uploaded_file = st.file_uploader(“上传你的PDF知识库文档”, type=“pdf”)
if uploaded_file is not None:
# 保存上传的文件
with open(“uploaded.pdf”, “wb”) as f:
f.write(uploaded_file.getbuffer())
# 处理文档、构建向量数据库和问答链
# …(前面的处理逻辑)
user_query = st.text_input(“请输入你的问题:”)
if user_query:
result = qa_chain.invoke(user_query)
st.write(“回答:”, result[“result”])
七、总结与求职 / 学习建议
通过本文的项目实战,你已经掌握了 Python、NLP 与 LangChain 构建大模型应用的完整流程,这个项目也是当前大模型开发岗位中非常加分的实战经历。
7.1 核心知识点回顾
Python 是大模型应用开发的基础,掌握环境管理、依赖安装和异步编程是必备能力
NLP 基础中的文本预处理、文本嵌入是大模型应用的底层逻辑
LangChain 的核心组件包括模型封装、提示词模板、文档加载器、分块器、向量数据库和链
RAG 技术是解决大模型幻觉问题的关键,也是当前企业级大模型应用的主流方案
7.2 学习与求职建议
项目优化:将本文的项目进行扩展,比如支持多文档上传、添加对话历史记录、优化检索效果,把项目打磨成可以写进简历的亮点。
技术拓展:学习 LangChain 的高级功能,如智能体(Agents)、工具调用、记忆模块等,尝试构建更复杂的应用。
原理学习:深入学习 GPT、BERT 等主流大模型的原理,理解 NLP 基础理论,提升自己的技术深度。
实践输出:将项目过程写成博客、制作成演示视频,在 CSDN、GitHub 等平台分享,既能巩固知识,也能提升求职竞争力。
八、写在最后
从零搭建大模型应用,不仅是技术能力的提升,更是对大模型应用开发流程的完整理解。随着大模型技术的不断发展,掌握这些基础能力,你就能快速跟上技术趋势,开发出更多实用、有趣的应用。希望本文能为你打开大模型应用开发的大门,后续我会分享更多关于 LangChain 高级应用、开源大模型微调的内容,欢迎持续关注。
更多推荐




所有评论(0)