<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Shae Bryant Smith</title>
    <description>The latest articles on Forem by Shae Bryant Smith (@sbsmith86).</description>
    <link>https://forem.com/sbsmith86</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F9087%2F1700409.jpeg</url>
      <title>Forem: Shae Bryant Smith</title>
      <link>https://forem.com/sbsmith86</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/sbsmith86"/>
    <language>en</language>
    <item>
      <title>AI-Powered Career Portfolios on Agentic Postgres where candidates have the power</title>
      <dc:creator>Shae Bryant Smith</dc:creator>
      <pubDate>Mon, 10 Nov 2025 14:23:16 +0000</pubDate>
      <link>https://forem.com/sbsmith86/ai-powered-career-portfolios-on-agentic-postgres-where-candidates-have-the-power-142c</link>
      <guid>https://forem.com/sbsmith86/ai-powered-career-portfolios-on-agentic-postgres-where-candidates-have-the-power-142c</guid>
      <description>&lt;h1&gt;
  
  
  SmartFolio: Multi-Source Career Portfolios with Conversational AI
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;SmartFolio is an AI-powered portfolio platform that aggregates career data from multiple sources (resumes, GitHub, LinkedIn) and makes it conversationally searchable using &lt;strong&gt;TimescaleDB Cloud (Tiger Data)&lt;/strong&gt; with &lt;strong&gt;pgvector&lt;/strong&gt; and &lt;strong&gt;pg_trgm&lt;/strong&gt; extensions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resume parsing&lt;/strong&gt; with GPT-4o → structured experiences/education/skills&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub project import&lt;/strong&gt; - auto-parses READMEs for project descriptions and tech stacks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn profile import&lt;/strong&gt; - paste raw text, AI extracts normalized data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversational chat&lt;/strong&gt; - ask natural language questions about candidates&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid search&lt;/strong&gt; - combines semantic (pgvector) + full-text (pg_trgm) retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grounded answers&lt;/strong&gt; - GPT-4o synthesizes responses using only retrieved context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provenance tracking&lt;/strong&gt; - every data point tagged with its source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://smartfolio.vercel.app/profile/shae" rel="noopener noreferrer"&gt;https://smartfolio.vercel.app/profile/shae&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/sbsmith86/smartfolio" rel="noopener noreferrer"&gt;https://github.com/sbsmith86/smartfolio&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;The modern career isn't linear—it's a portfolio of experiences across companies, open source contributions, side projects, and continuous learning. Yet traditional resumes flatten this richness into a chronological list.&lt;/p&gt;

&lt;p&gt;SmartFolio embraces the &lt;strong&gt;"portfolio career" paradigm&lt;/strong&gt; (HBR)[&lt;a href="https://hbr.org/2021/10/why-you-should-build-a-career-portfolio-not-a-career-path" rel="noopener noreferrer"&gt;https://hbr.org/2021/10/why-you-should-build-a-career-portfolio-not-a-career-path&lt;/a&gt;] where professionals curate diverse experiences rather than climbing a single ladder. By aggregating data from multiple sources and making it conversationally queryable, hiring managers can ask nuanced questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What PHP experience does this candidate have?" (retrieves jobs + GitHub projects)&lt;/li&gt;
&lt;li&gt;"Tell me about their leadership experience" (synthesizes across multiple roles)&lt;/li&gt;
&lt;li&gt;"What projects demonstrate full-stack skills?" (combines work history + open source)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Agentic Postgres Features Used
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Semantic Search with pgvector&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Every experience, education record, and skill is converted to a &lt;strong&gt;1536-dimensional embedding&lt;/strong&gt; using OpenAI's &lt;code&gt;text-embedding-3-small&lt;/code&gt; model. When you ask a question, it's also embedded, and we use pgvector's cosine distance operator (&lt;code&gt;&amp;lt;=&amp;gt;&lt;/code&gt;) to find semantically similar content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"contentType"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"textContent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;knowledge_embeddings&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="nv"&gt;"userId"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This captures &lt;strong&gt;meaning and context&lt;/strong&gt;, not just keyword matches. For example, "What Python experience" matches jobs mentioning Django, Flask, data science libraries—even if the job title doesn't include "Python Developer."&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Full-Text Search with pg_trgm&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;PostgreSQL's &lt;code&gt;pg_trgm&lt;/code&gt; extension provides trigram similarity matching for &lt;strong&gt;exact terms and acronyms&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"contentType"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"textContent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"textContent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;knowledge_embeddings&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="nv"&gt;"userId"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"textContent"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;
&lt;span class="k"&gt;LIMIT&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This complements semantic search by ensuring specific technologies (PHP, AWS, React), company names, and industry terms are matched precisely—even with typos or variations.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Hybrid Scoring&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We combine both approaches with a &lt;strong&gt;weighted blend&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hybridScore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;semanticScore&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fulltextScore&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;70% semantic similarity&lt;/strong&gt; - captures conceptual understanding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30% full-text similarity&lt;/strong&gt; - ensures keyword precision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system retrieves top candidates from each layer, merges them, and re-ranks by hybrid score to deliver the &lt;strong&gt;most relevant results&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Fluid Storage&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When you upload a resume, import GitHub projects, or paste LinkedIn data, GPT-4o parses the content and &lt;strong&gt;immediately generates embeddings&lt;/strong&gt;. There's no schema migration or manual indexing—new data becomes searchable instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// After creating an Experience record&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;embeddingText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;position&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; at &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;company&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;generateEmbedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;embeddingText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;prisma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$executeRaw&lt;/span&gt;&lt;span class="s2"&gt;`
  INSERT INTO knowledge_embeddings
    ("userId", "contentType", "contentId", "textContent", "embedding")
  VALUES
    (&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, 'experience', &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;experienceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;embeddingText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;::vector)
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;knowledge_embeddings&lt;/code&gt; table grows dynamically as users add more information.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Agent Pattern (MCP)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;SmartFolio follows the &lt;strong&gt;Model Context Protocol&lt;/strong&gt; pattern with specialized agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ingestion Agent (GPT-4o)&lt;/strong&gt; - normalizes and structures incoming data&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parses resumes → extracts experiences, education, skills&lt;/li&gt;
&lt;li&gt;Parses GitHub READMEs → extracts project descriptions, tech stacks&lt;/li&gt;
&lt;li&gt;Parses LinkedIn text → normalizes job titles, dates, companies&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Query Agent (GPT-4o)&lt;/strong&gt; - retrieves relevant context and synthesizes grounded answers&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Embeds the question&lt;/li&gt;
&lt;li&gt;Runs hybrid search to retrieve top 15 relevant items&lt;/li&gt;
&lt;li&gt;Builds context from retrieved experiences/education/skills&lt;/li&gt;
&lt;li&gt;Synthesizes answer using &lt;strong&gt;only&lt;/strong&gt; provided context (temp 0.3)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This separation ensures &lt;strong&gt;data quality on write&lt;/strong&gt; and &lt;strong&gt;intelligent responses on read&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Test
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visit the demo profile:&lt;/strong&gt; &lt;a href="https://smartfolio.vercel.app/profile/shae" rel="noopener noreferrer"&gt;https://smartfolio.vercel.app/profile/shae&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No login required&lt;/strong&gt; - the profile is publicly accessible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat is open by default&lt;/strong&gt; - try asking:

&lt;ul&gt;
&lt;li&gt;"What PHP experience does this candidate have?"&lt;/li&gt;
&lt;li&gt;"Tell me about their leadership experience"&lt;/li&gt;
&lt;li&gt;"What projects have they built?"&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click citations&lt;/strong&gt; - each answer includes clickable source citations that scroll to the relevant section&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expand tech panel&lt;/strong&gt; - see how hybrid search, pgvector, and pg_trgm work together&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Technical Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16.0.0&lt;/strong&gt; with App Router and Turbopack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TimescaleDB Cloud (Tiger Data)&lt;/strong&gt; - PostgreSQL with pgvector and pg_trgm extensions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prisma 6.18.0&lt;/strong&gt; - ORM with raw SQL for vector operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt; - GPT-4o for parsing/synthesis, text-embedding-3-small for embeddings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; - deployment and hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Implementation Details:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hybrid Search Optimization&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased result limit from 8 to 15 after diagnostic analysis&lt;/li&gt;
&lt;li&gt;Created &lt;code&gt;debug-chat-search.js&lt;/code&gt; tool to analyze search quality&lt;/li&gt;
&lt;li&gt;Discovered fulltext threshold (0.1) was filtering out relevant results&lt;/li&gt;
&lt;li&gt;Now retrieves 10+ items and generates 3+ citations for tech-specific queries&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Citation System&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compact inline pills instead of large boxes&lt;/li&gt;
&lt;li&gt;Shows company name + position: "Technical Lead at Lantern"&lt;/li&gt;
&lt;li&gt;Tooltips reveal full excerpts on hover&lt;/li&gt;
&lt;li&gt;Clicking scrolls to specific experience/education/skill (not just section)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UX Refinements&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auto-scroll only scrolls chat container (not entire page)&lt;/li&gt;
&lt;li&gt;Citations scroll to specific items with 100px offset&lt;/li&gt;
&lt;li&gt;Technology explanation panel educates judges on Agentic Postgres features&lt;/li&gt;
&lt;li&gt;Status badges clarify Active vs Demo features&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: Semantic vs Keyword Mismatch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; GitHub projects with explicit PHP/Laravel tech stacks weren't ranking high semantically for "What PHP experience does the candidate have?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Question uses "experience" (career language) while projects use "service", "platform" (product language). Semantic search prioritizes jobs over projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Hybrid search with 30% fulltext weight ensures exact keyword matches get boosted. Also increased result limit to 15 to capture more diverse sources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 2: Shallow Results
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Chat only returned 1-2 relevant experiences for technology-specific questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Root Cause:&lt;/strong&gt; Result limit (8) was too restrictive. Fulltext similarity threshold (0.1) filtered out many PHP mentions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased hybrid search limit from 8 to 15 results&lt;/li&gt;
&lt;li&gt;Created diagnostic tool (&lt;code&gt;debug-chat-search.js&lt;/code&gt;) to analyze search quality&lt;/li&gt;
&lt;li&gt;Validated improvement: 3 citations vs 1 originally&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For Full Production:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔗 Knowledge graph visualization - show relationships between skills/companies/projects&lt;/li&gt;
&lt;li&gt;🤝 Team collaboration - share candidate profiles with hiring teams&lt;/li&gt;
&lt;li&gt;🔒 Privacy controls - candidate decides what's public vs private&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lessons Learned:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hybrid search quality depends on: embedding coverage, similarity thresholds, scoring weights, result limits, and LLM synthesis behavior&lt;/li&gt;
&lt;li&gt;Diagnostic tooling is essential for optimizing search relevance&lt;/li&gt;
&lt;li&gt;UI should be information-dense for secondary information (chat citations)&lt;/li&gt;
&lt;li&gt;Semantic search captures meaning but can miss keyword-specific relevance when context differs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;SmartFolio demonstrates how &lt;strong&gt;TimescaleDB Cloud's Tiger Data&lt;/strong&gt; (pgvector + pg_trgm) enables sophisticated AI applications with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semantic understanding&lt;/strong&gt; - finds conceptually similar content&lt;br&gt;
&lt;strong&gt;Keyword precision&lt;/strong&gt; - ensures exact terms match&lt;br&gt;
&lt;strong&gt;Hybrid scoring&lt;/strong&gt; - balances both approaches&lt;br&gt;
&lt;strong&gt;Fluid storage&lt;/strong&gt; - instant searchability without schema changes&lt;br&gt;
&lt;strong&gt;Agent patterns&lt;/strong&gt; - specialized ingestion and query agents&lt;/p&gt;

&lt;p&gt;The result is a conversational interface that makes career portfolios &lt;strong&gt;queryable&lt;/strong&gt;, &lt;strong&gt;verifiable&lt;/strong&gt;, and &lt;strong&gt;grounded in actual data&lt;/strong&gt;—not hallucinated summaries.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt; &lt;a href="https://smartfolio.vercel.app/profile/shae" rel="noopener noreferrer"&gt;https://smartfolio.vercel.app/profile/shae&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/sbsmith86/smartfolio" rel="noopener noreferrer"&gt;https://github.com/sbsmith86/smartfolio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for the &lt;a href="https://dev.to/challenges/timescale"&gt;Agentic Postgres Challenge&lt;/a&gt; using TimescaleDB Cloud.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>agenticpostgreschallenge</category>
      <category>ai</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Nevertheless, Shae Bryant Smith Coded</title>
      <dc:creator>Shae Bryant Smith</dc:creator>
      <pubDate>Wed, 08 Mar 2017 12:44:11 +0000</pubDate>
      <link>https://forem.com/sbsmith86/nevertheless-shae-bryant-smith-coded</link>
      <guid>https://forem.com/sbsmith86/nevertheless-shae-bryant-smith-coded</guid>
      <description>&lt;h2&gt;
  
  
  I began coding because...
&lt;/h2&gt;

&lt;p&gt;I really hated writing papers and I loved math and science class so when my high school offered a Computer Science elective it felt like it was something I should try. This first language I learned was BASIC! Lol. I loved the rush of sitting over a problem for a long time and then finally figuring out the solution. I was hooked. &lt;/p&gt;

&lt;h2&gt;
  
  
  I'm currently hacking on...
&lt;/h2&gt;

&lt;p&gt;Learning React to build out a frontend for an admin service at work. I am really enjoying digging into this framework that I have wanted to learn for so long. &lt;/p&gt;

&lt;h2&gt;
  
  
  I'm excited about...
&lt;/h2&gt;

&lt;p&gt;React! learning it and the cool things we can build with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  My advice for other women who code is...
&lt;/h2&gt;

&lt;p&gt;Stick with it. Perseverance as a new dev learning how to code is critical to getting better. But also, perseverance, for the more experienced devs is critical to getting up that leadership ladder so that we can become more represent at all levels of tech. &lt;/p&gt;

</description>
      <category>wecoded</category>
    </item>
  </channel>
</rss>
