本文主要演示了如何使用 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对话增强效果。
- 使用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次(非同人)购买地址