【RAG落地利器】向量数据库Milvus教程:如何实现MetaData检索过滤

RAG知识库全链路调优:从混合检索到工程化落地的实战指南 检索增强生成(RAG)是一种将外部知识库与大语言模型结合的技术,其核心原理是通过检索相关文档片段,为模型提供生成答案所需的准确上下文,从而有效缓解模型幻觉问题。这项技术的核心价值在于,它能让通用大模型具备处理特定领域、私有化知识的能力,极大地拓展了其在企业知识管理、智能客服、文档问答等场景的应用潜力。要实现一个稳定、高效的RAG系统,关键在于对全链路进行精细调优,而非简单的流程拼接。其中,混合检索结合了稠密向量检索与稀疏关键词检索的优势,能显著提升召回内容的相关性;而独立的重排模型则作为质量守门员,对初步召 阅读详情

TrustRAG项目地址🌟:github.com/gomate-comm…

可配置的模块化RAG框架

环境依赖

  • 安装 Docker

安装 Milvus

Milvus 在 Milvus 存储库中提供了 Docker Compose 配置文件。要使用 Docker Compose 安装 Milvus,只需运行

# Download the configuration file
$ wget https://github.com/milvus-io/milvus/releases/download/v2.5.3/milvus-standalone-docker-compose.yml -O docker-compose.yml

# Start Milvus
$ sudo docker compose up -d

Creating milvus-etcd  ... done
Creating milvus-minio ... done
Creating milvus-standalone ... done

version: '3.5'

services:
  etcd:
    container_name: milvus-etcd
    image: quay.io/coreos/etcd:v3.5.16
    environment:
      - ETCD_AUTO_COMPACTION_MODE=revision
      - ETCD_AUTO_COMPACTION_RETENTION=1000
      - ETCD_QUOTA_BACKEND_BYTES=4294967296
      - ETCD_SNAPSHOT_COUNT=50000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/etcd:/etcd
    command: etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd
    healthcheck:
      test: ["CMD", "etcdctl", "endpoint", "health"]
      interval: 30s
      timeout: 20s
      retries: 3

  minio:
    container_name: milvus-minio
    image: minio/minio:RELEASE.2023-03-20T20-16-18Z
    environment:
      MINIO_ACCESS_KEY: minioadmin
      MINIO_SECRET_KEY: minioadmin
    ports:
      - "9001:9001"
      - "9000:9000"
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/minio:/minio_data
    command: minio server /minio_data --console-address ":9001"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 20s
      retries: 3

  standalone:
    container_name: milvus-standalone
    image: milvusdb/milvus:v2.5.3
    command: ["milvus", "run", "standalone"]
    security_opt:
    - seccomp:unconfined
    environment:
      ETCD_ENDPOINTS: etcd:2379
      MINIO_ADDRESS: minio:9000
    volumes:
      - ${DOCKER_VOLUME_DIRECTORY:-.}/volumes/milvus:/var/lib/milvus
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9091/healthz"]
      interval: 30s
      start_period: 90s
      timeout: 20s
      retries: 3
    ports:
      - "19530:19530"
      - "9091:9091"
    depends_on:
      - "etcd"
      - "minio"

networks:
  default:
    name: milvus

启动 Milvus 后, 名为milvus-standalone、milvus-minio和milvus-etcd的容器已启动。

  • milvus-etcd容器不向主机暴露任何端口,并将其数据映射到当前文件夹中的volumes/etcd 。
  • milvus-minio容器使用默认身份验证凭据在本地服务端口9090和9091 ,并将其数据映射到当前文件夹中的volumes/minio 。
  • milvus-standalone容器使用默认设置在本地服务端口19530 ,并将其数据映射到当前文件夹中的volumes/milvus

其中minio访问地址:http://localhost:9001/browser,登录密码和用户名均为minioadmin

在这里插入图片描述

停止并删除 Milvus

sudo docker compose down
sudo rm -rf volumes

可以按如下方式停止并删除该容器

安装图形化管理工具Attu

以下是整理后的 Markdown 文档:

# 从 Docker 运行 Attu

## 启动容器运行 Attu 的步骤

```bash
docker run -p 8000:3000 -e MILVUS_URL={milvus server IP}:19530 zilliz/attu:v2.4

确保 Attu 容器可以访问 Milvus IP 地址。启动容器后,打开 Web 浏览器并输入 http://{ Attu IP }:8000 以查看 Attu GUI。

运行 Attu Docker 的可选环境变量

范围例子必需的描述
MILVUS_URL192.168.0.1:19530否可选,Milvus 服务器 URL
数据库你的数据库否可选,默认数据库名称
ATTU_LOG_LEVEL信息否可选,设置 Attu 的日志级别
根证书路径/路径/到/根/证书否可选,根证书的路径
PRIVATE_KEY_PATH/路径/到/私人/密钥否可选,私钥路径
CERT_CHAIN_PATH/路径/到/证书/链否可选,证书链的路径
服务器名称你的服务器名称否可选,您的服务器名称
服务器端口服务器监听端口否可选,若未设置则默认为 3000

请注意,MILVUS_URL 地址必须是 Attu Docker 容器可以访问的地址。因此,“127.0.0.1”或“localhost”不起作用。

使用环境变量运行 Docker 容器

Attu SSL 示例

docker run -p 8000:3000 \
-v /your-tls-file-path:/app/tls \
-e ATTU_LOG_LEVEL=info  \
-e ROOT_CERT_PATH=/app/tls/ca.pem \
-e PRIVATE_KEY_PATH=/app/tls/client.key \
-e CERT_CHAIN_PATH=/app/tls/client.pem \
-e SERVER_NAME=your_server_name \
zilliz/attu:dev

自定义服务器端口示例

此命令允许您使用主机网络运行 docker 容器,并为服务器指定要侦听的自定义端口。

docker run --network host \
-v /your-tls-file-path:/app/tls \
-e ATTU_LOG_LEVEL=info  \
-e SERVER_NAME=your_server_name \
-e SERVER_PORT=8080 \
zilliz/attu:dev

安装访问:http://localhost:8000/#/connect 在这里插入图片描述
在这里插入图片描述

使用pymilvus操作Milvus

安装依赖环境:

pip install --upgrade pymilvus openai requests tqdm

以下是您提供的代码和说明的Markdown格式版本:

# 准备数据

我们使用Milvus文档2.4.x中的常见问题解答页面作为我们RAG中的私有知识,这对于简单的RAG管道来说是一个很好的数据源。

下载zip文件并将文档提取到文件夹`milvus_docs`中。

```bash
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs

我们从文件夹milvus_docs/en/faq中加载所有的markdown文件。对于每个文档,我们简单地用“#”来分隔文件中的内容,这样可以粗略地区分markdown文件各个主体部分的内容。

from glob import glob

text_lines = []

for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
    with open(file_path, "r") as file:
        file_text = file.read()

    text_lines += file_text.split("# ")

准备嵌入模型

我们初始化OpenAI客户端来准备嵌入模型。

from openai import OpenAI

openai_client = OpenAI()

定义一个函数,使用OpenAI客户端生成文本嵌入。我们使用text-embedding-3-small模型作为示例。

def emb_text(text):
    return (
        openai_client.embeddings.create(input=text, model="text-embedding-3-small")
        .data[0]
        .embedding
    )

生成测试嵌入并打印其维度和前几个元素。

test_embedding = emb_text("This is a test")
embedding_dim = len(test_embedding)
print(embedding_dim)
print(test_embedding[:10])

输出:

1536
[0.00988506618887186, -0.005540902726352215, 0.0068014683201909065, -0.03810417652130127, -0.018254263326525688, -0.041231658309698105, -0.007651153020560741, 0.03220026567578316, 0.01892443746328354, 0.00010708322952268645]

创建集合

from pymilvus import MilvusClient

milvus_client = MilvusClient(uri="./milvus_demo.db")

collection_name = "my_rag_collection"

至于MilvusClient的参数:

  • 将uri设置为本地文件(例如./milvus.db)是最方便的方法,因为它会自动利用Milvus Lite将所有数据存储在此文件中。
  • 如果你有大量数据,你可以在Docker或Kubernetes上搭建性能更佳的Milvus服务器。在此设置中,请使用服务器uri,例如http://localhost:19530,作为你的uri。
  • 如果您想使用Milvus的完全托管云服务Zilliz Cloud,请调整uri和token,它们对应于Zilliz Cloud中的公共端点和Api密钥。

检查该集合是否已存在,如果存在则将其删除。

if milvus_client.has_collection(collection_name):
    milvus_client.drop_collection(collection_name)

使用指定的参数创建一个新的集合。

如果我们不指定任何字段信息,Milvus会自动创建一个默认id字段作为主键,以及一个vector字段用于存储向量数据。保留的JSON字段用于存储非架构定义的字段及其值。

milvus_client.create_collection(
    collection_name=collection_name,
    dimension=embedding_dim,
    metric_type="IP",  # Inner product distance
    consistency_level="Strong",  # Strong consistency level
)

将数据加载到Milvus中

遍历文本行,创建嵌入,然后将数据插入Milvus。

这里新增了一个字段text,是集合架构中未定义的字段,它将被自动添加到保留的JSON动态字段中,在高层次上可以将其视为普通字段。

from tqdm import tqdm

data = []

for i, line in enumerate(tqdm(text_lines, desc="Creating embeddings")):
    data.append({"id": i, "vector": emb_text(line), "text": line})

milvus_client.insert(collection_name=collection_name, data=data)

输出:

Creating embeddings: 100%|██████████| 72/72 [00:27<00:00,  2.67it/s]

{'insert_count': 72,
 'ids': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71],
 'cost': 0}

检索查询数据

让我们指定一个有关Milvus的常见问题。

question = "How is data stored in milvus?"

在集合中搜索问题并检索语义前3个匹配。

search_res = milvus_client.search(
    collection_name=collection_name,
    data=[
        emb_text(question)
    ],  # 使用`emb_text`函数将问题转换为嵌入向量
    limit=3,  # 返回前3个结果
    search_params={"metric_type": "IP", "params": {}},  # 内积距离
    output_fields=["text"],  # 返回text字段
)

让我们看一下查询的搜索结果。

import json

retrieved_lines_with_distances = [
    (res["entity"]["text"], res["distance"]) for res in search_res[0]
]
print(json.dumps(retrieved_lines_with_distances, indent=4))

输出:

[
    [
        " Where does Milvus store data?\n\nMilvus deals with two types of data, inserted data and metadata. \n\nInserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).\n\nMetadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.\n\n###",
        0.7883545756340027
    ],
    [
        "How does Milvus handle vector data types and precision?\n\nMilvus supports Binary, Float32, Float16, and BFloat16 vector types.\n\n- Binary vectors: Store binary data as sequences of 0s and 1s, used in image processing and information retrieval.\n- Float32 vectors: Default storage with a precision of about 7 decimal digits. Even Float64 values are stored with Float32 precision, leading to potential precision loss upon retrieval.\n- Float16 and BFloat16 vectors: Offer reduced precision and memory usage. Float16 is suitable for applications with limited bandwidth and storage, while BFloat16 balances range and efficiency, commonly used in deep learning to reduce computational requirements without significantly impacting accuracy.\n\n###",
        0.6757288575172424
    ],
    [
        "How much does Milvus cost?\n\nMilvus is a 100% free open-source project.\n\nPlease adhere to [Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) when using Milvus for production or distribution purposes.\n\nZilliz, the company behind Milvus, also offers a fully managed cloud version of the platform for those that don't want to build and maintain their own distributed instance. [Zilliz Cloud](https://zilliz.com/cloud) automatically maintains data reliability and allows users to pay only for what they use.\n\n###",
        0.6421123147010803
    ]
]

使用LLM获取RAG响应

将检索到的文档转换为字符串格式。

context = "\n".join(
    [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances]

语义检索以及MetaData检索过滤实现

以官方教程为例,我在TrustRAG中对Milvus进行了封装改造:

官方教程:milvus.io/docs/build-… TrusRAG实现代码MilvusEngine:github.com/gomate-comm…

MilvusEngine实现如下:

from pymilvus import MilvusClient, DataType
from typing import List, Dict, Any, Optional
import numpy as np
from openai import OpenAI
from trustrag.modules.retrieval.embedding import EmbeddingGenerator
from typing import Union
class MilvusEngine:
    def __init__(
        self,
        collection_name: str,
        embedding_generator: EmbeddingGenerator,
        milvus_client_params: Dict[str, Any] = {"uri": "./milvus_demo.db"},
        vector_size: int = 1536,
        metric_type: str = "IP",  # Inner product distance
        consistency_level: str = "Strong",  # Strong consistency level
    ):
        """
        Initialize the Milvus vector store.

        :param collection_name: Name of the Milvus collection.
        :param embedding_generator: An instance of EmbeddingGenerator to generate embeddings.
        :param milvus_client_params: Dictionary of parameters to pass to MilvusClient.
        :param vector_size: Size of the vectors.
        :param metric_type: Distance metric for vector comparison (default is inner product).
        :param consistency_level: Consistency level for the collection (default is strong).
        """
        self.collection_name = collection_name
        self.vector_size = vector_size
        self.metric_type = metric_type
        self.consistency_level = consistency_level
        self.embedding_generator = embedding_generator

        # Initialize MilvusClient with provided parameters
        self.client = MilvusClient(**milvus_client_params)

        # Create collection if it doesn't exist
        if not self.client.has_collection(self.collection_name):
            self.client.create_collection(
                collection_name=self.collection_name,
                dimension=self.vector_size,
                metric_type=self.metric_type,
                consistency_level=self.consistency_level,
            )

    def upload_vectors(
        self, vectors: Union[np.ndarray, List[List[float]]],
        payload: List[Dict[str, Any]],
        batch_size: int = 256
    ):
        """
        Upload vectors and payload to the Milvus collection.

        :param vectors: A numpy array or list of vectors to upload.
        :param payload: A list of dictionaries containing the payload for each vector.
        :param batch_size: Number of vectors to upload in a single batch.
        """
        if not isinstance(vectors, np.ndarray):
            vectors = np.array(vectors)
        if len(vectors) != len(payload):
            raise ValueError("Vectors and payload must have the same length.")

        data = []
        for i, (vector, payload_item) in enumerate(zip(vectors, payload)):
            data.append({"id": i, "vector": vector.tolist(), **payload_item})

        self.client.insert(collection_name=self.collection_name, data=data)

    def search(
        self, text: str,
        query_filter: str = None,
        limit: int = 5
    ) -> List[Dict[str, Any]]:
        """
        Search for the closest vectors in the collection based on the input text.

        :param text: The text query to search for.
        :param query_filter: Optional filter to apply to the search.
        :param limit: Number of closest results to return.
        :return: List of payloads from the closest vectors.
        """
        # Generate embedding using the provided embedding generator
        vector = self.embedding_generator.generate_embeddings([text])

        # Search for closest vectors in the collection
        search_result = self.client.search(
            collection_name=self.collection_name,
            data=[vector[0]],  # Use the first (and only) embedding
            limit=limit,
            search_params={"metric_type": self.metric_type, "params": {}},
            output_fields=["*"],  # Return all fields
            filter=query_filter,
        )

        # Extract payloads from search results
        payloads = [hit["entity"] for hit in search_result[0]]
        return payloads

    def build_filter(self, conditions: List[Dict[str, Any]]) -> str:
        """
        Build a Milvus filter from a list of conditions.

        :param conditions: A list of conditions, where each condition is a dictionary with:
                          - key: The field name to filter on.
                          - value: The value to match (can be a string, number, or other supported types).
        :return: A Milvus filter dictionary.
        """
        filter_conditions = []
        for condition in conditions:
            key = condition.get("key")
            value = condition.get("value")
            if key and value is not None:
                filter_conditions.append(f"{key} == '{value}'")

        return " and ".join(filter_conditions) if filter_conditions else None

使用如下:

from trustrag.modules.retrieval.embedding import SentenceTransformerEmbedding
from trustrag.modules.engine.milvus import MilvusEngine
if __name__ == '__main__':
    # 初始化 MilvusEngine
    local_embedding_generator = SentenceTransformerEmbedding(model_name_or_path=r"H:\pretrained_models\mteb\all-MiniLM-L6-v2", device="cuda")
    milvus_engine = MilvusEngine(
        collection_name="my_collection",
        embedding_generator=local_embedding_generator,
        milvus_client_params={"uri": "http://localhost:19530"},
        vector_size=384
    )

    documents = [
        {"name": "SaferCodes", "images": "https://safer.codes/img/brand/logo-icon.png",
         "alt": "SaferCodes Logo QR codes generator system forms for COVID-19",
         "description": "QR codes systems for COVID-19.\nSimple tools for bars, restaurants, offices, and other small proximity businesses.",
         "link": "https://safer.codes", "city": "Chicago"},
        {"name": "Human Practice",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/373036-94d1e190f12f2c919c3566ecaecbda68-thumb_jpg.jpg?buster=1396498835",
         "alt": "Human Practice -  health care information technology",
         "description": "Point-of-care word of mouth\nPreferral is a mobile platform that channels physicians\u2019 interest in networking with their peers to build referrals within a hospital system.\nHospitals are in a race to employ physicians, even though they lose billions each year ($40B in 2014) on employment. Why ...",
         "link": "http://humanpractice.com", "city": "Chicago"},
        {"name": "StyleSeek",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/3747-bb0338d641617b54f5234a1d3bfc6fd0-thumb_jpg.jpg?buster=1329158692",
         "alt": "StyleSeek -  e-commerce fashion mass customization online shopping",
         "description": "Personalized e-commerce for lifestyle products\nStyleSeek is a personalized e-commerce site for lifestyle products.\nIt works across the style spectrum by enabling users (both men and women) to create and refine their unique StyleDNA.\nStyleSeek also promotes new products via its email newsletter, 100% personalized ...",
         "link": "http://styleseek.com", "city": "Chicago"},
        {"name": "Scout",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/190790-dbe27fe8cda0614d644431f853b64e8f-thumb_jpg.jpg?buster=1389652078",
         "alt": "Scout -  security consumer electronics internet of things",
         "description": "Hassle-free Home Security\nScout is a self-installed, wireless home security system. We've created a more open, affordable and modern system than what is available on the market today. With month-to-month contracts and portable devices, Scout is a renter-friendly solution for the other ...",
         "link": "http://www.scoutalarm.com", "city": "Chicago"},
        {"name": "Invitation codes", "images": "https://invitation.codes/img/inv-brand-fb3.png",
         "alt": "Invitation App - Share referral codes community ",
         "description": "The referral community\nInvitation App is a social network where people post their referral codes and collect rewards on autopilot.",
         "link": "https://invitation.codes", "city": "Chicago"},
        {"name": "Hyde Park Angels",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/61114-35cd9d9689b70b4dc1d0b3c5f11c26e7-thumb_jpg.jpg?buster=1427395222",
         "alt": "Hyde Park Angels - ",
         "description": "Hyde Park Angels is the largest and most active angel group in the Midwest. With a membership of over 100 successful entrepreneurs, executives, and venture capitalists, the organization prides itself on providing critical strategic expertise to entrepreneurs and ...",
         "link": "http://hydeparkangels.com", "city": "Chicago"},
        {"name": "GiveForward",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/1374-e472ccec267bef9432a459784455c133-thumb_jpg.jpg?buster=1397666635",
         "alt": "GiveForward -  health care startups crowdfunding",
         "description": "Crowdfunding for medical and life events\nGiveForward lets anyone to create a free fundraising page for a friend or loved one's uncovered medical bills, memorial fund, adoptions or any other life events in five minutes or less. Millions of families have used GiveForward to raise more than $165M to let ...",
         "link": "http://giveforward.com", "city": "Chicago"},
        {"name": "MentorMob",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/19374-3b63fcf38efde624dd79c5cbd96161db-thumb_jpg.jpg?buster=1315734490",
         "alt": "MentorMob -  digital media education ventures for good crowdsourcing",
         "description": "Google of Learning, indexed by experts\nProblem: Google doesn't index for learning. Nearly 1 billion Google searches are done for \"how to\" learn various topics every month, from photography to entrepreneurship, forcing learners to waste their time sifting through the millions of results.\nMentorMob is ...",
         "link": "http://www.mentormob.com", "city": "Chicago"},
        {"name": "The Boeing Company",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/49394-df6be7a1eca80e8e73cc6699fee4f772-thumb_jpg.jpg?buster=1406172049",
         "alt": "The Boeing Company -  manufacturing transportation", "description": "",
         "link": "http://www.boeing.com", "city": "Berlin"},
        {"name": "NowBoarding \u2708\ufe0f",
         "images": "https://static.above.flights/img/lowcost/envelope_blue.png",
         "alt": "Lowcost Email cheap flights alerts",
         "description": "Invite-only mailing list.\n\nWe search the best weekend and long-haul flight deals\nso you can book before everyone else.",
         "link": "https://nowboarding.club/", "city": "Berlin"},
        {"name": "Rocketmiles",
         "images": "https://d1qb2nb5cznatu.cloudfront.net/startups/i/158571-e53ddffe9fb3ed5e57080db7134117d0-thumb_jpg.jpg?buster=1361371304",
         "alt": "Rocketmiles -  e-commerce online travel loyalty programs hotels",
         "description": "Fueling more vacations\nWe enable our customers to travel more, travel better and travel further. 20M+ consumers stock away miles & points to satisfy their wanderlust.\nFlying around or using credit cards are the only good ways to fill the stockpile today. We've built the third way. Customers ...",
         "link": "http://www.Rocketmiles.com", "city": "Berlin"}

    ]
    # vectors = milvus_engine.embedding_generator.generate_embeddings([doc["description"] for doc in documents])
    # print(vectors.shape)
    # payload = [doc for doc in documents]

    # Upload vectors and payload
    # milvus_engine.upload_vectors(vectors=vectors, payload=payload)
    
    # 直接检索
    results = milvus_engine.search(
        text="vacations travel",
        limit=5
    )
    # 打印结果
    for result in results:
        print(result)

    # 定义过滤条件
    conditions = [
        {"key": "city", "value": "Berlin", "operator": "like"},  # color like "red"
        # {"key": "likes", "value": 50, "operator": ">"}  # likes > 50
    ]


    # 构建过滤表达式
    filter_expr = milvus_engine.build_filter(conditions)
    print("Filter Expression:", filter_expr)

    # 执行搜索
    # 添加mtea过滤
    results = milvus_engine.search(
        text="vacations travel",
        query_filter=filter_expr,
        limit=5
    )

    # 打印结果
    for result in results:
        print(result)

在这里插入图片描述
检索结果如下: 在这里插入图片描述

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

想正式转到一些新兴的 AI 行业,不仅需要系统的学习AI大模型。同时也要跟已有的技能结合,辅助编程提效,或上手实操应用,增加自己的职场竞争力。

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

那么我作为一名热心肠的互联网老兵,我意识到有很多经验和知识值得分享给大家,希望可以帮助到更多学习大模型的人!至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

全套AGI大模型学习大纲+路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉 福利来袭优快云大礼包:《2025最全AI大模型学习资源包》免费分享,安全可点 👈

img

这份完整版的大模型 AI 学习资料已经上传优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

Ollama 可以在 Windows 上运行了 阅读详情

相关推荐

DeepSeek本地部署详细指南

通过上述步骤,你可以在本地成功部署DeepSeek模型,并通过Ollama或Open Web UI与模型进行交互。本地部署不仅能够保护数据隐私,还能根据需求灵活调整模型参数,满足不同场景下的使用需求。如果你在部署过程中遇到任何问题,可以在评论区留言,我们将一起解决。希望这篇教程能帮助你顺利部署DeepSeek模型,开启高效开发的新旅程!

m0_56896669的博客 14万+

一文彻底整明白,基于Ollama工具的LLM大语言模型Web可视化对话机器人部署指南

在上一篇博文中,我们在本地部署了**Llama 3 8B**参数大模型,并用 Python 写了一个控制台对话客户端,基本能愉快的与 Llama 大模型对话聊天了。但控制台总归太技术化,体验不是很友好,我们希望能有个类似 ChatGPT 那样的 Web 聊天对话界面,本博文就安排起来……

老牛啊 1万+

用ChromaDB构建大模型私有知识引擎:从向量检索到RAG落地

向量数据库是实现检索增强生成(RAG)的核心基础设施,其本质是将文本映射为高维语义向量,通过相似度计算跨越关键词搜索的语义鸿沟。相比传统倒排索引,向量检索能理解‘自动停一下’与‘服务熔断’的等价性,显著提升大模型对私有文档的理解准确率。ChromaDB凭借轻量架构、DuckDB+Parquet存储优化及与LangChain原生兼容等特性,成为中小规模RAG系统首选工具。本文聚焦工程落地细节,涵盖语义分块、嵌入模型选型、自适应查询、Prompt鲁棒设计及HNSW调优等关键实践,助力开发者快速构建可靠、可演进的

weixin_30785593的博客 443

使用ollama在本地部署llama3-8b大模型

使用ollama在本地部署llama3-8b大模型

weixin_39945822的博客 1万+

RAG实战:从知识检索到可信生成的工程化落地指南

RAG(检索增强生成)是一种将外部知识动态注入大语言模型的推理范式,其核心在于解耦检索、重排与生成环节,以平衡事实准确性与响应实时性。不同于微调依赖静态参数更新,RAG通过向量检索+规则增强+结构化提示,实现知识即插即用、结果可审计、组件可替换。它特别适用于政策更新频繁、监管要求严格、答案需溯源的金融、医疗、政务等场景。本文聚焦RAG在真实业务系统中的工程落地,涵盖语义切块、中文嵌入选型、混合检索设计、幻觉抑制策略等关键实践,直击90%项目失败的根源——把RAG当成‘加个数据库’,而非重构AI推理逻辑。

weixin_30652491的博客 381

RAG知识库全链路调优实战:从检索增强生成到工程化部署

检索增强生成(RAG)是一种将信息检索技术与大语言模型生成能力相结合的技术范式,旨在解决大模型在处理私有或动态知识时产生的“幻觉”问题。其核心原理是,当用户提问时,系统首先从外部知识库中检索相关文档片段,再将这些片段作为上下文提供给大模型,从而生成基于可靠来源的答案。这项技术的价值在于,它能够以较低成本动态引入和更新外部知识,相比全量微调更具经济性和可解释性,尤其适用于企业知识库、产品手册等需要频繁更新海量知识的应用场景。本文聚焦于RAG系统的全链路调优与项目实战,深入探讨了从文档处理、混合检索、重排到提示

weixin_30765577的博客 397

RAG系统实战:从检索增强生成原理到工程落地全流程详解

检索增强生成(RAG)是一种将信息检索与大语言模型生成能力相结合的技术架构,其核心原理是通过外部知识库检索相关文档,为模型提供实时、准确的上下文参考,从而有效缓解大模型的幻觉问题并扩展其知识边界。从技术实现看,RAG系统通常包含索引构建与查询生成两大阶段,涉及文档解析、文本分割、向量化、语义检索、提示工程等关键技术环节。在工程实践中,混合检索策略结合了稠密向量检索与稀疏关键词检索的优势,能显著提升召回精度;而通过元数据过滤、查询重写等进阶优化手段,可进一步改善系统在真实场景中的可用性。这些技术组合使得RAG

weixin_33726313的博客 335

Vector Graph RAG:融合向量检索与知识图谱,破解RAG多跳问答难题

在信息检索与知识问答领域,向量数据库通过将文本转化为高维向量并计算相似度,实现了高效的语义搜索,其核心原理是基于嵌入模型的表示学习。这项技术的价值在于能够从海量非结构化数据中快速找到语义相关的信息,广泛应用于推荐系统、智能客服和**检索增强生成**等场景。然而,面对需要串联多个知识点进行逻辑推理的**多跳问答**任务时,纯语义检索在捕捉实体间深层关系方面存在局限。知识图谱通过结构化的“实体-关系”网络,恰好能弥补这一不足,为推理提供明确的路径。Vector Graph RAG正是这一技术结合的产物,它通过在

weixin_30718391的博客 396

从向量存储到检索引擎:Milvus在RAG系统中的工程化实践

向量数据库是现代AI应用中的核心基础设施,它通过将非结构化数据(如文本、图像)转化为高维向量,并利用近似最近邻搜索(ANN)算法实现高效的语义检索。其技术原理基于嵌入模型将语义信息编码为向量空间中的点,相似性通过距离度量(如余弦相似度、欧氏距离)计算。这一技术为大规模语义搜索、推荐系统和检索增强生成(RAG)提供了基础支撑。在工程实践中,向量数据库的价值在于构建可扩展、低延迟的语义检索管道,其应用场景广泛覆盖智能问答、内容推荐和知识库搜索。本文以电子书语义检索系统为例,深入探讨如何将Milvus向量数据库从

weixin_34357887的博客 408

金融文档智能问答:从传统RAG到Agentic RAG的架构演进与实践

检索增强生成(RAG)技术通过结合外部知识库与大语言模型的生成能力,有效缓解了模型幻觉问题,提升了专业领域问答的准确性。其核心原理在于将用户查询与向量化文档片段进行语义匹配,检索出最相关的上下文信息,再交由大模型生成最终答案,从而将模型的通用知识与特定领域的精准信息相结合。这一技术在处理结构化与半结构化文档时展现出巨大价值,尤其在金融、法律等对事实准确性要求极高的场景中,能够基于财报、合同等文档提供有据可查的答案。Agentic RAG作为该技术的进阶范式,通过引入具备自主规划与决策能力的智能体(Agent

weixin_33850015的博客 527

LLM的MCP协议:初识MCP,搭建第一个MCP Server

MCP(Model Context Protocol),是一个开发的协议,标准化了应用程序如何为大模型提供上下文。MCP提供了一个标准的为LLM提供数据、工具的方式,使用MCP会更容易的构建Agent或者是基于LLM的复杂工作流。

Criss@陈磊 2万+

LangChain官方RAG架构实战拆解:从玩具Demo到生产级落地

RAG(检索增强生成)是一种将外部知识库与大语言模型协同工作的关键技术,其核心原理在于通过向量检索精准定位相关文档片段,再交由LLM进行语义整合与生成。技术价值体现在显著降低幻觉率、提升答案准确性与可溯源性,广泛应用于智能客服、企业知识库、金融研报分析等需强事实依据的场景。然而,真实工程落地远非调用as_retriever()或invoke()即可达成——它要求深入理解检索策略(如MMR重排序)、分块逻辑(chunk_size与overlap的权衡)、向量库选型(Chroma仅适合开发,Pinecone/W

weixin_33755649的博客 445

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 713

RAG实战:从文档处理到提示工程,构建精准企业知识问答系统

在人工智能应用领域,检索增强生成(RAG)技术正成为连接大语言模型(LLM)与私有化知识库的关键桥梁。其核心原理在于,通过语义检索技术从海量文档中精准定位相关信息,并将其作为上下文提供给大模型,从而有效缓解大模型普遍存在的“幻觉”与信息滞后问题。这项技术的核心价值在于,它将大模型的强大生成能力与传统信息检索的精确性相结合,为构建可靠、可控的AI应用提供了工程化解决方案。其典型的应用场景包括企业智能客服、内部知识库问答以及需要实时、准确信息的专业领域助手。本文将以实战视角,深入剖析构建一个生产级RAG系统的完

weixin_34072458的博客 461

Qt 5.9.1 32位下,手把手搞定周立功CAN二次开发库的加载与配置(含常见错误排查)

本文详细介绍了在Qt 5.9.1 32位环境下配置周立功CAN二次开发库的完整流程,包括环境准备、项目配置、常见错误排查及性能优化建议。特别针对MinGW 32bit环境,提供了.pro文件的精准配置和DLL部署策略,帮助开发者快速解决库文件匹配、编译报错和运行时问题,实现高效的CAN总线通信开发。

weixin_28717431的博客 356

一文读懂GPU通信互联技术:GPUDirect、NVLink与RDMA

GPUDirect是NVIDIA开发的一项技术,旨在实现GPU与其他设备(如网络接口卡NIC和存储设备)之间的直接通信和数据传输,而无需CPU的参与。传统上,数据在GPU和另一个设备之间传输时,必须通过CPU,这导致潜在的性能瓶颈和延迟增加。GPUDirect技术则通过绕过CPU,直接访问和传输数据,显著提高系统性能。NVLink是NVIDIA开发的一种高速、高带宽的互连技术,用于连接多个GPU之间或GPU与其他设备(如CPU、内存等)之间的通信。

异构算力老群群(在读985计算机博士生)的技术博客 7777

RAG技术实战:从零构建基于本地知识库的智能问答系统

检索增强生成(RAG)是连接通用大语言模型与私有领域知识的关键技术架构。其核心原理是通过向量化检索技术,将用户查询与知识库文档进行语义匹配,筛选出最相关的上下文片段,再交由大模型生成精准答案。这项技术的核心价值在于有效解决了大模型在专业场景下的幻觉、知识过时和领域深度不足三大痛点。在实际应用中,RAG系统通常遵循文档加载、文本分割、向量化索引、检索排序和提示生成的标准工作流。以企业智能客服、法律合同分析、个人知识管理等场景为例,通过结合LangChain框架、BGE嵌入模型和ChromaDB向量数据库,可以

weixin_30945039的博客 387

从零到一:高通QCS6490边缘AI开发板的Linux生态构建与实战避坑指南

本文详细介绍了在高通QCS6490边缘AI开发板上构建Linux生态系统的完整流程,包括开发环境准备、系统镜像构建与烧录、AI运行时环境配置、模型部署优化以及性能调试。重点解析了如何利用Hexagon DSP的高达12 TOPS AI算力,并提供了实战中的避坑指南和性能优化技巧,帮助开发者高效实现边缘AI应用从概念验证到产品落地的全过程。

eee77的博客 771

RAG系统性能优化实战:从缓存策略到检索加速,实现低成本高效响应

检索增强生成(RAG)技术通过结合信息检索与大语言模型,有效提升了问答系统的准确性与可靠性。其核心原理在于,先将用户查询转化为向量表示,在向量数据库中进行相似度检索,再将相关文档作为上下文输入大模型生成答案。这一架构的技术价值在于,既利用了外部知识库的实时性与准确性,又发挥了大模型的强大推理与生成能力,广泛应用于智能客服、知识库问答、文档分析等场景。然而,随着系统规模扩大,性能瓶颈与成本问题日益凸显,尤其是**向量检索**的延迟与**LLM调用**的高昂费用,成为工程实践中的核心挑战。本文聚焦于RAG系统的

weixin_34152820的博客 305

Excel数据透视表实战:分组折线图制作与动态分析指南

数据可视化是数据分析的关键环节,其核心原理在于将抽象数据转化为直观图形,以揭示趋势、对比差异。在众多图表类型中,折线图因其能清晰展示连续数据随时间或其他序列的变化趋势,而成为趋势分析的利器。其技术价值在于通过视觉编码,将多维数据关系降维呈现,从而辅助决策。在业务分析、运营监控等应用场景中,常需对比不同分组(如产品线、销售区域)在同一时间序列上的表现,这正是分组折线图要解决的核心问题。本文聚焦于利用Excel数据透视表这一强大工具,高效构建动态分组折线图,并深入探讨数据透视表在数据重塑和图表自动化中的实战应用

weixin_29057237的博客 382

基于通义千问2.5-7B-Instruct的技术深度解析

通义千问2.5-7B-Instruct是一个基于Transformer架构的大型语言模型,具有70亿参数。它通过自注意力机制和前馈神经网络处理输入序列,能够捕捉长距离依赖关系,适用于多种NLP任务。微调是指在预训练模型的基础上,使用特定任务的数据进行进一步训练,以使模型更好地适应特定任务。微调可以显著提高模型在特定任务上的性能。通义千问2.5-7B-Instruct是一个强大的语言模型,适用于多种NLP任务。通过深入理解其架构、微调方法和核心代码,可以更好地应用于实际场景。

zhangjiaofa的专栏 1570

Python RAG开发实战:从向量存储到高效检索的核心策略与优化

向量检索作为现代信息检索的核心技术,其原理是通过Embedding模型将文本映射为高维空间中的向量,并计算语义相似度来查找相关信息。这项技术的价值在于能够突破传统关键词匹配的局限,实现更智能、更精准的语义搜索。在工程实践中,它广泛应用于智能客服、知识库问答和内容推荐等场景。针对当前RAG(检索增强生成)应用中检索环节的常见痛点,如结果不精准、效率低下等问题,开发者需要掌握混合检索、元数据过滤等关键技术。其中,混合检索通过结合语义向量搜索与BM25等关键词检索方法,能有效提升召回率与准确性;而元数据过滤则能在

weixin_30855761的博客 323

构建企业级AI税务顾问:优化税收策略与合规

本文深入探讨了构建企业级AI税务顾问的重要性及其在实际应用中的价值。通过分析当前税务领域的挑战和问题,本文详细介绍了AI税务顾问的基本原理、技术架构、核心功能以及实践应用。文章以逐步分析的方式,从背景介绍、核心概念与联系、算法原理讲解、系统分析与架构设计、项目实战到最佳实践与展望,系统性地展示了如何利用AI技术优化税收策略并确保税务合规。文章旨在为企业和税务从业者提供实用的指导,推动AI在税务领域的创新与发展。在当前全球经济一体化的背景下,企业面临着越来越复杂的税务环境。首先,税收法规的复杂性日益增加。

AI天才研究院 1157

开源嵌入模型Nemotron 3 Embed:RAG应用中的高性能检索新选择

文本嵌入技术是自然语言处理的基础,它将文本转换为数值向量,从而让计算机能够理解和计算语义相似度。其核心原理是通过深度神经网络学习文本的分布式表示,将语义相近的文本映射到向量空间中相近的位置。这项技术的价值在于为下游任务如语义搜索、文本分类和聚类提供了统一的特征表示。在检索增强生成(RAG)和向量数据库等应用场景中,高质量的嵌入模型是保证召回精度的关键。近年来,开源模型生态快速发展,为开发者提供了更可控、更具成本效益的解决方案。其中,基于对比学习和指令微调训练的Nemotron 3 Embed模型,在检索任务

weixin_33863087的博客 330

PCL 利用RANSAC改进的ICP算法

本文介绍了一种基于RANSAC改进的ICP点云配准算法。算法原理部分阐述了在ICP迭代过程中使用RANSAC剔除错误匹配点对的方法。

点云侠的博客 196

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 本科生60行代码教你手搓GPT大模型,技术介绍堪比教程
下一篇: 2024清华大学:大模型安全实践白皮书(附42页完整PDF下载)
我爱学大模型
博客等级 码龄3年 7883粉丝 687原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值