RAG系统学习之——基于LangChain+Milvus+Ollama+Streamlit搭建本地RAG系统

基于LangChain + Milvus 实现RAG 本文介绍使用LangChain和本地部署的MilvusLite构建文本检索系统,采用HuggingFace的gte-large-zh模型生成嵌入向量。主要内容包括:系统设计目标(大文本处理流程)、环境配置要求、关键实现细节(文本分块策略、嵌入向量生成方法)、完整代码示例(包含文本入库和查询功能),以及生产环境扩展建议。特别强调了chunk大小控制(不超过512token)、MilvusLite的本地文件存储特性等注意事项,并提供了常见问题排查方法。该方案适合本地原型开发,文末还给出了向生产环境迁移的优化方向 阅读详情

前言

RAG(Retrieval-Augmented Generation)是一种结合了信息检索和生成式AI的技术架构,能够让大语言模型基于外部知识库进行问答,有效解决模型知识截止日期和幻觉问题。

本文将详细介绍如何用LangChain+Milvus+Ollama+Streamlit搭建一个完全本地化的RAG系统。

技术架构

  • LangChain: 负责RAG管道的编排和文档处理
  • Milvus: 高性能向量数据库,负责文档向量的存储和检索
  • Ollama: 本地大语言模型运行框架
  • Streamlit: 提供友好的Web前端交互界面

环境准备

1. 安装依赖

# 创建虚拟环境
python -m venv rag_env
source rag_env/bin/activate  # Linux/Mac
# rag_env\Scripts\activate  # Windows

# 安装核心依赖
pip install langchain langchain-ollama pymilvus sentence-transformers streamlit streamlit-chat
pip install pypdf2 tiktoken chromadb plotly pandas  # 前端界面和数据分析

2. 启动Milvus(Standalone版)

# 启动Milvus(推荐使用Docker)
docker run -d \
  --name milvus-standalone \
  --security-opt seccomp:unconfined \
  -p 19530:19530 \
  -p 9091:9091 \
  -v milvus-data:/milvus/data \
  milvusdb/milvus:latest

# 下载并启动Ollama模型
ollama serve
ollama pull llama2  # 或其他模型

核心代码实现

1. 文档处理模块

from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores import Milvus

class DocumentProcessor:
    def __init__(self):
        # 初始化嵌入模型(Ollama提供)
        self.embeddings = OllamaEmbeddings(model="llama2")
        # 文档分割器
        self.text_splitter = RecursiveCharacterTextSplitter(
            chunk_size=1000,
            chunk_overlap=200,
            length_function=len,
        )
        
    def load_and_split_documents(self, file_paths):
        """加载并分割文档"""
        documents = []
        for file_path in file_paths:
            if file_path.endswith('.pdf'):
                loader = PyPDFLoader(file_path)
                docs = loader.load()
                documents.extend(docs)
            else:
                # 处理其他格式文档
                pass
        
        # 分割文档
        splits = self.text_splitter.split_documents(documents)
        return splits
    
    def create_vectorstore(self, documents, collection_name="rag_docs"):
        """创建向量数据库"""
        # 清空现有集合
        vectorstore = Milvus.from_documents(
            documents=documents,
            embedding=self.embeddings,
            collection_name=collection_name,
            drop_old=True  # 删除旧集合
        )
        return vectorstore

2. RAG查询引擎

from langchain_ollama import ChatOllama
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate

class RAGQueryEngine:
    def __init__(self, vectorstore):
        # 初始化本地LLM
        self.llm = ChatOllama(
            model="llama2",
            temperature=0.1,
            max_tokens=2000
        )
        
        # 创建检索器
        self.retriever = vectorstore.as_retriever(
            search_type="similarity",
            search_kwargs={"k": 4}  # 返回4个最相关的文档片段
        )
        
        # 创建自定义提示词
        self.prompt = PromptTemplate(
            template="""基于以下上下文信息回答问题:
            
            上下文:
            {context}
            
            问题:{question}
            
            回答要求:
            1. 基于上下文信息回答
            2. 如果上下文中没有相关信息,说明无法回答
            3. 保持回答简洁明确
            
            回答:""",
            input_variables=["context", "question"]
        )
        
        # 创建QA链
        self.qa_chain = RetrievalQA.from_chain_type(
            llm=self.llm,
            chain_type="stuff",
            retriever=self.retriever,
            chain_type_kwargs={"prompt": self.prompt},
            return_source_documents=True  # 返回源文档
        )
    
    def query(self, question):
        """执行查询"""
        result = self.qa_chain({"query": question})
        return {
            "answer": result["result"],
            "source_documents": result["source_documents"]
        }

3. 系统集成模块

class LocalRAGSystem:
    def __init__(self):
        self.doc_processor = DocumentProcessor()
        self.vectorstore = None
        self.query_engine = None
        
    def build_system(self, document_paths):
        """构建RAG系统"""
        print("📚 正在处理文档...")
        documents = self.doc_processor.load_and_split_documents(document_paths)
        print(f"✅ 文档处理完成,共{len(documents)}个片段")
        
        print("🗄️  正在构建向量数据库...")
        self.vectorstore = self.doc_processor.create_vectorstore(documents)
        print("✅ 向量数据库构建完成")
        
        print("🤖 正在初始化查询引擎...")
        self.query_engine = RAGQueryEngine(self.vectorstore)
        print("✅ 查询引擎初始化完成")
        
    def chat(self, question):
        """执行对话"""
        if not self.query_engine:
            return "系统未初始化,请先调用build_system()"
        
        print(f"❓ 问题:{question}")
        result = self.query_engine.query(question)
        print(f"💬 回答:{result['answer']}")
        
        # 显示引用源
        print("\n📖 参考文档片段:")
        for i, doc in enumerate(result['source_documents'][:2], 1):
            print(f"{i}. {doc.page_content[:100]}...")
        
        return result

完整使用示例

def main():
    # 初始化RAG系统
    rag_system = LocalRAGSystem()
    
    # 构建系统(提供文档路径)
    document_paths = ["./documents/技术文档.pdf", "./documents/FAQ.md"]
    rag_system.build_system(document_paths)
    
    # 执行查询
    questions = [
        "什么是LangChain框架?",
        "如何使用Milvus进行向量检索?",
        "RAG系统的优势是什么?"
    ]
    
    for question in questions:
        print("\n" + "="*50)
        rag_system.chat(question)
        print("="*50)

if __name__ == "__main__":
    main()

高级功能扩展

1. 多文档类型支持

from langchain_community.document_loaders import (
    TextLoader, CSVLoader, ExcelLoader, UnstructuredFileLoader
)

class AdvancedDocumentProcessor(DocumentProcessor):
    def load_and_split_documents(self, file_paths):
        """支持多种文档格式"""
        documents = []
        
        for file_path in file_paths:
            if file_path.endswith('.pdf'):
                loader = PyPDFLoader(file_path)
            elif file_path.endswith('.txt'):
                loader = TextLoader(file_path, encoding='utf-8')
            elif file_path.endswith('.csv'):
                loader = CSVLoader(file_path)
            elif file_path.endswith(('.xlsx', '.xls')):
                loader = ExcelLoader(file_path)
            else:
                # 使用通用文档处理器
                loader = UnstructuredFileLoader(file_path)
            
            docs = loader.load()
            documents.extend(docs)
        
        return self.text_splitter.split_documents(documents)

2. 查询结果过滤

class EnhancedRAGQueryEngine(RAGQueryEngine):
    def __init__(self, vectorstore):
        super().__init__(vectorstore)
        self.confidence_threshold = 0.7
    
    def query_with_confidence(self, question):
        """带置信度评估的查询"""
        result = self.query_engine.query(question)
        
        # 简单的置信度评估(基于相似度分数)
        similarities = [doc.metadata.get('score', 0) 
                       for doc in result['source_documents']]
        avg_similarity = sum(similarities) / len(similarities) if similarities else 0
        
        if avg_similarity < self.confidence_threshold:
            result['answer'] += f"\n\n⚠️  注意:检索置信度较低({avg_similarity:.2f}),回答仅供参考。"
        
        result['confidence'] = avg_similarity
        return result

Streamlit前端界面设计

1. 主界面应用

import streamlit as st
import tempfile
import os
from streamlit_chat import message
import json

class StreamlitRAGInterface:
    def __init__(self):
        self.initialize_session_state()
    
    def initialize_session_state(self):
        """初始化Streamlit会话状态"""
        if 'rag_system' not in st.session_state:
            st.session_state.rag_system = LocalRAGSystem()
        if 'chat_history' not in st.session_state:
            st.session_state.chat_history = []
        if 'system_built' not in st.session_state:
            st.session_state.system_built = False
        if 'uploaded_files' not in st.session_state:
            st.session_state.uploaded_files = []
    
    def render_sidebar(self):
        """渲染侧边栏"""
        with st.sidebar:
            st.title("🔧 RAG系统配置")
            
            # 模型配置
            st.subheader("🤖 模型配置")
            model_options = ["llama2", "llama3", "codellama", "mistral"]
            selected_model = st.selectbox("选择模型", model_options, index=0)
            
            temperature = st.slider("生成温度", 0.0, 1.0, 0.1)
            max_tokens = st.slider("最大令牌数", 500, 4000, 2000)
            
            # 文档上传
            st.subheader("📚 文档管理")
            uploaded_files = st.file_uploader(
                "上传文档", 
                type=['pdf', 'txt', 'md', 'csv', 'xlsx'],
                accept_multiple_files=True
            )
            
            if uploaded_files:
                st.session_state.uploaded_files = uploaded_files
            
            # 系统构建
            if st.button("🚀 构建RAG系统", type="primary"):
                self.build_system_from_uploads()
            
            # 系统状态
            st.subheader("📊 系统状态")
            if st.session_state.system_built:
                st.success("✅ 系统已就绪")
                if st.button("🔄 重置系统"):
                    self.reset_system()
            else:
                st.warning("⏳ 等待系统构建")
                
            # 参数配置
            st.subheader("⚙️ 检索参数")
            k_value = st.slider("检索文档数量", 1, 10, 4)
            
            return {
                'model': selected_model,
                'temperature': temperature,
                'max_tokens': max_tokens,
                'k_value': k_value
            }
    
    def build_system_from_uploads(self):
        """从上传的文件构建系统"""
        if not st.session_state.uploaded_files:
            st.error("请先上传文档")
            return
        
        try:
            with st.spinner("正在处理文档..."):
                # 保存临时文件
                temp_files = []
                for uploaded_file in st.session_state.uploaded_files:
                    temp_dir = tempfile.mkdtemp()
                    temp_path = os.path.join(temp_dir, uploaded_file.name)
                    
                    with open(temp_path, "wb") as f:
                        f.write(uploaded_file.getvalue())
                    temp_files.append(temp_path)
                
                # 构建系统
                st.session_state.rag_system.build_system(temp_files)
                st.session_state.system_built = True
                st.session_state.chat_history = []
                
                st.success(f"✅ 成功处理 {len(temp_files)} 个文档")
                
        except Exception as e:
            st.error(f"构建失败: {str(e)}")
    
    def reset_system(self):
        """重置系统"""
        st.session_state.rag_system = LocalRAGSystem()
        st.session_state.chat_history = []
        st.session_state.system_built = False
        st.session_state.uploaded_files = []
        st.rerun()
    
    def render_chat_interface(self, config):
        """渲染聊天界面"""
        st.title("💬 本地RAG智能问答系统")
        
        if not st.session_state.system_built:
            st.warning("请先在侧边栏构建RAG系统")
            return
        
        # 聊天历史显示
        chat_container = st.container()
        
        with chat_container:
            for i, (user_msg, bot_msg) in enumerate(st.session_state.chat_history):
                message(user_msg, is_user=True, key=f"user_{i}")
                message(bot_msg, is_user=False, key=f"bot_{i}")
        
        # 用户输入
        if query := st.chat_input("请输入您的问题..."):
            # 用户消息
            with st.spinner("正在思考..."):
                try:
                    # 配置模型参数
                    st.session_state.rag_system.query_engine.llm.temperature = config['temperature']
                    st.session_state.rag_system.query_engine.llm.max_tokens = config['max_tokens']
                    
                    # 执行查询
                    result = st.session_state.rag_system.chat(query)
                    
                    # 更新聊天历史
                    st.session_state.chat_history.append((query, result['answer']))
                    
                    # 刷新页面显示新消息
                    st.rerun()
                    
                except Exception as e:
                    st.error(f"查询失败: {str(e)}")

def main():
    """主函数"""
    st.set_page_config(
        page_title="RAG智能问答系统",
        page_icon="🤖",
        layout="wide"
    )
    
    # 添加自定义CSS
    st.markdown("""
    .main-header {
        text-align: center;
        padding: 1rem;
        background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
        border-radius: 10px;
        margin-bottom: 2rem;
    }

    .chat-message {
        padding: 1rem;
        border-radius: 10px;
        margin: 0.5rem 0;
    }

    .user-message {
        background-color: #e3f2fd;
        border-left: 5px solid #2196f3;
    }

    .bot-message {
        background-color: #f3e5f5;
        border-left: 5px solid #9c27b0;
    }

    """, unsafe_allow_html=True)

    # 初始化界面
    app = StreamlitRAGInterface()
    config = app.render_sidebar()
    app.render_chat_interface(config)

if __name__ == "__main__":
    main()

2. 配置文件

# config.py - 配置文件
import os
from typing import Dict, Any

class Config:
    # 模型配置
    DEFAULT_MODEL = "llama2"
    AVAILABLE_MODELS = ["llama2", "llama3", "codellama", "mistral"]
    
    # 向量数据库配置
    MILVUS_HOST = os.getenv("MILVUS_HOST", "localhost")
    MILVUS_PORT = os.getenv("MILVUS_PORT", "19530")
    COLLECTION_NAME = "rag_docs"
    
    # 文档处理配置
    CHUNK_SIZE = 1000
    CHUNK_OVERLAP = 200
    SUPPORTED_FILE_TYPES = ['pdf', 'txt', 'md', 'csv', 'xlsx']
    
    # Streamlit配置
    PAGE_TITLE = "RAG智能问答系统"
    PAGE_ICON = "🤖"
    LAYOUT = "wide"
    
    # UI配置
    MAX_UPLOAD_SIZE = 50 * 1024 * 1024  # 50MB
    CHAT_HISTORY_LIMIT = 100
    
    # 检索配置
    DEFAULT_TOP_K = 4
    CONFIDENCE_THRESHOLD = 0.7

部署建议

1. Docker化部署

# Dockerfile
FROM python:3.10-slim

WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    && rm -rf /var/lib/apt/lists/*

# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 8501

# 启动命令
CMD ["streamlit", "run", "streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]

2. Docker Compose配置

# docker-compose.yml
version: '3.8'

services:
  milvus:
    image: milvusdb/milvus:latest
    container_name: milvus-standalone
    command: ["milvus", "run", "standalone"]
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - milvus_data:/milvus/data
    ports:
      - "19530:19530"
    networks:
      - rag_network

  streamlit-app:
    build: .
    container_name: streamlit-rag
    ports:
      - "8501:8501"
    environment:
      - MILVUS_HOST=milvus
      - MILVUS_PORT=19530
    depends_on:
      - milvus
    networks:
      - rag_network

volumes:
  milvus_data:

networks:
  rag_network:
    driver: bridge

3. 独立部署(开发环境)

# 1. 启动Milvus
docker run -d --name milvus-standalone \
  --security-opt seccomp:unconfined \
  -p 19530:19530 \
  -p 9091:9091 \
  -v milvus-data:/milvus/data \
  milvusdb/milvus:latest

# 2. 启动Ollama
ollama serve
ollama pull llama2

# 3. 启动Streamlit应用
streamlit run streamlit_app.py --server.port 8501 --server.address 0.0.0.0

# 4. 访问 http://localhost:8501

4. 一键启动脚本

#!/bin/bash
# setup.sh - 一键安装脚本

echo "🚀 开始搭建RAG系统..."

# 1. 创建虚拟环境
echo "📦 创建Python虚拟环境..."
python -m venv rag_env
source rag_env/bin/activate

# 2. 安装依赖
echo "📚 安装Python依赖..."
pip install --upgrade pip
pip install langchain langchain-ollama pymilvus sentence-transformers streamlit streamlit-chat
pip install pypdf2 tiktoken chromadb plotly pandas

# 3. 启动Milvus
echo "🗄️ 启动Milvus向量数据库..."
docker run -d \
  --name milvus-standalone \
  --security-opt seccomp:unconfined \
  -p 19530:19530 \
  -p 9091:9091 \
  -v milvus-data:/milvus/data \
  milvusdb/milvus:latest

# 4. 等待服务就绪
echo "⏳ 等待服务启动..."
sleep 30

# 5. 检查Ollama
echo "🤖 检查Ollama服务..."
if ! command -v ollama &> /dev/null; then
    echo "❌ 请先安装Ollama: https://ollama.ai"
    exit 1
fi

# 6. 启动模型
echo "📥 下载模型..."
ollama pull llama2

# 7. 启动应用
echo "🌐 启动Streamlit应用..."
echo "🎉 RAG系统已启动!请访问: http://localhost:8501"
streamlit run streamlit_app.py --server.port 8501 --server.address 0.0.0.0

快速测试

创建测试文档进行验证:

# test_document.txt

什么是RAG系统?
RAG(Retrieval-Augmented Generation)是一种结合了信息检索和生成式AI的技术架构。

LangChain有哪些主要功能?
LangChain是一个用于开发基于LLM的应用程序的框架,提供了丰富的组件和工具。

Milvus是什么数据库?
Milvus是一个开源的向量数据库,专门用于存储和检索大规模向量数据。

总结

通过LangChain+Milvus+Ollama+Streamlit的完整组合,我们成功搭建了一个功能完善的本地化RAG系统,具有以下特点:

🔧 核心技术栈

  • ✅ LangChain: RAG管道编排和文档处理
  • ✅ Milvus: 高性能向量数据库存储
  • ✅ Ollama: 完全本地化的大语言模型
  • ✅ Streamlit: 友好的Web前端交互界面

🌟 系统特色

  • ✅ 数据隐私保护: 完全本地化,数据不上传云端
  • ✅ 灵活文档处理: 支持PDF、TXT、CSV等多种格式
  • ✅ 可视化交互: 美观的Web界面,支持聊天式问答
  • ✅ 实时系统监控: 聊天历史、统计分析等功能
  • ✅ 一键部署: Docker支持,快速部署上线
  • ✅ 高可扩展性: 模块化设计,便于二次开发

🎯 应用场景

  • 企业内部知识库: 安全访问公司文档和FAQ
  • 客户服务系统: 基于企业资料的智能客服
  • 教育培训平台: 个性化学习助手
  • 科研文献助手: 快速检索和分析学术论文

📈 性能优化建议

1.模型选择: 根据硬件资源选择合适的本地模型

2.索引优化: 调整Milvus索引参数提升检索速度

3.缓存策略: 对热门查询结果进行缓存

4.批量处理: 文档向量化时使用批处理提升效率

5.负载均衡: 生产环境考虑多实例部署

    这种架构特别适合需要数据安全控制、高度定制化和良好用户体验的企业环境。

    从零搭建个人AI智能体:本地部署、RAG与LangChain实践指南 大语言模型(LLM)作为当前人工智能的核心技术,通过理解与生成自然语言,为构建智能应用提供了基础。其工作原理基于Transformer架构,通过海量数据预训练获得通用语言理解能力。在工程实践中,检索增强生成(RAG)技术通过结合外部知识库,有效解决了模型幻觉与知识更新滞后的问题,显著提升了回答的准确性与时效性。向量数据库作为RAG的关键组件,负责存储和高效检索文本的向量化表示。基于这些技术,开发者可以构建私有化、定制化的AI应用,例如常驻个人AI智能体。这类智能体能够7x24小时在线,结合本地知识库与工具调 阅读详情

    相关推荐

    本地RAG知识库实战:用Qwen2+LangChain+Chroma搭建生产级问答系统

    RAG(检索增强生成)是一种将大语言模型与外部知识源动态结合的关键技术,其核心原理是通过向量检索精准定位相关文档片段,再交由LLM生成可溯源、低幻觉的答案。相比微调,RAG具备开发成本低、知识更新快、结果可解释等显著工程优势,特别适合企业私有知识库场景。结合LangChain提供的标准化链式编排能力,以及Qwen2-7B等中文优化的本地大模型,可构建出数据不出域、响应可控、易于审计的知识服务闭环。本文聚焦RAG落地中最关键的PDF解析质量、语义分块策略、中文向量嵌入选型(如bge-m3)及Prompt约束设

    weixin_30319153的博客 403

    从零到一:用LangChain和Milvus构建你的第一个RAG系统

    本文详细介绍了如何使用LangChain和Milvus构建RAG(检索增强生成)系统,从环境配置到核心实现,再到高级优化技巧。通过结合LangChain的流程编排能力和Milvus的高效向量检索,开发者可以快速搭建智能问答系统,有效提升大语言模型的专业领域知识处理能力。

    sugar的博客 618

    Langchain-Chatchat本地知识库部署实战指南

    私有知识库是企业构建可信AI应用的核心基础设施,其本质是通过RAG(检索增强生成)技术将非结构化文档转化为可问答的向量化知识系统。原理上依赖文本分块、嵌入模型编码、向量数据库检索与大语言模型生成四步闭环;技术价值在于数据不出域、合规可控、支持商用授权(如Apache License);典型应用场景覆盖金融合同审查、医疗SOP查询、政企法规检索等高敏感领域。本文聚焦Langchain-Chatchat这一轻量级、中文深度优化的开源实现,详解其本地部署、模块解耦设计与Windows/macOS/Linux跨平台

    cuanwei9356的博客 331

    构建专属知识库:RAG实操教程结合LangChain与Milvus向量数据库

    本文主要是 Milvus 向量数据实战总结。LLM 痛点以及解决方案RAG 是什么,为什么选用RAG。langchain文档加载器,chat model文档拆分的注意点,chat model区别。chat 示例代码。读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用如果你是零基础小白,想快速入门大模型是可以考虑的。一方面是学习时间相对较短,学习内容更全面更集中。二方面是可以根据这些资料规划好学习计划和方向。

    2301_82275412的博客 1440

    从零构建RAG与Agent应用:LangChain实战指南

    在人工智能应用开发领域,检索增强生成(RAG)和智能体(Agent)是解决大语言模型知识滞后与幻觉问题的关键技术。RAG通过将外部知识库与模型生成过程结合,为模型提供实时、准确的参考信息,从而提升回答的可靠性与时效性。其技术价值在于能够构建具备领域专长、可动态更新的智能问答系统。智能体则进一步赋予模型自主规划与工具调用的能力,使其从被动应答升级为主动执行复杂任务。这些技术广泛应用于企业知识库、智能客服、数据分析助手等场景。本文基于LangChain框架,通过实战项目手把手演示如何构建一个融合RAG与Agen

    weixin_34268753的博客 331

    从零搭建本地RAG知识库:集成Embedding、向量库与Agentic RAG的实战指南

    检索增强生成(RAG)是一种通过从外部知识库检索相关信息来增强大语言模型(LLM)生成能力的技术范式,其核心原理在于将传统信息检索与LLM的自然语言生成能力相结合。该技术通过将文档转化为向量嵌入(Embeddings)并存储于向量数据库,实现了基于语义相似度的高效检索,从而有效缓解LLM的幻觉问题并确保信息的事实准确性。在工程实践中,RAG的价值在于能够构建私有化、可定制且知识可溯源的企业级应用,例如智能客服、内部知识库和文档问答系统。本文聚焦于一个集成了Embedding模型、本地向量库和Agentic

    weixin_34342207的博客 468

    使用langchain搭建本地知识库系统(新)

    使用langchain搭建本地知识库系统(新)

    2401_82469710的博客 4274

    Langchain-Chatchat Windows11本地部署实战指南

    RAG(检索增强生成)是构建私有知识库的核心范式,其原理在于将外部知识实时注入大语言模型,提升回答准确性与可溯源性。技术价值体现在数据不出域、模型可替换、逻辑可审计,广泛应用于企业文档智能问答、合同条款检索、财务报告分析等强合规场景。在Windows11环境下,Langchain-Chatchat作为开源RAG框架代表,依托Apache License实现免费商用与深度定制自由,但需直面路径限制、DLL冲突、GPU显存管理等系统级挑战。本文聚焦真实硬件环境下的可复现部署路径,覆盖conda环境隔离、Olla

    weixin_30682415的博客 345

    使用Langchain4j和Ollama3搭建RAG系统

    检索增强生成(Retrieval-Augmented Generation,RAG)框架通过融合从大型文档语料库中检索到的关键信息,显著提升了生成语言模型的能力。

    Y525698136的博客 401

    大模型应用开发实战:从RAG系统搭建到AI Agent进阶指南

    Transformer架构作为现代大模型的核心骨架,通过自注意力机制实现了对上下文信息的并行处理与深度理解,奠定了自然语言处理的技术基石。其技术价值在于将AI从单纯的模式识别提升至具备逻辑推理与内容生成的认知层面,极大地拓展了自动化与智能化的应用边界。在实际工程中,基于检索增强生成(RAG)技术构建私有知识库问答系统,以及利用LangChain等框架开发具备规划与工具调用能力的AI智能体(Agent),已成为企业级AI应用落地的关键路径。本文聚焦于大模型应用开发,深入剖析了从模型选型、RAG系统搭建到智能体

    weixin_34055787的博客 334

    基于RAG与本地大模型的配电领域私有知识库构建实战

    在数字化转型浪潮中,如何高效管理和利用海量、多格式的非结构化文档(如PDF、Word)是众多企业面临的共同挑战。传统的关键词检索难以理解语义,而大语言模型(LLM)虽具备强大的理解和生成能力,但其通用性可能导致在垂直领域产生“幻觉”或知识滞后。检索增强生成(RAG)技术应运而生,它巧妙地将信息检索与LLM生成相结合,通过从专用向量数据库中实时检索最相关的知识片段来“增强”大模型的回答,从而确保答案的准确性、时效性并保护数据隐私。这项技术在知识密集、对准确性要求高的行业(如**配电运维**、法律、医疗)具有极

    weixin_30764883的博客 319

    基于 Python LangChain/LlamaIndex + FastAPI + Streamlit + Ollama 构建企业离线内网 RAG 知识问答系统

    本文详细介绍如何利用 Python 生态中的 LangChain/LlamaIndex 框架,结合 FastAPI 构建后端服务,使用 Streamlit 开发前端界面,并集成本地部署的 Ollama 与 Qwen 大语言模型,打造一套完全离线、可运行于企业内网环境的 RAG(检索增强生成)知识问答系统。文章将从系统架构设计、环境搭建、核心代码实现、前后端集成、模型本地化部署到最终系统展示,提供完整的实战指南。

    282

    告别Keil/IAR:在VSCode中用CMake+Clangd打造丝滑的STM32开发环境(附完整配置)

    本文详细介绍了如何在VSCode中使用CMake和Clangd搭建高效的STM32开发环境,替代传统的Keil/IAR工具。通过完整的配置指南和快速开发技巧,帮助开发者实现轻量级、高度可定制的现代化开发流程,显著提升STM32项目的开发效率。

    weixin_26843605的博客 166

    Langchain-Chatchat 本地知识库问答快速上手教程:四步在 30 分钟内搭好你的私有 RAG 系统

    想让内部文档、产品手册被大模型"秒答",又不想让一个字流出内网?Langchain-Chatchat 让你在 30 分钟内搭好一套私有本地知识库问答系统:完全离线部署,RAG 检索(Retrieval-Augmented Generation,即先从文档里检索相关片段再交给大模型作答)与大模型回答一次搞定,还支持 Agent 工具调用。 ## 为什么值得你花 30 分钟:Langchain-Ch

    gitblog_00181的博客 728

    Unity中URP下的菲涅尔效果实现(个性化修改)

    在上篇文章中,我们实现了 URP 下的菲涅尔基础效果,我们在这篇文章中,对其进行自定义化修改。

    楠溪泽岸的博客 2063

    SurfaceControlViewHost使用介绍

    可以看到,主要用途:是把一个进程的View显示到另外一个进程里面。

    chadm.xiang 1285

    AI大模型应用开发实战:从RAG系统构建到本地模型部署

    在人工智能领域,大语言模型(LLM)已成为驱动应用创新的核心引擎。其工作原理基于Transformer架构,通过海量数据预训练获得强大的语言理解和生成能力。然而,模型本身存在知识过时、易产生幻觉等局限性,这催生了检索增强生成(RAG)等关键技术。RAG通过将外部知识库与模型结合,有效提升了回答的准确性和时效性,其技术价值在于将通用大模型能力与特定领域知识无缝融合,是实现智能问答、知识管理等场景落地的关键。在实际工程实践中,构建一个生产级的RAG系统涉及文档处理、向量化检索与提示词工程等多个环节,而将模型服务

    weixin_34049948的博客 357

    基于OpenCV的围棋终局识别与胜负判定系统实现

    计算机视觉是人工智能领域的关键技术,它使计算机能够从数字图像或视频中获取、处理和分析信息。其核心原理在于通过图像处理算法提取特征,并基于这些特征进行识别、分类和测量。在工程实践中,计算机视觉技术为自动化、智能化应用提供了强大支持,广泛应用于工业检测、自动驾驶、医疗影像分析等领域。本文聚焦于一个具体的应用场景:利用OpenCV库实现围棋终局识别。通过图像预处理、棋盘检测与透视校正、交叉点定位等步骤,结合围棋规则逻辑,构建了一套从棋盘图像自动判定胜负的解决方案。该方案涉及自适应二值化、霍夫变换、连通域分析等关键

    weixin_29100927的博客 280

    从零部署AI大模型:本地RAG系统搭建与实战指南

    大语言模型作为当前人工智能领域的核心技术,通过海量数据预训练获得了强大的语言理解和生成能力。其核心原理基于Transformer架构,通过自注意力机制处理序列数据,实现了从通用对话到专业任务的广泛适应性。这项技术的核心价值在于将自然语言转化为可执行的智能交互,极大地降低了人机沟通的门槛。在实际应用场景中,企业常面临如何让大模型掌握私有、最新知识的问题,这正是RAG(检索增强生成)技术发挥作用的领域。通过将外部知识库向量化并与大模型结合,RAG有效解决了模型幻觉和知识陈旧等痛点。本文聚焦于如何在个人工作站本地

    362

    电压抬升电路设计

    一、实验目的 掌握集成运放电压放大电路设计基本方法。 掌握基本仪器使用方法(电源、信号发生器、示波器)。 二、实验内容及结果 实验内容 基于集成运放设计一传感器信号采集电路。传感器输出信号在±50mV,频率为100Hz以内,模数转换器允许输入电压在0~5V,要求设计传感器与模数转换器之间的信号采集电路,实现传感器信号放大10倍,并适合模数转换器的输入。模数转换器的输入电阻为1KHz,设计电路时,可使用1KHz电阻作为信号采集电路负载,代替模数转换器。 实验具体要求如下: (1)确定电路形式,说明电压转

    Safaearth的博客 4万+

    Monocle2在R 4.3环境下的终极避坑指南:从安装到可视化全流程解析

    本文提供了在R 4.3环境下安装和运行Monocle2的完整解决方案,重点解决了依赖包兼容性、源码修改及BEAM分析报错等关键问题。文章详细解析了从环境准备、依赖包处理、源码安装验证到从Seurat对象转换、拟时轨迹构建、高级可视化及性能优化的全流程,旨在帮助用户顺利完成单细胞拟时分析。

    weixin_29206669的博客 1355

    零基础AI应用开发实战:从RAG到智能体的完整学习路径与项目搭建

    这次我们来看一个面向AI应用开发的零基础学习资源。这个资源以“全748集”的体量,号称是目前B站最全最细的AI应用开发教程,主打2026最新版、零代码入门和快速就业。对于想进入AI应用开发领域,但又担心门槛高、路径不清晰的新手来说,这类资源的核心价值在于能否提供一条清晰、可执行、能落地的学习路径。 本文不会复述那748集视频的具体内容,而是会基于这个主题,为你拆解一套从零到一的AI应用开发实战学习框架。我们将重点关注: 一个真正的AI应用开发者需要掌握哪些核心技能栈?如何从零开始搭建一个可运行的AI应用项目

    weixin_34343000的博客 389

    SPD5 集线器协议内容解析

    ​ 若不同SPD5 Hub后面的本地侧设备同时发送请求,则是22和23、24的混合过程,先通过LID裁决,再通过HID裁决,这里的LID是本地设备的,若LID一致,则看HID,由于SPD5 Hub的本地侧设备HID均为111,因此实际上是比较SPD5 Hub的HID,这个过程在前文提到,SPD5 Hub会转换HID。​ 若MR27[4]=1且MR27[3:0]=1,如果MR51[3:0]=1时,发送IBI,并且MR48[7]置1,将GETSTATUS CCC的待处理中断位[3:0]更新为0001。

    weixin_50591344的博客 3860

    AIGC工程师实战:从零搭建私有知识库大模型全流程指南

    大语言模型作为当前人工智能领域的核心技术,通过海量数据预训练获得了强大的通用语言理解和生成能力。其核心原理是基于Transformer架构的自注意力机制,能够捕捉文本中的长距离依赖关系。这一技术价值在于将通用认知能力与特定领域知识结合,解决企业数据安全、知识时效性和专业术语理解等痛点。在应用场景上,私有化部署的大模型能够深度整合企业内部非公开数据,如产品手册、流程文档和客服记录,形成可控、可进化的专属智能体。本文聚焦于检索增强生成和模型微调两大技术路径,详细解析如何利用LangChain、LlamaInde

    weixin_33690367的博客 440

    基于 Qt C++ 开发一套西门子量子测量系统的控制与数据采集平台

    sensorIdCombo->addItems({"QTS-100-001 (温度)", "QPG-200-001 (压力)", "QDS-300-001 (位移)"});precisionTable->setHorizontalHeaderLabels({"传感器ID", "类型", "标称精度", "实际精度", "校准状态"});QWidget *dispWidget = createSensorWidget("量子位移", "mm (±1μm)", 50.0, 0.001);// 传感器状态更新。

    寒寒豆豆软件公司的博客 254

    精雕软件(JDpaint) 5.5 绿色版

    精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

    上一篇: RAG系统学习之——RAG技术详解与实战指南
    下一篇: 大模型学习之——初步了解:量化、LoRA、QLoRA
    Jack_abu
    博客等级 码龄10年 633粉丝 78原创
    评论
    成就一亿技术人!
    拼手气红包6.0元
    还能输入1000个字符
     
     条评论被折叠 查看
    添加红包

    请填写红包祝福语或标题

    个

    红包个数最小为10个

    元

    红包金额最低5元

    当前余额3.43元 前往充值 >
    需支付:10.00元
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    Jack_abu

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付元
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值