
Qwen2.5-7B-Instruct LangChain集成指南构建智能问答系统1. 引言你是不是经常遇到这样的场景公司内部有大量文档资料但每次查找信息都要花费大量时间或者客户咨询的问题其实在FAQ文档里都有答案但人工查找效率太低今天我们就来解决这个问题。使用Qwen2.5-7B-Instruct模型和LangChain框架你可以快速搭建一个智能问答系统让AI帮你自动从文档中查找和回答问题。这个方案特别适合企业内部知识库、客服系统、文档查询等场景。Qwen2.5-7B-Instruct是阿里云开源的大语言模型在指令遵循、知识理解和文本生成方面表现优秀。LangChain则是一个强大的框架专门用于构建基于大语言模型的应用程序。两者结合就能打造出实用的智能问答系统。2. 环境准备与安装在开始之前我们需要准备好运行环境。这个项目对硬件要求不算太高但建议至少有16GB内存和足够的存储空间。首先安装必要的Python包pip install langchain langchain-community transformers sentence-transformers faiss-cpu chromadb如果你有GPU可以安装GPU版本的PyTorch来加速推理pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118对于文档处理我们还需要一些额外的工具pip install pypdf python-dotenv tiktoken安装完成后创建一个新的Python文件比如叫做qa_system.py我们将在里面编写主要的代码。3. 核心概念理解在开始编码之前先简单了解几个关键概念这样后面写代码时就知道每一步在做什么。LangChain就像是一个工具箱提供了各种构建AI应用所需的组件。它帮我们处理了很多复杂的工作比如文档加载、文本分割、向量存储等。**检索增强生成RAG**是我们要用到的核心技术。简单来说就是先从一个大的知识库中检索相关信息然后让AI基于这些信息来生成回答。这样既能保证回答的准确性又能利用AI的理解能力。向量数据库用来存储文档的数学表示向量这样计算机就能快速找到相似的内容。我们用的FAISS是Facebook开源的向量搜索库速度很快。4. 构建知识库智能问答系统的核心是知识库。我们需要把文档转换成计算机能理解的形式。首先创建一个文档加载器这里以PDF文件为例from langchain.document_loaders import PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 加载PDF文档 loader PyPDFLoader(your_document.pdf) documents loader.load() # 分割文本 text_splitter RecursiveCharacterTextSplitter( chunk_size1000, chunk_overlap200 ) texts text_splitter.split_documents(documents)文本分割很重要因为大模型一次能处理的文本长度有限。我们把长文档分成小块每块大约1000个字符块之间重叠200个字符这样能保持上下文的连贯性。接下来创建向量数据库from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS # 创建嵌入模型 embeddings HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2 ) # 创建向量数据库 vectorstore FAISS.from_documents(texts, embeddings) vectorstore.save_local(faiss_index)这里用了轻量级的嵌入模型如果你的文档很多可以考虑更大的模型但需要更多计算资源。5. 集成Qwen2.5模型现在来集成Qwen2.5-7B-Instruct模型。我们将使用Hugging Face的Transformers库来加载模型。from transformers import AutoTokenizer, AutoModelForCausalLM import torch # 加载模型和分词器 model_name Qwen/Qwen2.5-7B-Instruct tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, device_mapauto )为了让模型更好地理解我们的问题需要设置合适的提示模板def format_prompt(query, context): prompt f基于以下上下文信息请回答问题。如果上下文没有提供足够信息请如实说明。 上下文 {context} 问题{query} 回答 return prompt这个模板告诉模型要基于提供的上下文来回答问题不知道就说不知道避免胡编乱造。6. 构建完整的问答链现在把各个组件组合起来创建完整的问答流程from langchain.chains import RetrievalQA from langchain.llms import HuggingFacePipeline from transformers import pipeline # 创建文本生成管道 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, temperature0.1, top_p0.9, repetition_penalty1.1 ) llm HuggingFacePipeline(pipelinepipe) # 加载之前保存的向量数据库 vectorstore FAISS.load_local(faiss_index, embeddings) # 创建检索器 retriever vectorstore.as_retriever(search_kwargs{k: 3}) # 创建问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, return_source_documentsTrue )这里设置了检索3个最相关的文档片段这样既能提供足够的上下文又不会让输入过长。温度设为0.1让回答更加确定性适合问答场景。7. 使用问答系统现在可以测试我们的智能问答系统了def ask_question(question): result qa_chain({query: question}) print(f问题: {question}) print(f回答: {result[result]}) print(\n参考来源:) for doc in result[source_documents]: print(f- {doc.metadata.get(source, 未知)} 第{doc.metadata.get(page, ?)}页) return result # 测试问答 ask_question(公司请假流程是什么) ask_question(如何申请办公用品)系统会返回答案并显示答案的来源这样你就知道信息是从哪个文档的哪一页来的方便验证准确性。8. 进阶功能与优化基本的问答系统已经搭建完成但还可以进一步优化多文档支持如果你的知识库包含多种格式的文档可以这样处理from langchain.document_loaders import ( PyPDFLoader, TextLoader, Docx2txtLoader ) loaders { .pdf: PyPDFLoader, .txt: TextLoader, .docx: Docx2txtLoader } def load_documents(folder_path): all_documents [] for file_path in os.listdir(folder_path): ext os.path.splitext(file_path)[1].lower() if ext in loaders: loader loaders[ext](os.path.join(folder_path, file_path)) documents loader.load() all_documents.extend(documents) return all_documents对话历史让系统能记住之前的对话上下文from langchain.memory import ConversationBufferMemory memory ConversationBufferMemory( memory_keychat_history, return_messagesTrue ) # 在QA链中加入memory qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, memorymemory, return_source_documentsTrue )性能优化如果响应速度较慢可以考虑量化模型# 使用8-bit量化 model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, device_mapauto, load_in_8bitTrue )9. 常见问题解决在实际使用中可能会遇到一些问题这里提供一些解决方案内存不足如果遇到内存错误可以尝试减小文本块的大小或使用更小的嵌入模型。回答不准确检查检索到的文档是否相关可以调整检索数量或改进文档分割策略。响应速度慢考虑使用GPU加速或者对模型进行量化处理。处理长文档对于特别长的文档可能需要调整模型的最大上下文长度# 在创建管道时调整最大长度 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, max_length4096, truncationTrue )10. 总结通过这个教程我们完成了一个完整的智能问答系统。从文档处理到模型集成再到最后的问答界面每个步骤都提供了具体的代码示例。这个系统的优势在于它结合了检索式系统和生成式系统的优点既保证了信息的准确性因为答案来自实际文档又利用了大型语言模型的理解和表达能力。实际使用中你可以根据具体需求调整各个参数。比如文档分割的大小、检索的文档数量、模型的生成参数等。不同的场景可能需要不同的配置。如果想要进一步优化可以考虑使用更高质量的嵌入模型、实现多轮对话、添加用户反馈机制等。这个基础框架已经具备了很强的实用性可以直接用在很多实际场景中。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。