当前位置: 首页 > news >正文

太平洋保险网站做的这么烂石岩网站建设公司

太平洋保险网站做的这么烂,石岩网站建设公司,深圳市盐田区住房和建设局网站,中国建设银行手机网站首页系列文章索引 LangChain教程 - 系列文章 在现代自然语言处理#xff08;NLP#xff09;中#xff0c;基于文档内容的问答系统变得愈发重要#xff0c;尤其是当我们需要从大量文档中提取信息时。通过结合文档检索和生成模型#xff08;如RAG#xff0c;Retrieval-Augment…系列文章索引 LangChain教程 - 系列文章 在现代自然语言处理NLP中基于文档内容的问答系统变得愈发重要尤其是当我们需要从大量文档中提取信息时。通过结合文档检索和生成模型如RAGRetrieval-Augmented Generation我们可以构建强大的问答系统。本博客将详细介绍如何使用FastAPI和LangChain框架创建一个基于PDF文档的RAG问答API。 一、背景 在许多实际应用中用户可能需要基于大量的PDF文件进行快速的问答查询。LangChain作为一个强大的框架支持将各种数据源与生成模型集成而FastAPI则是一个轻量级的Web框架适用于构建高性能的API。在本案例中我们将使用FastAPI作为API服务端LangChain来处理文档加载、文本切分、向量存储和问答生成任务。 二、技术栈 FastAPI用于构建Web服务。LangChain提供构建问答系统的工具涉及文档加载、文本切分、向量存储、RAG链构建等功能。Ollama Embeddings用于将文本转换为向量。Chroma用于存储和检索文本向量的数据库。StarletteFastAPI的底层库用于支持流式响应。 三、实现步骤 1. 环境配置 首先我们需要安装必需的库。你可以通过以下命令来安装 pip install fastapi langchain langchain-chroma langchain-ollama langchain-community starlette uvicorn nest_asyncio安装完毕后我们可以开始构建我们的API。 2. 加载PDF并处理文本 我们从一个PDF文件加载文档并将其切分成适合处理的小块。这样可以更高效地将文本转化为向量并存储到数据库中。 from langchain_community.document_loaders import PyPDFLoader from langchain_text_splitters import RecursiveCharacterTextSplitter# 设置PDF文件路径 pdf_path ../../files/pdf/en/Transformer.pdf# 加载PDF文档并分割文本 loader PyPDFLoader(pdf_path) docs loader.load()# 使用递归文本切分器来切分文档 text_splitter RecursiveCharacterTextSplitter(chunk_size1000, chunk_overlap100) splits text_splitter.split_documents(docs)在这段代码中PyPDFLoader被用来加载PDF文件而RecursiveCharacterTextSplitter则将文档切分为多个小块确保每个块之间有200个字符的重叠以便保持上下文的连贯性。 3. 存储向量到数据库 接下来我们使用Chroma来存储文档的向量表示。我们利用OllamaEmbeddings模型将文本块转化为向量并将它们存储在Chroma数据库中。 from langchain_chroma import Chroma from langchain_ollama import OllamaEmbeddings# 存储分割后的文档到向量数据库 vectorstore Chroma.from_documents(documentssplits, embeddingOllamaEmbeddings(modelnomic-embed-text))这里我们通过OllamaEmbeddings将文档切分块转换为嵌入向量并使用Chroma将这些向量存储到数据库中。这样我们就可以通过相似度检索来快速找到与用户查询相关的文档。 4. 构建检索器 为了支持从数据库中检索相关文档我们将构建一个基于相似度搜索的检索器。 # 构建检索器 retriever vectorstore.as_retriever(search_typesimilarity, search_kwargs{k: 3})这段代码通过as_retriever方法创建了一个检索器能够基于向量的相似度从数据库中返回与查询最相关的文档。 5. 定义RAG链 我们使用RAG检索增强生成技术将检索到的文档与生成模型如ChatOllama结合生成最终的答案。hub.pull(rlm/rag-prompt)方法提供了一个预定义的RAG提示模板。 from langchain import hub from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_ollama import ChatOllama# 定义RAG提示模板 prompt hub.pull(rlm/rag-prompt)# 格式化检索到的文档 def format_docs(docs):return \n\n.join(doc.page_content for doc in docs)# 定义RAG链 rag_chain ({context: retriever | format_docs, question: RunnablePassthrough()}| prompt| ChatOllama(modeldeepseek-r1:7b)| StrOutputParser() )在这里我们将检索到的文档内容格式化为字符串并将其与用户的查询一起传递到生成模型中以生成最终的答案。 6. 生成答案和流式响应 我们定义了两个方法一个是生成完整答案另一个是生成流式响应。 import json# 生成答案函数 async def generate_answer(question: str):response await rag_chain.ainvoke(question)return response# 生成流式响应 async def generate_streaming_response(question: str):async for chunk in rag_chain.astream(question): # 使用astream逐块获取响应yield json.dumps({answer chunk: chunk}) \n # 按流式返回每一块内容在这部分代码中generate_answer方法会返回完整的答案而generate_streaming_response方法则返回流式响应每次返回一个内容块。 7. 创建FastAPI应用 最后我们使用FastAPI创建一个Web应用提供一个POST接口来接收用户查询并返回答案。 from fastapi import FastAPI, HTTPException from pydantic import BaseModel from starlette.responses import StreamingResponse# 创建FastAPI应用 app FastAPI()# 定义输入模型 class QueryModel(BaseModel):question: strstream: bool False # 默认不流式返回# 创建POST路由处理查询 app.post(/query/) async def query_question(query: QueryModel):try:if query.stream:# 如果stream为True使用流式响应return StreamingResponse(generate_streaming_response(query.question), media_typetext/json)else:# 否则直接返回完整答案answer await generate_answer(query.question) # 使用await获取完整的答案return {answer: answer}except Exception as e:raise HTTPException(status_code500, detailstr(e))此API提供了一个接口用户可以通过发送带有问题的POST请求来获取答案。如果请求中指定stream为True系统将返回流式的答案。 8. 启动jupyter notebooks下载地址 https://github.com/flower-trees/langchain-example/blob/master/pdf/jupyter/chat_pdf_api.ipynb import nest_asyncio import uvicorn nest_asyncio.apply() uvicorn.run(app, host127.0.0.1, port8000)9. 提问 curl -X POST http://127.0.0.1:8000/query/ \-H Content-Type: application/json \-d {question: Why is masking necessary in the decoder’s self-attention mechanism?,stream: true}10. 清理向量数据库 vectorstore.delete_collection()四、完整代码实例 代码下载地址 https://github.com/flower-trees/langchain-example/blob/master/pdf/chat_pdf_api.py import json from contextlib import asynccontextmanagerfrom fastapi import FastAPI, HTTPException from pydantic import BaseModel from langchain import hub from langchain_chroma import Chroma from langchain_community.document_loaders import PyPDFLoader from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_ollama import ChatOllama, OllamaEmbeddings from langchain_text_splitters import RecursiveCharacterTextSplitter from starlette.responses import StreamingResponse# 设置 PDF 文件路径 pdf_path ../files/pdf/en/Transformer.pdf# 加载 PDF 文档并分割文本 loader PyPDFLoader(pdf_path) docs loader.load() text_splitter RecursiveCharacterTextSplitter(chunk_size1000, chunk_overlap100) splits text_splitter.split_documents(docs)# 存储分割后的文档到向量数据库 vectorstore Chroma.from_documents(documentssplits, embeddingOllamaEmbeddings(modelnomic-embed-text))# 构建检索器 retriever vectorstore.as_retriever(search_typesimilarity, search_kwargs{k: 3})# 定义 RAG 提示模板 prompt hub.pull(rlm/rag-prompt)# 格式化检索到的文档 def format_docs(docs):return \n\n.join(doc.page_content for doc in docs)# 定义 RAG 链 rag_chain ({context: retriever | format_docs, question: RunnablePassthrough()}| prompt| ChatOllama(modeldeepseek-r1:7b)| StrOutputParser() )print(RAG ready)# 生成答案函数 async def generate_answer(question: str):response await rag_chain.ainvoke(question)return response# 生成流式响应 async def generate_streaming_response(question: str):async for chunk in rag_chain.astream(question): # 使用 astream 逐块获取响应yield json.dumps({answer chunk: chunk}) \n # 按流式返回每一块内容# 8. 清理向量数据库 def clear_vectorstore():vectorstore.delete_collection()asynccontextmanager async def lifespan(app: FastAPI):# 在应用启动时执行的代码yield# 在应用关闭时执行的代码clear_vectorstore()print(Vectorstore cleaned up successfully!)# 创建 FastAPI 应用 app FastAPI(lifespanlifespan)# 定义输入模型 class QueryModel(BaseModel):question: strstream: bool False # 默认不流式返回# 创建 POST 路由处理查询 app.post(/query/) async def query_question(query: QueryModel):try:if query.stream:# 如果 stream 为 True使用流式响应return StreamingResponse(generate_streaming_response(query.question), media_typetext/json)else:# 否则直接返回完整答案answer await generate_answer(query.question) # 使用 await 获取完整的答案return {answer: answer}except Exception as e:raise HTTPException(status_code500, detailstr(e))# 启动 FastAPI 应用适用于开发环境 # uvicorn chat_pdf_api:app --reload五、总结 通过本教程我们展示了如何使用FastAPI和LangChain框架结合检索增强生成RAG技术构建一个基于PDF文档的问答系统。系统支持两种查询方式普通的完整答案返回和流式答案返回。借助LangChain提供的强大工具集我们能够轻松地实现文档加载、文本切分、向量存储与检索等功能。FastAPI则让我们能够高效地将这些功能封装为一个Web API供用户使用。 在实际应用中这种基于文档的问答系统可以广泛应用于客户支持、知识库管理、教育培训等领域为用户提供智能化的答案生成服务。
http://www.w-s-a.com/news/378014/

相关文章:

  • 哈尔滨网页设计网站模板泰兴建设局网站
  • 响应式网站设计公司报纸做垂直门户网站
  • 陕西旭泽建设有限公司网站企业网站建设软件需求分析
  • 上海公司网站建设方案中企动力西安分公司
  • dedecms网站后台怎样才能上百度
  • 云互联的网站名字亚马逊雨林生物
  • 电商网站功能企查查企业信息查询网
  • 特色网站建设中国住房和城乡建设局官网
  • 长春市住房城乡建设厅网站做白酒网站
  • 自己的网站怎么做的成品免费ppt网站
  • 番禺区网站建设哪里有泰安公司
  • 网站制作详细过程网站开发最强工具
  • 孟村县做网站长春城投建设投资有限公司网站
  • 国家重大建设项目库网站wordpress安装 var
  • 供求信息网站建设报价网站制作 苏州
  • 动漫建模代做网站百度一下wordpress nginx 固定链接
  • 广州网站开发网络公司网站建设的书
  • php手机网站开发教程家政网站怎么做
  • 视频网站的建设预算通信科技网站设计
  • 糖果网站建设策划书淘宝客网站开源
  • 建站公司还有前途吗cf网站编程
  • 网站建设需求确认表建站工具 比较
  • 刚建设的网站多久能在百度查到考试系统 微网站是什么样的
  • 商城网站建设高端企业网站建设劣势
  • 网站建设征集通讯员的通知seo推广外包
  • 微信公众号微网站建设专业网站建设出售
  • 怎么用wordpress建立自己的网站加强校园网站建设
  • 用什么做网站后台的织梦网站怎么上传
  • 怎么获取网站数据做统计百度快照推广有效果吗
  • 淘宝领卷网站什么做制造网站开发