【程序员AI入门:开发】11.从零构建智能问答引擎:LangChain + RAG 实战手册
1、技术选型
组件 | 推荐方案 | 说明 |
---|---|---|
文本嵌入模型 | sentence-transformers/all-MiniLM-L6-v2 | 轻量级且效果较好的开源模型 |
向量数据库 | FAISS | 高效的本地向量检索库 |
大语言模型 | GPT-3.5/开源LLM(如ChatGLM3) | 根据资源选择云端或本地模型 |
文档处理框架 | LangChain | 简化RAG流程开发 |
2、环境准备
# 安装核心依赖
pip install langchain sentence-transformers faiss-cpu unstructured python-dotx
3、 RAG 核心流程
1、文档准备
- 在docs/目录存放知识文档(支持.txt/.md/.pdf等格式)
- 示例文档内容:
特斯拉2023年Q1交付量42.3万辆,Q2交付46.6万辆,Q3交付43.5万辆,Q4交付48.45万辆。
2、索引(Indexing)
将数据预处理并存储为向量。
3、检索生成(Retrieval & Generation):
根据查询检索相关上下文,生成回答。
4、 索引实现步骤
a. 加载文档
-
使用
TextLoader
加载文本文件:from langchain_community.document_loaders import TextLoader loader = TextLoader("introduction.txt") docs = loader.load()
b. 拆分文本
-
使用
RecursiveCharacterTextSplitter
按块拆分:from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200) splits = text_splitter.split_documents(docs)
c. 向量化与存储
-
初始化 Chroma 向量数据库,使用 OpenAI Embedding:
from langchain_chroma import Chroma from langchain_openai import OpenAIEmbeddings vectorstore = Chroma( collection_name="ai_learning", embedding_function=OpenAIEmbeddings(), persist_directory="vectordb" ) vectorstore.add_documents(splits)
5、 检索生成实现步骤
a. 构建 Retriever
-
从向量库创建检索器:
retriever = vectorstore.as_retriever(search_type="similarity")
b. 提示词模板
-
定义系统提示词,指导模型结合上下文生成答案:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder prompt = ChatPromptTemplate.from_messages([ ("system", """ You are an assistant for question-answering tasks. Use the retrieved context to answer. If unsure, say you don't know. Keep answers concise (≤3 sentences). Context: {context} """), MessagesPlaceholder(variable_name="history"), ("human", "{question}") ])
c. 组装处理链
-
将检索、上下文格式化、提示词和大模型串联:
from operator import itemgetter from langchain_core.runnables import RunnablePassthrough context = itemgetter("question") | retriever | format_docs first_step = RunnablePassthrough.assign(context=context) chain = first_step | prompt | trimmer | model # model为ChatOpenAI实例
6、 核心组件与概念
- DocumentLoader:加载文本、数据库、网页等数据源。
- TextSplitter:按语义或结构拆分文档(如代码、普通文本)。
- VectorStore:统一接口支持多种向量数据库(Chroma、Pinecone等)。
- Retriever:抽象检索逻辑,支持向量搜索、关键词匹配等。
- 提示词工程:通过模板控制生成逻辑,平衡上下文与简洁性。
7、 关键代码片段
-
格式化检索结果:
def format_docs(docs): return "\n\n".join(doc.page_content for doc in docs)
-
动态历史会话管理:
store = {} def get_session_history(session_id: str) -> BaseChatMessageHistory: if session_id not in store: store[session_id] = InMemoryChatMessageHistory() return store[session_id]
8、总结亮点
- 降本增效:Chroma 无需额外服务,本地持久化降低部署成本。
- 灵活扩展:通过替换
DocumentLoader
、VectorStore
适配不同数据源。 - 工业级实践:结合 MMR 算法优化检索多样性,控制 Token 消耗。
- 实战价值:可直接复用代码构建知识库问答、客服机器人等场景。