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

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 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次(非同人)购买地址


相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
9天前
|
存储 机器学习/深度学习 人工智能
使用 LangChain + Higress + Elasticsearch 构建 RAG 应用
本文介绍了如何利用LangChain、Higress和Elasticsearch快速构建RAG(检索增强生成)应用,实现企业知识的智能检索与问答。首先通过LangChain解析Markdown文档并写入Elasticsearch,接着部署Higress AI网关并配置ai-search插件以整合私有知识库与在线搜索功能。最后,通过实际案例展示了RAG查询流程及结果更新机制,确保内容准确性和时效性。文章还提供了相关参考资料以便进一步学习。
193 34
|
1天前
|
SQL 机器学习/深度学习 监控
构建数据中枢:数据中台指标体系如何赋能企业运营
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
7天前
|
人工智能 自然语言处理 机器人
阿里云百炼xWaytoAGI共学课 DAY4 - 小白也能在阿里云百炼手搓Qwen3,构建Qwen3赋能的英语学习智能体“妮娜”
本次课程通过构建"英语老师妮娜"AI应用,教授Qwen3系列模型特性及阿里云百炼平台的MCP服务、工作流集成技术。重点学习模型选择、智能体开发流程,涵盖单词卡片生成、结构化分析、Notion存档及二维码分享功能,适合开发者、产品经理等人群掌握AI应用落地方法。
|
1月前
|
存储 人工智能 自然语言处理
LangChain RAG入门教程:构建基于私有文档的智能问答助手
本文介绍如何利用检索增强生成(RAG)技术与LangChain框架构建基于特定文档集合的AI问答系统。通过结合检索系统和生成机制,RAG能有效降低传统语言模型的知识局限与幻觉问题,提升回答准确性。文章详细展示了从环境配置、知识库构建到系统集成的全流程,并提供优化策略以改进检索与响应质量。此技术适用于专业领域信息检索与生成,为定制化AI应用奠定了基础。
195 5
LangChain RAG入门教程:构建基于私有文档的智能问答助手
|
Shell Android开发
Android系统 adb shell push/pull 禁止特定文件
Android系统 adb shell push/pull 禁止特定文件
870 1
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
242 0
|
开发工具 Android开发
Mac 安卓(Android) 配置adb路径
Mac 安卓(Android) 配置adb路径
1110 0
|
2月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
9月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
245 0
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
560 5

热门文章

最新文章