5 minutos, combinado con LangChain para construir su propio sistema generativo inteligente de respuesta a preguntas

Con la aparición de los modelos de lenguaje grande (LLM, Large Language Model), las personas han descubierto que la inteligencia artificial generativa tiene una gran importancia en muchos campos, como la generación de imágenes, la redacción de documentos, la búsqueda de información, etc. Con la diversificación de los escenarios de LLM, todos esperan que LLM pueda desempeñar sus poderosas funciones en el campo vertical. Sin embargo, debido a las limitaciones de capacitación y puntualidad de los modelos grandes en conjuntos de datos de dominios específicos, al crear productos de dominios verticales basados ​​en LLM, es necesario ingresar bases de conocimiento específicas en modelos grandes para capacitación o razonamiento.

Hay dos métodos comúnmente utilizados: ajuste fino y ajuste rápido. El primero es para entrenar aún más el modelo existente a través del nuevo conjunto de datos, que tiene un alto costo de entrenamiento y poca puntualidad. Este último es más flexible en términos de costo de capacitación y oportunidad.

Este artículo presentará cómo construir un exclusivo sistema inteligente de respuesta a preguntas basado en el servicio de búsqueda en la nube del motor del volcán y la plataforma Ark basada en el método de aprendizaje rápido. Usando la tecnología de incrustación (incrustación), el contenido del conjunto de datos se convierte en vectores a través del modelo de incrustación, y luego estos vectores y datos se guardan con la ayuda de la capacidad de búsqueda de vectores del servicio de búsqueda en la nube del motor de volcanes ESCloud . En la etapa de consulta, a través de la consulta de similitud, se comparan los resultados topK asociados, y luego estos resultados se proporcionan a LLM complementados con palabras clave y, finalmente, se generan las respuestas correspondientes. Aquí, se seleccionará un modelo grande del cuadrado del modelo grande de la plataforma Ark del motor del volcán como LLM para inferir la respuesta. El marco de código abierto LangChain se selecciona como marco de aplicación para construir un modelo de lenguaje de extremo a extremo para simplificar el enlace de todo el modelo de chat.

Búsqueda en la nube Preparación de VectorStore

  1. Inicie sesión en el servicio de búsqueda en la nube de Volcano Engine, cree un clúster de instancias y seleccione 7.10 para la versión del clúster.
  2. Seleccione el modelo apropiado en el cuadrado de modelo grande de la plataforma Ark del motor del volcán y verifique las instrucciones de llamada API

  1. Preparación de mapas
PUT langchain_faq
{
  "mappings": {
    "properties": {
      "message": { "type": "text" },
      "message_embedding": { "type": "knn_vector", "dimension": 768 },
      "metadata": { "type": "text" }
    }
  },
  "settings": {
    "index": {
      "refresh_interval": "10s",
      "number_of_shards": "3",
      "knn": true,
      "knn.space_type": "cosinesimil",
      "number_of_replicas": "1"
    }
  }
}

Listo para el cliente

  1. Instalación de dependencia
pip install volcengine --user
pip install langchain --user
  1. inicialización
#Embedding
from langchain.embeddings import HuggingFaceEmbeddings
#VectorStore
from langchain.vectorstores import OpenSearchVectorSearch
#LLM Base
from langchain.llms.base import LLM
#Document loader
from langchain.document_loaders import WebBaseLoader
#LLM Cache
from langchain.cache import InMemoryCache
#Volcengine
from volcengine.ApiInfo import ApiInfo
from volcengine import Credentials
from volcengine.base.Service import Service
from volcengine.ServiceInfo import ServiceInfo

import json
import os
from typing import Optional, List, Dict, Mapping, Any

#加载Embeddings,这里使用huggingFace 作为embedding
embeddings = HuggingFaceEmbeddings()

# 启动llm的缓存
llm_cache = InMemoryCache()

preparación MaaS

Seleccionamos un modelo de la plataforma de modelos grandes Volcano Engine Ark. Este paso se puede ver en la llamada API en la esquina superior derecha después de seleccionar el modelo.

maas_host = "maas-api.ml-platform-cn-beijing.volces.com"
api_chat = "chat"
API_INFOS = {api_chat: ApiInfo("POST", "/api/v1/" + api_chat, {}, {}, {})}

class MaaSClient(Service):
    def __init__(self, ak, sk):
        credentials = Credentials.Credentials(ak=ak, sk=sk, service="ml_maas", region="cn-beijing")
        self.service_info = ServiceInfo(maas_host, {"Accept": "application/json"}, credentials, 60, 60, "https")
        self.api_info = API_INFOS
        super().__init__(self.service_info, self.api_info)

client = MaaSClient(os.getenv("VOLC_ACCESSKEY"), os.getenv("VOLC_SECRETKEY"))

#引入LLM Base,构造Volc GLM Client, 用于和LLM 对话
from langchain.llms.base import LLM
class ChatGLM(LLM):
    @property
    def _llm_type(self) -> str:
        return "chatglm"
    def _construct_query(self, prompt: str) -> Dict:
        query = "human_input is: " + prompt
        return query
    @classmethod
    def _post(cls, query: Dict) -> Any:
        request = ({
            "model": {
                "name": "chatglm-130b"
            },
            "parameters": {
                "max_tokens": 2000,
                "temperature": 0.8
            },
            "messages": [{
                "role": "user",
                "content": query
            }]
        })
        print(request)
        resp = client.json(api=api_chat, params={}, body=json.dumps(request))
        return resp
    def _call(self, prompt: str, 
        stop: Optional[List[str]] = None) -> str:
        query = self._construct_query(prompt=prompt)
        resp = self._post(query=query)
        return resp

escribir conjunto de datos

这里我们利用 LangChain 的 Loader 导入一些 Web 的数据集,然后利用 HuggingFaceEmbeddings (768 维度)生成特征值。用 VectorStore 写入云搜索服务 ESCloud 的向量索引。

# Document loader
from langchain.document_loaders import WebBaseLoader
loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()
# Split
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(chunk_size = 500, chunk_overlap = 0)
all_splits = text_splitter.split_documents(data)
#Embeddings
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings()
#VectorStore 
# URL 为云搜索VectorStore的访问URL,
# http_auth 为访问云搜索的用户密码
from langchain.vectorstores import OpenSearchVectorSearch
vectorstore = OpenSearchVectorSearch.from_documents(
        documents = all_splits,
        embedding = HuggingFaceEmbeddings(),
        opensearch_url = "URL", 
        http_auth = ("user", "password"),
        verify_certs = False,
        ssl_assert_hostname = False,
        index_name = "langchain_faq",
        vector_field ="message_embedding",
        text_field = "message",
        metadata_field = "message_metadata",
        ssl_show_warn = False,)

查询 + Retriever

query = "What are the approaches to Task Decomposition?"
docs = vectorstore.similarity_search(
        query,
        vector_field="message_embedding",
        text_field="message",
        metadata_field="message_metadata",)
retriever = vectorstore.as_retriever(search_kwargs={"vector_field": "message_embedding", "text_field":"message", "metadata_field":"message_metadata"})        

LLM Chat

这里选择了大模型平台中的 ChatG**

调用 ChatAPI,这里会使用 LangChain 自带的 Prompt,结合 Query,给 LLM 然后发送出去。

from langchain.chains import RetrievalQA
llm = ChatGLM()
retriever = vectorstore.as_retriever(search_kwargs={"vector_field": "message_embedding", "text_field":"message", "metadata_field":"message_metadata"})
qa_chain = RetrievalQA.from_chain_type(llm,retriever=retriever)
qa_chain({"query": query})

调试可以看到提示词:

回答:

以上就是基于火山引擎云搜索服务和方舟平台构建专属智能问答系统的实践,欢迎大家登陆火山引擎控制台操作!


云搜索服务 ESCloud 兼容 Elasticsearch、Kibana 等软件及常用开源插件,提供结构化、非结构化文本的多条件检索、统计、报表,可以实现一键部署、弹性扩缩、简化运维,快速构建日志分析、信息检索分析等业务能力。

了解更多产品详情:www.volcengine.com/product/es

Supongo que te gusta

Origin juejin.im/post/7257705589140783165
Recomendado
Clasificación