Serie GPT de frotamiento manual: chatgpt + langchain realiza un robot de interpretación de libros

ChatGPT ya es bien conocido, pero aún se encuentra en una etapa muy temprana de exploración sobre cómo usar modelos grandes para crear aplicaciones. Varias tecnologías de aplicación basadas en modelos grandes también emergen sin cesar. Este artículo le presentará un marco de aplicación basado en un modelo grande: langchain. Langchain integra todo lo necesario para crear una aplicación basada en modelos a gran escala. Los estudiantes que están familiarizados con las aplicaciones web de Java deben estar muy familiarizados con el marco de arranque de primavera.Podemos decir que langchain es el arranque de primavera para aplicaciones de modelos de lenguaje grandes. Este artículo proporcionará a los desarrolladores de aplicaciones de modelo de lenguaje grande un proyecto de muestra basado en langchain, para que todos puedan mejorar aún más el rendimiento de la ingeniería rápida.

1. ¿Qué requisito cumple esta demo?

Este proyecto de muestra implementará un robot que leerá el contenido de los libros electrónicos (en formato epub) desde la ruta especificada y responderá las preguntas de los usuarios según el contenido de los libros leídos. Es decir, el robot intérprete de libros mencionado en el título.

2. Preparar el entorno de desarrollo

  • Instale Python 3.8 o superior, la última versión es 3.11 .

  • En este ejemplo, se utiliza jupyter-lab como entorno de desarrollo, por lo que se debe instalar jupyter-lab en la computadora .

  • Registre una cuenta openai y configure la variable de entorno OPENAI_API_KEY.

  • Usamos redis para guardar el contenido de los libros cargados, por lo que debemos implementar un servicio redis. A diferencia del servicio redis que solemos usar en aplicaciones web generales, esta vez necesitamos instalar redis-stack:

    docker run -d -p 13333:8001 -p 10001:6379 redis/redis-stack:latest
    
  • Luego instale las dependencias de python relevantes

    pip install openai
    pip install langchain
    pip install redis
    pip install unstructured
    
  • Instale pandoc para cargar libros electrónicos epub.

  • Prepare el contenido del libro electrónico, cree un directorio resources/epub en el directorio del proyecto (es decir, el mismo directorio que su archivo ipynb) y coloque el libro electrónico en formato epub en este directorio. Para su comodidad, el autor ha preparado para usted los recursos de libros electrónicos utilizados en los ejemplos , y puede descargarlos y utilizarlos.

3. importar paquetes requeridos

import requests
from langchain.embeddings import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.redis import Redis
from langchain.document_loaders import TextLoader
from langchain.docstore.document import Document
from langchain.document_loaders import UnstructuredEPubLoader
import os
from langchain import OpenAI, VectorDBQA
from langchain.agents.agent_toolkits import (
   create_vectorstore_agent,
   VectorStoreToolkit,
   VectorStoreRouterToolkit,
   VectorStoreInfo,
)

4. Cargue el contenido del libro epub

Enumere todos los libros electrónicos en el directorio resources/epub y luego lea todos los libros electrónicos en el diccionario de documentos. Preste atención al código a continuación, solo mantenemos el texto con categoría = Texto narrativo, otros tipos de texto incluyen: Título, Texto sin categoría, Elemento de lista, etc.

dir = 'resources/epub'
fs = os.listdir(dir)
data={
    
    }
documents={
    
    }
for f in fs:
    path = dir + '/' + f
    if (os.path.isfile(path)):
        print(path)
        loader = UnstructuredEPubLoader(path,mode='elements')
        data[f]=loader.load()

for book in data.keys():
    documents[book]=[]
    for seg in data[book]:
        cat = seg.metadata['category']
        if cat == 'NarrativeText':
            documents[book].append(seg)
resources/epub/California - Sara Benson.epub
resources/epub/LP_台湾_en.epub

5. Almacene los datos en la base de datos redis en formato de vector de palabra.

Crear un índice para cada libro. Utilice el título del libro como el nombre del índice.

redis_url='redis://localhost:10001'
embeddings=OpenAIEmbeddings()
for book in documents.keys():
    rds = Redis.from_documents(documents[book],embeddings,redis_url=redis_url,index_name=book)

6. Intenta hacer una consulta más similar

rds = Redis.from_existing_index(embeddings, redis_url=redis_url, index_name='LP_台湾_en.epub')
query = '台湾日月潭'
rds.similarity_search(query)
[Document(page_content='鯉魚潭;\r\nLǐyú Tán), a pretty willow-lined pond with a lush green mountain\r\nbackdrop, you’ll find hot springs', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'}),
 Document(page_content='(明月溫泉 Míngyuè Wēnquán;  2661 7678; www.fullmoonspa.net; 1 Lane\r\n85, Wulai St; unlimited time public pools NT$490) One of\r\nthe more stylish hotels along the tourist street, Full Moon has mixed\r\nand nude segregated pools with nice views over the Tongshi River. Its\r\nprivate rooms feature wooden tubs. The hotel also offers rooms for\r\novernight stays from NT$2700. Go for the lower cheaper rooms as the\r\nviews are surprisingly better than higher up.', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'}),
 Document(page_content='7 Sun Moon Lake (Click\r\nhere) is the largest body of water in Taiwan and boasts a\r\nwatercolour background ever changing with the season and light. Although\r\nthe area is packed with Chinese tourists these days it’s still\r\nremarkably easy to get away from the crowds on the many trails and\r\ncycling paths. Loop down to the old train depot at Checheng to explore\r\n1950s Taiwan, or head to Shuili to see the last working snake kiln. No\r\nmatter what, don’t miss the region’s high-mountain oolong tea: it’s some\r\nof the finest in the world.', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'}),
 Document(page_content='(鯉魚潭露營區 Lǐyú Tán Lùyíng qū;  03-865 5678; per site NT$800) The\r\ncampground is 1km south of the lake off Hwy 9 and features showers,\r\nbarbecue areas and covered sites.', metadata={'source': 'resources/epub/LP_台湾_en.epub', 'page_number': 1, 'category': 'NarrativeText'})]

5. Crea un vector_store_agent

El uso de VectorStoreRouterToolkit puede tomar varios libros juntos como entrada y cambiar al libro más adecuado de acuerdo con la pregunta del usuario. Otro conjunto de herramientas opcional es VectorStoreToolkit(vectorstore_info=vectorstore_info). La idea de usar este conjunto de herramientas es almacenar varios libros bajo un índice, y el robot sintetizará el contenido relevante de todos los libros para responder. Además, si el usuario solicita proporcionar la fuente, el robot extraerá el ' source' en los metadatos y la respuesta.

llm = OpenAI(temperature=0)
rdss = {
    
    }
infos=[]
for book in documents.keys():
    rdss[book] = Redis.from_existing_index(embeddings, redis_url=redis_url, index_name=book)
    vectorstore_info = VectorStoreInfo(
        name="hotest_travel_advice_about_"+ book,
        description="the best travel advice about " + book,
        vectorstore=rdss[book]
    )
    infos.append(vectorstore_info)

#使用VectorStoreRouterToolkit可以将多本书一起作为输入,根据用户的问题切换到最合适的书。
toolkit = VectorStoreRouterToolkit(vectorstores=infos, llm=llm)
agent_executor = create_vectorstore_agent(
    llm=llm,
    toolkit=toolkit,
    verbose=True)

6. En este punto, podemos verificar cómo se ve el mensaje

print(agent_executor.agent.llm_chain.prompt)
input_variables=['input', 'agent_scratchpad'] output_parser=None partial_variables={} template='You are an agent designed to answer questions about sets of documents.\nYou have access to tools for interacting with the documents, and the inputs to the tools are questions.\nSometimes, you will be asked to provide sources for your questions, in which case you should use the appropriate tool to do so.\nIf the question does not seem relevant to any of the tools provided, just return "I don\'t know" as the answer.\n\n\nhotest_travel_advice_about_California - Sara Benson.epub: Useful for when you need to answer questions about hotest_travel_advice_about_California - Sara Benson.epub. Whenever you need information about the best travel advice about California - Sara Benson.epub you should ALWAYS use this. Input should be a fully formed question.\nhotest_travel_advice_about_LP_台湾_en.epub: Useful for when you need to answer questions about hotest_travel_advice_about_LP_台湾_en.epub. Whenever you need information about the best travel advice about LP_台湾_en.epub you should ALWAYS use this. Input should be a fully formed question.\n\nUse the following format:\n\nQuestion: the input question you must answer\nThought: you should always think about what to do\nAction: the action to take, should be one of [hotest_travel_advice_about_California - Sara Benson.epub, hotest_travel_advice_about_LP_台湾_en.epub]\nAction Input: the input to the action\nObservation: the result of the action\n... (this Thought/Action/Action Input/Observation can repeat N times)\nThought: I now know the final answer\nFinal Answer: the final answer to the original input question\n\nBegin!\n\nQuestion: {input}\nThought:{agent_scratchpad}' template_format='f-string' validate_template=True

7. Eso es todo, puedes hacer preguntas sobre el libro.

Tenga en cuenta que el robot encontrará automáticamente los libros más relevantes para responder a sus preguntas en función de sus preguntas.

resp = agent_executor.run("日月潭什么时候去旅游比较好,请用中文回答")
print(resp)
> Entering new AgentExecutor chain...
 I should use hotest_travel_advice_about_LP_台湾_en.epub to answer this question
Action: hotest_travel_advice_about_LP_台湾_en.epub
Action Input: 日月潭什么时候去旅游比较好
Observation:  The best time to visit Sun Moon Lake is during autumn and early spring (October to December and March to April). May has seasonal monsoon rains, and typhoons are a problem from June to September, though if there is no typhoon, you can certainly visit.
Thought: I now know the final answer
Final Answer: 日月潭最好的旅游时间是秋季和初春(10月到12月和3月到4月)。五月有季节性的季风雨,6月到9月有台风,但是如果没有台风,你也可以去旅游。

> Finished chain.
日月潭最好的旅游时间是秋季和初春(10月到12月和3月到4月)。五月有季节性的季风雨,6月到9月有台风,但是如果没有台风,你也可以去旅游。

por fin

Dado que es solo un proyecto de muestra, este proyecto solo se implementa a través de jupyter lab, no es un proyecto real que pueda proporcionar ningún servicio web, y parte de la lógica también se simplifica. Por ejemplo, solo se pueden leer los libros electrónicos en formato epub que el autor colocó en el directorio del proyecto con anticipación, pero los usuarios no pueden cargar libros electrónicos libremente y proporcionar a los usuarios servicios de respuesta. Para otro ejemplo, si la operación de carga de libros electrónicos se ejecuta dos veces seguidas, los datos duplicados quedarán en la base de datos.Este ejemplo no incluye la lógica de deduplicación. Dado que el objetivo principal de este proyecto es explorar el papel de langchain en el desarrollo de aplicaciones de modelos a gran escala, en lugar de realizar un robot comercial en detalle, el autor cree que agregar mucha lógica comercial para manejar los detalles conducirá a la parte más importante del proyecto. Parte de él está enterrado por muchos códigos no centrales, lo que no es propicio para que los lectores establezcan una comprensión clara de langchain. Por lo tanto, cuando los lectores apliquen el código de este ejemplo a sus propios proyectos, deben prestar atención a mejorar varios detalles para evitar defectos en el proyecto.

código base del proyecto de demostración

Ir a github .

Supongo que te gusta

Origin blog.csdn.net/marlinlm/article/details/130453281
Recomendado
Clasificación