Med en liten mengde kode og noen nyttige biblioteker kan du bygge dette kraftige dokumentanalyseverktøyet.

Å trekke ut innsikt fra dokumenter og data er avgjørende for å ta informerte beslutninger. Imidlertid oppstår personvernhensyn ved håndtering av sensitiv informasjon. LangChain, i kombinasjon med OpenAI API, lar deg analysere dine lokale dokumenter uten å måtte laste dem opp online.

De oppnår dette ved å holde dataene dine lokalt, bruke innebygging og vektorisering for analyse, og utføre prosesser i miljøet ditt. OpenAI bruker ikke data sendt inn av kunder via deres API for å trene modellene deres eller forbedre tjenestene deres.

Sette opp miljøet ditt

Lag et nytt virtuelt Python-miljø. Dette vil sikre at det ikke er noen bibliotekversjonskonflikter. Kjør deretter følgende terminalkommando for å installere de nødvendige bibliotekene.

pip install langchain openai tiktoken faiss-cpu pypdf

Her er en oversikt over hvordan du vil bruke hvert bibliotek:

  • Langkjede: Du skal bruke den til å lage og administrere språklige kjeder for tekstbehandling og analyse. Det vil gi moduler for dokumentlasting, tekstdeling, innebygging og vektorlagring.
  • OpenAI: Du vil bruke den til å kjøre spørringer og få resultater fra en språkmodell.
  • tiktoken: Du vil bruke den til å telle antall tokens (tekstenheter) i en gitt tekst. Dette er for å holde styr på token-antallet når du samhandler med OpenAI API som belastes basert på antall tokens du bruker.
  • FAISS: Du vil bruke den til å opprette og administrere et vektorlager, som tillater rask gjenfinning av lignende vektorer basert på deres innebygging.
  • PyPDF: Dette biblioteket trekker ut tekst fra PDF-filer. Det hjelper med å laste PDF-filer og trekke ut teksten for videre behandling.

Etter at alle bibliotekene er installert, er miljøet ditt nå klart.

Få en OpenAI API-nøkkel

Når du sender forespørsler til OpenAI API, må du inkludere en API-nøkkel som en del av forespørselen. Denne nøkkelen lar API-leverandøren bekrefte at forespørslene kommer fra en legitim kilde og at du har de nødvendige tillatelsene for å få tilgang til funksjonene.

For å få en OpenAI API-nøkkel, fortsett til OpenAI-plattform.

Klikk deretter på under kontoprofilen øverst til høyre Se API-nøkler. De API-nøkler siden vises.

Klikk på Lag ny hemmelighetnøkkel knapp. Gi nøkkelen et navn og klikk på Opprett ny hemmelig nøkkel. OpenAI vil generere API-nøkkelen din som du bør kopiere og oppbevare et trygt sted. Av sikkerhetsgrunner vil du ikke kunne se den igjen via OpenAI-kontoen din. Hvis du mister denne hemmelige nøkkelen, må du generere en ny.

Den fullstendige kildekoden er tilgjengelig i en GitHub-depot.

Importere de nødvendige bibliotekene

For å kunne bruke bibliotekene som er installert i ditt virtuelle miljø, må du importere dem.

from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI

Legg merke til at du importerer avhengighetsbibliotekene fra LangChain. Dette lar deg bruke spesifikke funksjoner i LangChain-rammeverket.

Laster dokumentet for analyse

Start med å lage en variabel som inneholder API-nøkkelen din. Du vil bruke denne variabelen senere i koden for autentisering.

# Hardcoded API key
openai_api_key = "Your API key"

Det anbefales ikke å hardkode API-nøkkelen din hvis du planlegger å dele koden med tredjeparter. For produksjonskode som du har som mål å distribuere, bruk en miljøvariabel i stedet.

Deretter oppretter du en funksjon som laster et dokument. Funksjonen skal laste en PDF eller en tekstfil. Hvis dokumentet ikke er noen av delene, bør funksjonen heve a ValueError.

defload_document(filename):
if filename.endswith(".pdf"):
loader = PyPDFLoader(filename)
documents = loader.load()
elif filename.endswith(".txt"):
loader = TextLoader(filename)
documents = loader.load()
else:
raise ValueError("Invalid file type")

Etter at du har lastet inn dokumentene, oppretter du en CharacterTextSplitter. Denne splitteren deler de innlastede dokumentene i mindre biter basert på tegn.

 text_splitter = CharacterTextSplitter(chunk_size=1000, 
chunk_overlap=30, separator="\n")

return text_splitter.split_documents(documents=documents)

Å dele opp dokumentet sikrer at bitene har en håndterlig størrelse og fortsatt er forbundet med en eller annen overlappende kontekst. Dette er nyttig for oppgaver som tekstanalyse og informasjonsinnhenting.

Spørre etter dokumentet

Du trenger en måte å spørre det opplastede dokumentet på for å få innsikt fra det. For å gjøre det, lag en funksjon som tar en spørsmål streng og en retriever som input. Det skaper da en Henting QA eksempel ved å bruke retriever og en forekomst av OpenAI-språkmodellen.

defquery_pdf(query, retriever):
qa = RetrievalQA.from_chain_type(llm=OpenAI(openai_api_key=openai_api_key),
chain_type="stuff", retriever=retriever)
result = qa.run(query)
print(result)

Denne funksjonen bruker den opprettede QA-forekomsten til å kjøre spørringen og skrive ut resultatet.

Opprette hovedfunksjonen

Hovedfunksjonen vil kontrollere den generelle programflyten. Det vil ta brukerinndata for et dokumentfilnavn og laste det dokumentet. Deretter oppretter du en ÅpneAIEbeddings eksempel for innebygging og konstruksjon en vektor butikk basert på de innlastede dokumentene og innebygginger. Lagre denne vektorbutikken til en lokal fil.

Deretter laster du det vedvarende vektorlageret fra den lokale filen. Gå deretter inn i en løkke der brukeren kan legge inn spørringer. De hoved- funksjonen sender disse spørringene til query_pdf funksjon sammen med den vedvarende vektorbutikkens retriever. Sløyfen vil fortsette til brukeren går inn i "exit".

defmain():
filename = input("Enter the name of the document (.pdf or .txt):\n")
docs = load_document(filename)
embeddings = OpenAIEmbeddings(openai_api_key=openai_api_key)
vectorstore = FAISS.from_documents(docs, embeddings)
vectorstore.save_local("faiss_index_constitution")
persisted_vectorstore = FAISS.load_local("faiss_index_constitution", embeddings)
query = input("Type in your query (type 'exit' to quit):\n")

while query != "exit":
query_pdf(query, persisted_vectorstore.as_retriever())
query = input("Type in your query (type 'exit' to quit):\n")

Embeddings fanger opp semantiske forhold mellom ord. Vektorer er en form der du kan representere tekstbiter.

Denne koden konverterer tekstdataene i dokumentet til vektorer ved å bruke innebyggingene generert av ÅpneAIEbeddings. Den indekserer deretter disse vektorene ved hjelp av FAISS, for effektiv gjenfinning og sammenligning av lignende vektorer. Dette er det som gjør det mulig å analysere det opplastede dokumentet.

Til slutt, bruk __name__ == "__main__"-konstruksjonen å kalle hovedfunksjonen hvis en bruker kjører programmet frittstående:

if __name__ == "__main__":
main()

Denne appen er en kommandolinjeapplikasjon. Som en utvidelse kan du bruk Streamlit for å legge til et nettgrensesnitt til appen.

Utføre dokumentanalyse

For å utføre dokumentanalyse, lagre dokumentet du vil analysere i samme mappe som prosjektet, og kjør deretter programmet. Den vil be om navnet på dokumentet du vil analysere. Skriv inn det fulle navnet, og skriv deretter inn spørringer som programmet skal analysere.

Skjermbildet nedenfor viser resultatene av å analysere en PDF.

Følgende utdata viser resultatene av å analysere en tekstfil som inneholder kildekode.

Sørg for at filene du vil analysere er i enten PDF- eller tekstformat. Hvis dokumentene dine er i andre formater, kan du konvertere dem til PDF-format ved hjelp av nettbaserte verktøy.

Forstå teknologien bak store språkmodeller

LangChain forenkler opprettelsen av applikasjoner ved hjelp av store språkmodeller. Dette betyr også at den abstraherer hva som skjer bak kulissene. For å forstå nøyaktig hvordan applikasjonen du lager fungerer, bør du gjøre deg kjent med teknologien bak store språkmodeller.