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

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 阿里云向量检索服务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推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
9天前
|
存储 传感器 人工智能
LLM智能体设计手册:14项关键技术构建下一代智能体新范式
本文深入解析大语言模型(LLM)智能体的架构设计与关键技术,涵盖记忆机制、工具使用、规划推理等14项核心内容,全面剖析智能体如何突破传统LLM限制,实现更强大的自主行为与环境交互能力。
78 3
存储 人工智能 机器人
29 0
|
21天前
|
人工智能 自然语言处理 数据可视化
手把手教你用LLM图转换器构建知识图谱:从文本到知识的智能转换
本文介绍如何利用大型语言模型(LLM)自动化构建知识图谱,涵盖核心技术、实现方法、优化策略及多领域应用,助力从非结构化文本中高效提取结构化知识。
|
1月前
|
机器学习/深度学习 算法 大数据
构建数据中台,为什么“湖仓一体”成了大厂标配?
在大数据时代,数据湖与数据仓库各具优势,但单一架构难以应对复杂业务需求。湖仓一体通过融合数据湖的灵活性与数据仓的规范性,实现数据分层治理、统一调度,既能承载海量多源数据,又能支撑高效分析决策,成为企业构建数据中台、推动智能化转型的关键路径。
|
2月前
|
人工智能 自然语言处理 数据可视化
AI-Compass LLM评估框架:CLiB中文大模型榜单、OpenCompass司南、RAGas、微软Presidio等构建多维度全覆盖评估生态系统
AI-Compass LLM评估框架:CLiB中文大模型榜单、OpenCompass司南、RAGas、微软Presidio等构建多维度全覆盖评估生态系统
 AI-Compass LLM评估框架:CLiB中文大模型榜单、OpenCompass司南、RAGas、微软Presidio等构建多维度全覆盖评估生态系统
|
2月前
|
缓存 异构计算 Docker
构建高性能LLM推理服务的完整方案:单GPU处理172个查询/秒、10万并发仅需15美元/小时
本文将通过系统性实验不同的优化技术来构建自定义LLaMA模型服务,目标是高效处理约102,000个并行查询请求,并通过对比分析确定最优解决方案。
153 0
构建高性能LLM推理服务的完整方案:单GPU处理172个查询/秒、10万并发仅需15美元/小时
|
2月前
|
数据采集 存储 分布式计算
一文读懂数据中台架构,高效构建企业数据价值
在数字化时代,企业面临数据分散、难以统一管理的问题。数据中台架构通过整合、清洗和管理数据,打破信息孤岛,提升决策效率。本文详解其核心组成、搭建步骤及常见挑战,助力企业高效用数。
1013 24
|
3月前
|
数据采集 存储 人工智能
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
|
3月前
|
人工智能 API 开发者
智能体(AI Agent)开发实战之【LangChain】(一)接入大模型输出结果
LangChain 是一个开源框架,专为构建与大语言模型(LLMs)相关的应用设计。通过集成多个 API、数据源和工具,助力开发者高效构建智能应用。本文介绍了 LangChain 的环境准备(如安装 LangChain、OpenAI 及国内 DeepSeek 等库)、代码实现(以国内开源大模型 Qwen 为例,展示接入及输出结果的全流程),以及核心参数配置说明。LangChain 的灵活性和强大功能使其成为开发对话式智能应用的理想选择。

热门文章

最新文章