LangChain 实战:构建问答系统

本教程将带你从零开始,使用 LangChain 构建一个完整的问答系统(Q&A)。

## 项目概述
我们要构建一个智能问答系统,它能够:接受用户问题、从知识库中检索相关文档、使用 LLM 生成准确的回答、支持多种文档格式。

## 准备工作
“`bash
pip install langchain langchain-openai langchain-community langchain-chroma python-dotenv
“`

## 第一步:创建文档加载器
“`python
from langchain_core.documents import Document
from pathlib import Path

def load_text_files(directory: str) -> list[Document]:
documents = []
for file_path in Path(directory).rglob(“*.txt”):
with open(file_path, ‘r’, encoding=’utf-8′) as f:
content = f.read()
doc = Document(
page_content=content,
metadata={“source”: str(file_path)}
)
documents.append(doc)
return documents
“`

## 第二步:文档分块
“`python
from langchain_text_splitters import RecursiveCharacterTextSplitter

def split_documents(documents, chunk_size=1000, chunk_overlap=200):
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=chunk_overlap,
separators=[“nn”, “n”, “。”, “!”, “?”, “,”, “、”, ” “]
)
chunks = text_splitter.split_documents(documents)
return chunks
“`

## 第三步:创建向量存储
“`python
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma

def create_vectorstore(documents, persist_directory=”./chroma_db”):
embeddings = OpenAIEmbeddings(model=”text-embedding-3-small”)
vectorstore = Chroma.from_documents(
documents=documents,
embedding=embeddings,
persist_directory=persist_directory
)
return vectorstore
“`

## 第四步:创建问答链
“`python
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

def create_qa_chain(retriever, model_name=”gpt-4o-mini”):
llm = ChatOpenAI(model=model_name, temperature=0)

template = “””
你是一个专业的问答助手。请根据以下上下文信息回答用户的问题。

上下文信息:
{context}

用户问题: {question}

要求:
1. 只使用上下文中的信息回答
2. 如果上下文中没有答案,请明确说明”我无法从提供的信息中找到答案”
3. 回答要准确、简洁、有条理
4. 使用中文回答

回答:
“””
prompt = ChatPromptTemplate.from_template(template)
combine_docs_chain = create_stuff_documents_chain(llm=llm, prompt=prompt)
retrieval_chain = create_retrieval_chain(retriever, combine_docs_chain)
return retrieval_chain
“`

## 第五步:整合所有组件
“`python
import os
from dotenv import load_dotenv
load_dotenv()

DATA_DIR = “./data/knowledge_base”
VECTOR_DB_DIR = “./chroma_db”
MODEL_NAME = “gpt-4o-mini”

# 加载文档
documents = load_text_files(DATA_DIR)
chunks = split_documents(documents)

# 创建向量存储
vectorstore = create_vectorstore(chunks, VECTOR_DB_DIR)
retriever = vectorstore.as_retriever(search_kwargs={“k”: 3})

# 创建问答链
qa_chain = create_qa_chain(retriever, MODEL_NAME)

# 交互式问答
while True:
question = input(“你: “).strip()
if question.lower() in [‘quit’, ‘exit’, ‘退出’]:
break
result = qa_chain.invoke({“query”: question})
print(f”助手: {result[‘answer’]}”)
“`

LangChain 实战:构建问答系统

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top
Copyright © 2026 Claude Code实战记录. 粤ICP备19017554号