通过Milvus和Langchain快速构建基于百炼大模型的LLM问答系统

简介: 阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。

本文主要演示了如何使用 Milvus 和 LangChain 快速构建一个基于阿里云百炼大模型的 LLM 问答系统。

前期准备

  • 服务开通

本文采用的Embedding模型为阿里云百炼平台的 通用文本向量-v2,采用的LLM为 通义千问-Max-Latest。本文相关的API-KEY可在百炼平台进行创建。更多Embedding和LLM模型的支持可以参照LangChain官方网站



  • 依赖库安装
pip install pymilvus langchain dashscope


RAG问答系统

  • 方案架构

整体方案架构如下图所示,主要包含以下几个处理过程:

  • 知识库预处理:用户通过LangChain sdk可以切分文本,作为向量Embedding模型的输入
  • 知识库存储:Embedding模型(样例采用通用文本向量-v2)将输入文本向量化存储至阿里云Milvus向量数据库
  • 向量相似性检索:Embedding模型将用户输入问题向量化之后,利用阿里云Milvus提供的索引检索出相关联的Retrieved文档集合
  • RAG对话验证:用户通过LangChain sdk,以向量相似性检索结果作为上下文,将问题Prompt至LLM模型中(样例采用通义千问-Max-Latest),获取最终答案。可以通过直接提问至LLM模型获取的答案进行对比验证


  • 相关示例代码

本样例以Milvus官方文档作为输入,验证RAG对话增强效果。


  1. 使用Langchain对输入文件进行预处理,切分文本作为向量输入
import os
from langchain.document_loaders import WebBaseLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.vectorstores.milvus import Milvus
from langchain.schema.runnable import RunnablePassthrough
from langchain.prompts import PromptTemplate
from langchain_community.embeddings import DashScopeEmbeddings
from langchain.chains import LLMChain
# 设置Miluvs Collection名称
COLLECTION_NAME = 'release_note_qa'
# 设置向量维度
DIMENSION = 1536
DASHSCOPE_API_KEY = "sk-xxxxxxxxxxxxxx"
os.environ["DASHSCOPE_API_KEY"] = DASHSCOPE_API_KEY
loader = WebBaseLoader([
    "https://github.com/milvus-io/web-content/blob/master/localization/v2.5.x/site/zh/release_notes.md"
])
documents = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=256)
# 使用LangChain将输入文档安照chunk_size切分
docs = text_splitter.split_documents(documents)


2.    使用向量模型Embedding切分后的文档,并存储到Milvus数据库

# 设置embedding模型为DashScope(可以替换成自己模型)
embeddings = DashScopeEmbeddings(model="text-embedding-v2")
# 创建connection,host为阿里云Milvus的访问域名
connection_args={"host": "c-xxxxxxxxxxxx.milvus.aliyuncs.com", "port": "19530", "user": "root", "password": "xxxxxxx"}
# 创建Collection
vector_store = Milvus(
    embedding_function=embeddings,
    connection_args=connection_args,
    collection_name=COLLECTION_NAME,
    drop_old=True,
).from_documents(
    docs,
    embedding=embeddings,
    collection_name=COLLECTION_NAME,
    connection_args=connection_args,
)


3.    针对输入问题在向量库进行相似性检索,把结果作为Retrieved文档集合

# 利用Milvus向量数据库进行相似性检索
question = "Milvus修复过哪些空指针异常的bug?"
# 默认为4条输出结果
result = vector_store.similarity_search(question, 4)
for hits in result:
    for hit in hits:
        print(hit)
        print("\n")


4.    使用Langchain在线调用通义大模型服务,将问题和Retrieved文档作为输入,获取最终答案,与直接提问进行对比

from langchain_community.llms import Tongyi
from langchain_core.prompts import PromptTemplate
llm = Tongyi(model_name="qwen-max-latest")
# 将上述相似性检索的结果作为retriever,提出问题输入到LLM之后,获取检索增强之后的回答
retriever = vector_store.as_retriever()
question = "Milvus修复过哪些空指针异常的bug?"
rag_template = """
请以如下context中的内容作为参考给出答案, 如果你不知道答案,就说不知道,不要胡编乱造答案。 
{context}
Question: {question}
Helpful Answer:"""
rag_prompt = PromptTemplate.from_template(rag_template)
rag_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | rag_prompt
    | llm
)
print(rag_chain.invoke(question))
# answer
# 根据提供的信息,Milvus 修复了以下与空指针异常相关的 bug:
# 1. **修正了 null 表达式对 JSON 字段不起作用的问题(#40457)**  
#    这个问题可能涉及在处理 JSON 字段时,未正确处理 null 值导致的异常。
# 2. **修正了 null 偏移的并发问题(#40363、#40365)**  
#    该问题可能与在多线程环境下处理 null 偏移时引发的竞争条件或空指针异常有关。
# 如果需要更详细的信息,建议参考具体的 issue 或代码更改记录。
question = "Milvus修复过哪些空指针异常的bug?"
template = """
如果你不知道答案,就说不知道,不要胡编乱造答案 
Question: {question}
Helpful Answer:
"""
prompt = PromptTemplate.from_template(template)
chain = prompt | llm
print(chain.invoke({"question": question}))
# answer
# 不知道。  
# Milvus 是一个开源的向量数据库项目,其开发和维护过程中确实会修复各种 bug,包括可能存在的空指针异常(Null Pointer Exception)。然而,具体的 bug 修复记录需要查阅 Milvus 的官方代码仓库(如 GitHub 上的提交历史、Issue 列表或 Release Notes)才能获得详细信息。如果没有直接查询这些资源,我无法提供确切的答案,因此在这里明确表示“不知道”。  
# 如果你有兴趣了解,可以访问 [Milvus GitHub 仓库](https://github.com/milvus-io/milvus) 并搜索相关的 Issue 或 Pull Request,或者查看其官方文档和更新日志。


立即体验

如果您想体验阿里云Milvus的相关能力,欢迎在阿里云官网搜索向量检索服务Milvus版进行体验。

产品新用户也可免费领取1个月试用资格

此外,阿里云为了回馈新老用户,推出了重大优惠

阿里云向量检索服务 Milvus 版  限时年付5折! 新购续费均可|每个uid仅限参与1次(非同人)购买地址


相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
6月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
2220 1
|
6月前
|
机器学习/深度学习 人工智能 计算机视觉
让AI真正"看懂"世界:多模态表征空间构建秘籍
本文深入解析多模态学习的两大核心难题:多模态对齐与多模态融合,探讨如何让AI理解并关联图像、文字、声音等异构数据,实现类似人类的综合认知能力。
2264 6
|
6月前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
5月前
|
人工智能 API 开发工具
构建AI智能体:一、初识AI大模型与API调用
本文介绍大模型基础知识及API调用方法,涵盖阿里云百炼平台密钥申请、DashScope SDK使用、Python调用示例(如文本情感分析、图像文字识别),助力开发者快速上手大模型应用开发。
2059 17
构建AI智能体:一、初识AI大模型与API调用
|
5月前
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
490 41
|
6月前
|
存储 人工智能 数据可视化
从零构建能自我优化的AI Agent:Reflection和Reflexion机制对比详解与实现
AI能否从错误中学习?Reflection与Reflexion Agent通过生成-反思-改进循环,实现自我优化。前者侧重内容精炼,后者结合外部研究提升准确性,二者分别适用于创意优化与知识密集型任务。
1051 9
从零构建能自我优化的AI Agent:Reflection和Reflexion机制对比详解与实现
|
5月前
|
缓存 物联网 PyTorch
使用TensorRT LLM构建和运行Qwen模型
本文档介绍如何在单GPU和单节点多GPU上使用TensorRT LLM构建和运行Qwen模型,涵盖模型转换、引擎构建、量化推理及LoRA微调等操作,并提供详细的代码示例与支持矩阵。
1388 2

热门文章

最新文章